使用新位图更新 ImageView 会重置矩阵

Updating ImageView with a new Bitmap resets the matrix

我正在尝试在 imageView 中自由转换位图。

我有带 MATRIX scaletype 和 width 和 height match_parent

的 ImageView

这是我的触摸监听器代码

以下是我的触摸代码

public class Touch implements OnTouchListener 
{
    // These matrices will be used to move and zoom image
    public Matrix matrix = new Matrix();
    Matrix savedMatrix = new Matrix();

    // We can be in one of these 3 states
    static final int NONE = 0;
    static final int DRAG = 1;
    static final int ZOOM = 2;
    int mode = NONE;

    // Remember some things for zooming
    PointF start = new PointF();
    PointF mid = new PointF();
    float oldDist = 1f;

    float[] lastEvent = null;
    float d = 0f;
    float newRot = 0f;

    private float dx; // postTranslate X distance
    private float dy; // postTranslate Y distance
    private float[] matrixValues = new float[9];
    float matrixX = 0; // X coordinate of matrix inside the ImageView
    float matrixY = 0; // Y coordinate of matrix inside the ImageView
    float width = 0; // width of drawable
    float height = 0; // height of drawable

    View mainView; 
    @Override
    public boolean onTouch(View v, MotionEvent event) 
    {
        ImageView view = (ImageView) v;    

        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;
                }

            break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_POINTER_UP:
                mode = NONE;
                lastEvent = null;
                break;
            case MotionEvent.ACTION_MOVE:
            if (mode == DRAG) 
            {
                matrix.set(savedMatrix);

                matrix.getValues(matrixValues);
                matrixX = matrixValues[2];
                matrixY = matrixValues[5];
                width = matrixValues[0] * (((ImageView) view).getDrawable()
                                        .getIntrinsicWidth());
                height = matrixValues[4] * (((ImageView) view).getDrawable()
                                        .getIntrinsicHeight());

                dx = event.getX() - start.x;
                dy = event.getY() - start.y;

                //if image will go outside left bound
                if (matrixX + dx < 0){
                    dx = -matrixX;
                }
                //if image will go outside right bound
                if(matrixX + dx + width > view.getWidth()){
                    dx = view.getWidth() - matrixX - width;
                }
                //if image will go oustside top bound
                if (matrixY + dy < 0){
                    dy = -matrixY;
                }
                //if image will go outside bottom bound
                if(matrixY + dy + height > view.getHeight()){
                    dy = view.getHeight() - matrixY - height;
                }
                matrix.postTranslate(dx, dy);   
            } 

            break;
        }

        view.setImageMatrix(matrix);
        return true; // indicate event was handled
    }

    public void updateValues(ImageView view)
    {
        matrix = view.getImageMatrix();
        matrix.postTranslate(dx, dy);  
        view.setImageMatrix(matrix);
    }

    /** Determine the space between the first two fingers */
    @SuppressLint("FloatMath")
    private float spacing(MotionEvent event) {
        float x = event.getX(0) - event.getX(1);
        float y = event.getY(0) - event.getY(1);
        return FloatMath.sqrt(x * x + y * y);
    }

}

它工作完美,但是当我尝试附加另一个位图时,它失去了当前位置并且位图移动到其原始 0,0 状态。但是,如果我调用 updateValues(ImageView view) 设置位图后,它会保留其当前拖动的位置。但是当我再次尝试拖动时它突然变为 0,0

我该如何解决这个问题。我希望新位图从与之前相同的位置开始

另外,如何设置图像首先出现在中心位置,目前它显示在左上角

试试这个让它以负载为中心

vTranslate.x = (getWidth()/2) - (scale * (sWidth()/2));
vTranslate.y = (getHeight()/2) - (scale * (sHeight()/2));