Android:如何移动BitmapDrawable?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (87)

我正试图在自定义视图中移动BitmapDrawableShapeDrawable工作正常如下:

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();
    }
}

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

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

public MyView() {
    image = getResources().getDrawable(R.drawable.image);
    image.setBounds(0, 0, 100, 100);
}
提问于
用户回答回答于

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的另一种方法是将Canvas移动到你绘制的位置:

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

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励