Android: How to move a BitmapDrawable?

☆樱花仙子☆ 提交于 2019-12-06 01:35:28

问题


I'm trying to move a BitmapDrawable in a custom view. It works fine with a ShapeDrawable as follows:

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

However, if I use a BitmapDrawable, the drawable's bounds change, the onDraw method is called, but the image stays where it is on the screen.

The following constructor will reproduce the problem by creating a BitmapDrawable instead:

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

How can I move a BitmapDrawable?


回答1:


The documentation for Drawable.getBounds() says the following:

Note: for efficiency, the returned object may be the same object stored in the drawable (though this is not guaranteed), so if a persistent copy of the bounds is needed, call copyBounds(rect) instead. You should also not change the object returned by this method as it may be the same object stored in the drawable.

This is not cristal clear but it looks like we must not change value returned by getBounds(), it fires some nasty side effects.

By using copyBounds() and setBounds() it works like a charm.

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

Another way of moving a Drawable could be to move the Canvas on wich you are drawing:

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


来源:https://stackoverflow.com/questions/5270639/android-how-to-move-a-bitmapdrawable

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!