Android: как переместить BitmapDrawable?

Я пытаюсь переместить 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, границы drawable изменяются,onDraw вызывается метод, но изображение остается там, где оно находится на экране.

следующий конструктор будет воспроизводить проблему, создавая вместо этого BitmapDrawable:

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

как я могу переместить BitmapDrawable?

1 ответов


документация Drawable.getBounds () говорит следующее:

Примечание: Для эффективности, возвращенное объект может быть тем же объектом, который хранится в drawable (хотя это не гарантировано), так что если постоянная копия границы необходимы, вызовите вместо этого copyBounds (rect). Вы должны также не изменить объект, возвращаемый этот метод, как это может быть то же самое объект, хранящийся в папке drawable.

это не cristal ясно, но похоже, что мы не должен изменить значение, возвращаемое 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();
}

другой способ перемещения a Drawable может перейти в холст на котором вы рисуете:

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