在移动和缩放时绘制到ImageView

问题描述 投票:0回答:1

如果 ImageView 是 fitXY 而不是矩阵,则每个绘制的像素都是正确的。

但是我需要一个矩阵视图,您可以在其中缩放和移动图片,并在其顶部标记图片上的内容。

这里存在的问题是,如果图片被移动或实际缩放,则图像上绘制的像素不正确。

所以现在我的问题是如何以及在哪里为每种情况构建 event.getX 和 event.getY 公式来解决这个问题?

谢谢您的帮助!

代码:

@SuppressLint({"ClickableViewAccessibility", "SetTextI18n"})
    public boolean onTouch(View v, MotionEvent event) {
        // handle touch events here
        ImageView view = (ImageView) v;
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            then = (long) System.currentTimeMillis();
            cx = event.getX();
            cy = event.getY();
        }

        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN:
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                mode = DRAG;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                oldDist = spacing(event);
                if (oldDist > 10f) {
                   savedMatrix.set(matrix);
                    midPoint(mid, event);
                    mode = ZOOM;
               }
                lastEvent = new float[4];
                lastEvent[0] = event.getX(0);
                lastEvent[1] = event.getX(1);
                lastEvent[2] = event.getY(0);
                lastEvent[3] = event.getY(1);
               break;
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                   matrix.set(savedMatrix);
                    float dx = event.getX() - start.x;
                    float dy = event.getY() - start.y;
                   matrix.postTranslate(dx, dy);
               }
                else if (mode == ZOOM) {
                    float newDist = spacing(event);
                    if (newDist > 10f) {
                        matrix.set(savedMatrix);
                        float scale = (newDist / oldDist);
                        matrix.postScale(scale, scale, mid.x, mid.y);

                }
                    float[] values = new float[9];
                    matrix.getValues(values);
                    float scaleX = values[Matrix.MSCALE_X];
                    float scaleY = values[Matrix.MSCALE_Y];

                    if(scaleX <= 1f) {
                        matrix.postScale((1f)/scaleX, (1f)/scaleY, mid.x, mid.y);
                    } else if(scaleX >= 3) {
                        matrix.postScale((3f)/scaleX, (3f)/scaleY, mid.x, mid.y);
                    }
                }
                break;
            case MotionEvent.ACTION_UP:
                int longClickDuration = 2000;
                if ((System.currentTimeMillis() - then) > longClickDuration) {
                    if (pictureadded) {
                    txtQueen.setText("Queens:");
                    countQueen.setText(String.valueOf(queencount));
                    txtWorker.setText("Workers:");
                    countWorker.setText(String.valueOf(workercount));
                    txtBrut.setText("Brut:");
                    countBrut.setText(String.valueOf(brutcount));

                    Bitmap bitmap = imgGallery.getDrawingCache();

                    Canvas canvas = new Canvas(bitmap);
                    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);

                        if (queensselected) {
                            queencount++;
                            countQueen.setText(String.valueOf(queencount));
                            paint.setColor(Color.YELLOW);
                            canvas.drawCircle(cx, cy, 10, paint);
                            imgGallery.setImageBitmap(bitmap);

                        }
                        if (workersselected) {
                            workercount++;
                            countWorker.setText(String.valueOf(workercount));
                            paint.setColor(Color.RED);
                            canvas.drawCircle(cx, cy, 10, paint);
                            imgGallery.setImageBitmap(bitmap);
                        }
                        if (brutselected) {
                            brutcount++;
                            countBrut.setText(String.valueOf(brutcount));
                            paint.setColor(Color.WHITE);
                            canvas.drawCircle(cx, cy, 10, paint);
                            imgGallery.setImageBitmap(bitmap);
                        }
                        return false;
                    }
                }
                break;
        }

        view.setImageMatrix(matrix);

        Bitmap bmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.RGB_565);
        Canvas canvas = new Canvas(bmap);
        view.draw(canvas);
        return true;
    }

// --Commented out by Inspection START (06.07.2023 19:41):
//    public void ButtonClick(){
//
//        fin.setImageBitmap(bmap);
//    }
// --Commented out by Inspection STOP (06.07.2023 19:41)
    /**
     * Determine the space between the first two fingers
     */
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        float s=x * x + y * y;
        return (float)Math.sqrt(s);
    }

    /**
     * Calculate the mid point of the first two fingers
     */
    private void midPoint(PointF point, MotionEvent event) {
        float x = event.getX(0) + event.getX(1);
        float y = event.getY(0) + event.getY(1);
        point.set(x / 2, y / 2);
    }

不多。我尝试了一些普通的运算符。

android imageview zooming draw move
1个回答
0
投票

我通过添加以下内容找到了解决方案:

// calculate inverse matrix
Matrix inverse = new Matrix();
imgGallery.getImageMatrix().invert(inverse);
float[] touchPoint = new float[] {event.getX(), event.getY()};
inverse.mapPoints(touchPoint);

并致电

drawCanvas.drawCircle(touchPoint[0], touchPoint[1], 10, paint);
imgGallery.setImageBitmap(bitmap);
© www.soinside.com 2019 - 2024. All rights reserved.