gpt4 book ai didi

Android - 可绘制重复形状以创建图案

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:58:08 24 4
gpt4 key购买 nike

我需要创建一个图案来设置为某些View 的背景。我希望图案看起来像这样:

pattern

我不想将任何图像导入可绘制对象,而是想创建自己的形状、图层列表,最终目标是将图案作为背景。

是否可以在不导入任何外部图像的情况下实现这一点?

最佳答案

您可以通过创建自定义 View 并覆盖 onDraw() 来获得基于可绘制形状的重复图 block 的图案。

让我们首先将图 block 创建为由形状可绘制对象组成的图层列表,在本例中为黑白交替的正方形:

my_background.xml

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<layer-list>
<item >
<shape >
<solid android:color="#ffffff"/>
<size
android:height="8dp"
android:width="8dp"
/>
</shape>
</item>
<item android:left="4dp" android:top="4dp" android:bottom="0dp" android:right="0dp" >
<shape >
<solid android:color="#ff000000"/>
<size
android:height="4dp"
android:width="4dp"
/>

</shape>
</item>
<item android:left="0dp" android:top="0dp" android:bottom="4dp" android:right="4dp">
<shape>
<solid android:color="#ff000000"/>
<size
android:height="4dp"
android:width="4dp"
/>
</shape>
</item>
</layer-list>
</item>

您需要一个方法drawableToBitmap() 将tile 转换为像here 这样的位图。 .

覆盖 onDraw():

@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);
Drawable d = getResources().getDrawable(R.drawable.my_background);
if (d != null)
{
Bitmap b = drawableToBitmap(d);
BitmapDrawable bm = new BitmapDrawable(getResources(), b);
bm.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

bm.setBounds(canvas.getClipBounds());
bm.draw(canvas);
}
}

根据 View 的类型,您可能需要采取额外的步骤。

  • 对于扩展某种Layout 的自定义View,将android:background 属性设置为任何颜色以触发对onDraw()
  • 对于许多 View,将您的自定义 View 放置在另一个 View 下方可能更容易实现,同时性能更好>(例如作为 RelativeLayout 中的两个 child )并使大小匹配。
  • 如果您想从 ImageView 进行扩展,您需要在背景图案之上绘制前景可绘制对象。这种情况下,可以修改onDraw()如下:

onDraw() 保留前景可绘制对象:

@Override
protected void onDraw(Canvas canvas)
{
super.onDraw(canvas);

// preserve foreground drawable if there is one:
Drawable fd = getDrawable();

Drawable d = getResources().getDrawable(R.drawable.my_background);
if (d != null)
{
Bitmap b = drawableToBitmap(d);
BitmapDrawable bm = new BitmapDrawable(getResources(), b);
bm.setTileModeXY(Shader.TileMode.REPEAT, Shader.TileMode.REPEAT);

bm.setBounds(canvas.getClipBounds());
bm.draw(canvas);
}

if (fd == null)
return;

// set bounds as needed
fd.setBounds(0, 0, 100, 100);
fd.draw(canvas);
}

编辑

如上所述,在某些情况下(例如 TextViewProgressBar)您可能需要使用变通方法:

  • 使您的View 背景透明。
  • 使用图案作为背景创建自定义布局。
  • 在自定义布局中包裹View(将布局宽度和高度设置为wrap_content)。

关于Android - 可绘制重复形状以创建图案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36748149/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com