在画布上绘制时的XML可绘制比例

时间:2015-12-08 10:47:07

标签: android canvas drawable android-drawable xml-drawable

我正在尝试制作一个看起来像带阴影的圆圈。它需要扩展到不同的大小,需要在画布上绘制。我使用setBounds来设置坐标和比例。

我的绘画:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="0dp"
        android:left="5dp"
        android:right="5dp"
        android:top="10dp">
        <shape android:shape="oval">
            <size
                android:width="115dp"
                android:height="115dp" />
            <solid android:color="@color/level_button_dark" />
        </shape>
    </item>
    <item
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp">
        <shape android:shape="oval">
            <size
                android:width="115dp"
                android:height="115dp" />
            <solid android:color="@color/level_button" />
        </shape>
    </item>
</layer-list>

我的绘图代码

mButtonDrawable.setBounds(20, 20, 220, 220);
mButtonDrawable.draw(canvas);
mButtonDrawable.setBounds(270, 20, 370, 120);
mButtonDrawable.draw(canvas);
mButtonDrawable.setBounds(420, 20, 470, 70);
mButtonDrawable.draw(canvas);

结果:

enter image description here

我希望获得所有尺度的一致外观。 在模拟器api 18上测试。

2 个答案:

答案 0 :(得分:4)

虽然@RexSplode方法有效,但我找到了一种方法来实现一个drawable。你不应该调用setBounds()并使用canvas进行操作。

见下面的例子。

mButtonDrawable.setBounds(0, 0, mButtonDrawable.getIntrinsicWidth(), mButtonDrawable.getIntrinsicHeight());

canvas.save();
canvas.translate(20, 20);
canvas.scale(1, 1);
mButtonDrawable.draw(canvas);
canvas.restore();

canvas.save();
canvas.translate(420, 20);
canvas.scale(0.5f, 0.5f);
mButtonDrawable.draw(canvas);
canvas.restore();

canvas.save();
canvas.translate(620, 20);
canvas.scale(0.25f, 0.25f);
mButtonDrawable.draw(canvas);
canvas.restore();

结果:

enter image description here

我从ImageView source得到了一个想法。

答案 1 :(得分:0)

问题是你的圈子被绑定到相同的坐标。所以当你打电话时

public void setBounds (int left, int top, int right, int bottom)

它会改变坐标,其中要绘制两个圆,它们之间的距离也应该变小。所以我猜一个drawable不行。每个圆圈需要两个单独的绘图。并独立改变他们的界限。这就是你如何达到预期的效果。