Android: как переместить BitmapDrawable? - PullRequest
6 голосов
/ 11 марта 2011

Я пытаюсь переместить 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 Ответ

11 голосов
/ 11 марта 2011

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

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

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