Прямоугольник не нарисован в его исходных координатах

Я столкнулся с проблемой при создании CustomView, который рисует прямоугольник и может изменить его размеры по углам.

Ниже мой код.

public class CustomView extends View {
    Canvas canvas;
    private Context mContext;
    private Rect rectObj;
    private Paint rectPaint;
    private Matrix transform;
    public CustomView(Context context) {
        super(context);
        mContext = context;
        initView();
    }
    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        initView();
    }
    public CustomView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public void initView() {
        rectPaint = new Paint();
        rectPaint.setColor(Color.parseColor("#55000000"));

        setFocusable(true); // necessary for getting the touch events
        canvas = new Canvas();
        // setting the start point for the balls

        rectObj = new Rect(100, 100, 200, 200);

        // Create a matrix to do rotation
        transform = new Matrix();
    }

    @Override
    public void onDraw(Canvas canvas) {
        // This is an easy way to apply the same transformation (e.g.
        // rotation)
        // To the complete canvas.
        canvas.setMatrix(transform);

        // With the Canvas being rotated, we can simply draw
        // All our elements (Rect and Point)
        canvas.drawRect(rectObj, rectPaint);
    }
}

Когда я запускаю эту программу, приходит следующий вывод.

Как показано на рисунке, мои "Прямоугольник" в верхнем левом углу составляют 100,100, но когда я касаюсь "левого верхнего угла прямоугольника" на экране, xy составляют 150,76 или что-то, что не совпадает с исходным рисунком.

Я должен использовать canvas.setMatrix(transform), чтобы повернуть этот прямоугольник на следующем этапе.
Что не так в этом коде?

1 ответ

Решение

В методе onDraw(Canvas canvas) одна вещь, которую вы должны сделать, это вызвать метод super.onDraw(cavas)после этого вместо того, чтобы делать 'canvas.setMatrix(transform);' вы должны сделать 'canvas.concat(transform);' потому что холст имеет начальный Matrix с некоторыми значениями сохранены. Кроме того, если вам просто нужно повернуть или перевести этот прямоугольник, вы можете повернуть и перевести холст, выполнив canvas.rotate(degree) например.

Другие вопросы по тегам