将图层列表转换为位图无法正常工作

时间:2016-12-12 08:44:06

标签: android bitmap layer-list

我尝试将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>

活动代码

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>

在模拟器中,您将看到第二个图像与第一个图像不同

enter image description here

1 个答案:

答案 0 :(得分:2)

在您的drawable中,您只定义了2个外部小圆圈(黄色和红色)的边界,而蓝色部分应该所有剩余空间。但由于它没有定义的大小,一旦你在画布上绘制它,它的大小将为0.

如果你想直接在位图上绘制它,你必须定义它的大小。