Изменить координаты RectF после поворота холста - PullRequest
3 голосов
/ 11 января 2020

Я использовал этот код для рисования текста по вертикали.

RectF rectF2 = new RectF();
matrix.mapRect(rectF2, bounds);
canvas.save();
canvas.rotate(90, rectF2.right, rectF2.top);
canvas.drawText(text, rectF2.left, rectF2.bottom, mTextPaint);
canvas.restore();

Это хорошо работает, но я также хочу изменить координаты. Потому что позже я нажимаю на объект и делаю перетаскивание.

Теперь проблема в том, что, как вы видите на следующем рисунке, координаты отображаются в виде прямоугольника. Поэтому, когда я нажимаю на эту прямоугольную область, можно перемещаться только по тексту на холсте.

Итак, я хочу повернуть исходные координаты и при вращении холста. Я пытался matrix.setRotate Но я не могу добиться того, чего хочу.

enter image description here

Ответы [ 2 ]

0 голосов
/ 23 января 2020

В onDraw () вы можете преобразовать свой холст, используя матрицу. А в onTouch () вы можете преобразовать обратно экранные координаты, используя обратную матрицу.

private static class MyView extends View {

    private final Paint texPaint = new Paint(){{
        setTextSize(60);
        setColor(Color.BLACK);
    }};

    private final Paint rectPaint = new Paint(){{
        setStrokeWidth(20);
        setColor(Color.RED);
        setStyle(Paint.Style.STROKE);
    }};

    private final Matrix matrix = new Matrix();

    private final RectF rect = new RectF(0, 0, 400, 150);

    public MyView(Context context) {
        super(context);
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        matrix.reset();
        matrix.postRotate(45);
        matrix.postScale(1.5f, 1.5f, 0, 0);
        matrix.postTranslate(w/2, h/2);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.concat(matrix);
        canvas.drawRect(rect, rectPaint);
        //Bottom line of the drawn text is at y, if you want the text to inside the rect
        // increase the y by the text height, textHeight is the textSize
        canvas.drawText("SomeText", 0, texPaint.getTextSize(), texPaint);
        canvas.restore();
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getActionMasked() == MotionEvent.ACTION_UP) {
            float x = event.getX();
            float y = event.getY();
            Toast.makeText(getContext(), isInsideRegion(x, y) ? "Inside" : "Outside", Toast.LENGTH_SHORT).show();
        }
        return true;
    }

    private boolean isInsideRegion(float x, float y) {
        Matrix invertedMatrix = new Matrix();
        if (!matrix.invert(invertedMatrix)) {
            throw new RuntimeException("Matrix can't be inverted");
        }
        float[] point = {x, y};
        invertedMatrix.mapPoints(point);
        return rect.contains(point[0], point[1]);
    }

}
0 голосов
/ 11 января 2020

Что ж, если вы хотите перетащить объекты в этом представлении, вам, вероятно, нужно создать ViewGroup и разместить объекты как представления. Поскольку все ваши объекты нарисованы на холсте, вы не можете их тащить и перетаскивать.

Вы можете вращать, переводить и изменять размеры видов, а также перехватывать сенсорные события на них для выполнения перетаскивания.

Ваше решение работает только как изображение с текстом, и, если я вас правильно понимаю, вы можете ' делай с ними что хочешь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...