Android:如何移动BitmapDrawable?

时间:2011-03-11 08:33:38

标签: android animation drawable

我正在尝试在自定义视图中移动BitmapDrawable。它适用于ShapeDrawable,如下所示:

public class MyView extends View {
    private Drawable image;

    public MyView() {
        image = new ShapeDrawable(new RectShape());
        image.setBounds(0, 0, 100, 100);
        ((ShapeDrawable) image).getPaint().setColor(Color.BLACK);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        image.draw(canvas);
    }

    public void move(int x, int y) {
        Rect bounds = image.getBounds();
        bounds.left += x;
        bounds.right += x;
        bounds.top += y;
        bounds.bottom += y;
        invalidate();
    }
}

但是,如果我使用BitmapDrawable,可绘制的边界会发生变化,则会调用onDraw方法,但图像会保留在屏幕上的位置。

以下构造函数将通过创建BitmapDrawable来重现该问题:

public MyView() {
    image = getResources().getDrawable(R.drawable.image);
    image.setBounds(0, 0, 100, 100);
}

如何移动BitmapDrawable

1 个答案:

答案 0 :(得分:11)

Drawable.getBounds()的文档说明如下:

  注意:为了效率,退回   对象可以是存储的同一对象   在drawable(虽然这不是   保证),所以如果是持久副本   需要边界,请致电   copyBounds(rect)代替。你应该   也不会改变返回的对象   这个方法可能是一样的   存储在drawable中的对象。

这不是cristal clear,但看起来我们必须更改 getBounds()返回的值,它会引发一些令人讨厌的副作用。

通过使用 copyBounds() setBounds(),它就像魅力一样。

public void move(int x, int y) {
    Rect bounds = image.copyBounds();
    bounds.left += x;
    bounds.right += x;
    bounds.top += y;
    bounds.bottom += y;
    image.setBounds(bounds);
    invalidate();
}

移动 Drawable 的另一种方法是将画布移动到您正在绘制的位置:

@Override
protected void onDraw(Canvas canvas) {
    canvas.translate(x, y);
    image.draw(canvas);
}