将图层列表转换为位图可能不起作用
Convert layer-list to bitmap not working probably
我尝试将 layer-list
转换为 bitmap
,然后将此 bitmap
设置为 ImageView
的背景,但它不起作用
这是一个测试项目。我知道我可以直接将 drawable 设置为 ImageView,但我想知道为什么当我将 LayerDrawable
转换为 Bitmap
然后将 Bitmap
转换为 BitmapDrawable
然后将其设置为 ImageView 的背景, 看起来会不一样
这是我的图层列表 (ic_circle.xml)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
>
<item>
<shape
android:shape="oval">
<solid android:color="#f00"></solid>
</shape>
</item>
<item
android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp">
<shape
android:shape="oval">
<solid android:color="#ff0"></solid>
</shape>
</item>
<item
android:bottom="6dp" android:left="6dp" android:right="6dp" android:top="6dp">
<shape
android:shape="oval">
<solid android:color="#0ff"></solid>
</shape>
</item>
</layer-list>
Activity代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bm = drawableToBitmap(ContextCompat.getDrawable(this, R.drawable.ic_circle));
img.setBackground(new BitmapDrawable(bm));
}
public Bitmap drawableToBitmap (Drawable drawable) {
int width = drawable.getIntrinsicWidth();
width = width > 0 ? width : 1;
int height = drawable.getIntrinsicHeight();
height = height > 0 ? height : 1;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
Xml代码
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/ic_circle"
/>
<ImageView
android:id="@+id/img"
android:layout_marginTop="40dp"
android:layout_width="80dp"
android:layout_height="80dp"
/>
</LinearLayout>
在模拟器中,您会看到第二张图片与第一张图片不同
在您的可绘制对象中,您只定义了 2 个外部小圆圈(黄色和红色)的边界,蓝色圆圈应该 其余 space .但由于它没有定义大小,一旦你在 canvas 上绘制它,它的大小将为 0。
如果你想直接在位图上绘制它,你也必须定义它的大小。
我尝试将 layer-list
转换为 bitmap
,然后将此 bitmap
设置为 ImageView
的背景,但它不起作用
这是一个测试项目。我知道我可以直接将 drawable 设置为 ImageView,但我想知道为什么当我将 LayerDrawable
转换为 Bitmap
然后将 Bitmap
转换为 BitmapDrawable
然后将其设置为 ImageView 的背景, 看起来会不一样
这是我的图层列表 (ic_circle.xml)
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android"
>
<item>
<shape
android:shape="oval">
<solid android:color="#f00"></solid>
</shape>
</item>
<item
android:bottom="3dp" android:left="3dp" android:right="3dp" android:top="3dp">
<shape
android:shape="oval">
<solid android:color="#ff0"></solid>
</shape>
</item>
<item
android:bottom="6dp" android:left="6dp" android:right="6dp" android:top="6dp">
<shape
android:shape="oval">
<solid android:color="#0ff"></solid>
</shape>
</item>
</layer-list>
Activity代码
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView img = (ImageView) findViewById(R.id.img);
Bitmap bm = drawableToBitmap(ContextCompat.getDrawable(this, R.drawable.ic_circle));
img.setBackground(new BitmapDrawable(bm));
}
public Bitmap drawableToBitmap (Drawable drawable) {
int width = drawable.getIntrinsicWidth();
width = width > 0 ? width : 1;
int height = drawable.getIntrinsicHeight();
height = height > 0 ? height : 1;
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
}
}
Xml代码
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<ImageView
android:layout_width="80dp"
android:layout_height="80dp"
android:background="@drawable/ic_circle"
/>
<ImageView
android:id="@+id/img"
android:layout_marginTop="40dp"
android:layout_width="80dp"
android:layout_height="80dp"
/>
</LinearLayout>
在模拟器中,您会看到第二张图片与第一张图片不同
在您的可绘制对象中,您只定义了 2 个外部小圆圈(黄色和红色)的边界,蓝色圆圈应该 其余 space .但由于它没有定义大小,一旦你在 canvas 上绘制它,它的大小将为 0。
如果你想直接在位图上绘制它,你也必须定义它的大小。