Android 设置矩阵时如何停止图像缩放

Android 设置矩阵时如何停止图像缩放,android,imageview,ontouchlistener,touch-event,ontouch,Android,Imageview,Ontouchlistener,Touch Event,Ontouch,我正在拖动、移动、缩放和旋转我的图像,一切正常。但我有严重的问题,这是我的图像闪烁由于一些问题,并开始出现从屏幕顶部。首先让我展示我的代码我在做什么,然后我会告诉你 **我所做的** @Override public boolean onTouch(View v, MotionEvent event) { ImageView view = (ImageView) v; view.setImageMatrix(matrix); view

我正在拖动、移动、缩放和旋转我的图像,一切正常。但我有严重的问题,这是我的图像闪烁由于一些问题,并开始出现从屏幕顶部。首先让我展示我的代码我在做什么,然后我会告诉你

**我所做的**

 @Override
    public boolean onTouch(View v, MotionEvent event) {

        ImageView view = (ImageView) v;

        view.setImageMatrix(matrix);
        view.setScaleType(ImageView.ScaleType.MATRIX);



        float scale;

        // Dump touch event to log
       // dumpEvent(event1);

        // Handle touch events here...
        switch (event.getAction() & MotionEvent.ACTION_MASK) {
            case MotionEvent.ACTION_DOWN: //first finger down only
                savedMatrix.set(matrix);
                start.set(event.getX(), event.getY());
                Log.d(TAG, "mode=DRAG" );
                mode = DRAG;
                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);
                d = rotation(event);
                break;

            case MotionEvent.ACTION_UP: //first finger lifted
            case MotionEvent.ACTION_POINTER_UP: //second finger lifted
                mode = NONE;
                Log.d(TAG, "mode=NONE" );
                break;


            case MotionEvent.ACTION_MOVE:
                if (mode == DRAG) {
                    toggleSaveButtonState();

                    // ...
                    matrix.set(savedMatrix);
//                    matrix.postTranslate(event.getX() - start.x, event.getY()
//                            - start.y);

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


                    dx = event.getX() - start.x;
                    dy = event.getY() - start.y;
                    float newX = event.getX() - start.x;
                    Log.v("bounds out", "matrixsX=" + matrixX+ " dx" + dx);
                            //if image will go outside left bound
                    if (matrixX + dx < 0-width){
                        dx = -matrixX-width;


                        Log.v("bounds", "matrixsX=" + matrixX + " dx" + dx + " width" + width + "image width  = " + view.getWidth()/2);
//                        if (dx != -0.0) {
//
//                            //  dx=(float)-0.0;
//                        }}
                         }
                    //if image will go outside right bound
                    if (matrixX + dx + width > view.getWidth()) {
                        dx = view.getWidth() - matrixX - width;

                        Log.v("bounds", "matrixsX=" + matrixX + " dx" + dx + " width" + width + "image width  = " + view.getWidth());
                    }
                    //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);

                } else if (mode == ZOOM && event.getPointerCount() == 2) {
                    float newDist = spacing(event);
                    matrix.set(savedMatrix);
                    if (newDist > 10f) {
                        scale = newDist / oldDist;
                        float[] values = new float[9];
                        matrix.getValues(values);
                        float currentScale = values[Matrix.MSCALE_X];
                        if (scale * currentScale > MAX_ZOOM) {
                            scale = MAX_ZOOM / currentScale;
                        }
                        else if (scale * currentScale < MIN_ZOOM)
                        {   scale = MIN_ZOOM / currentScale;}

                        matrix.postScale(scale, scale, mid.x, mid.y);
                    }
                    if (lastEvent != null) {
                        newRot = rotation(event);
                        float r = newRot - d;
                        matrix.postRotate(r, view.getMeasuredWidth() / 2,
                                view.getMeasuredHeight() / 2);
                    }
                }
                break;

        }
        // Perform the transformation
        view.setImageMatrix(matrix);

        return true; // indicate event was handled

    }
@覆盖
公共布尔onTouch(视图v,运动事件){
ImageView视图=(ImageView)v;
视图.setImageMatrix(矩阵);
view.setScaleType(ImageView.ScaleType.MATRIX);
浮标;
//将触摸事件转储到日志
//dumpEvent(event1);
//在这里处理触摸事件。。。
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION_DOWN://仅首指向下
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
Log.d(标记“mode=DRAG”);
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
如果(旧区>10f){
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
}
lastEvent=新浮点[4];
lastEvent[0]=event.getX(0);
lastEvent[1]=event.getX(1);
lastEvent[2]=event.getY(0);
lastEvent[3]=event.getY(1);
d=旋转(事件);
打破
case MotionEvent.ACTION_UP://举起第一个手指
case MotionEvent.ACTION\u POINTER\u UP://举起食指
模式=无;
Log.d(标记“mode=NONE”);
打破
case MotionEvent.ACTION\u移动:
如果(模式==拖动){
切换SaveButtonState();
// ...
矩阵集(savedMatrix);
//postTranslate(event.getX()-start.x,event.getY())
//-start.y);
矩阵。获取值(矩阵值);
matrixX=matrixValues[2];
矩阵x=矩阵x值[5];
宽度=矩阵值[0]*((视图).getDrawable()
.getIntrinsicWidth()/2));
高度=矩阵值[4]*((视图).getDrawable()
.getIntrinsicHeight()/2));
dx=event.getX()-start.x;
dy=event.getY()-start.y;
float newX=event.getX()-start.x;
Log.v(“界限”、“矩阵x=“+matrixX+”dx“+dx”);
//如果图像将超出左边界
if(矩阵xx+dx<0-宽度){
dx=-matrixX宽度;
Log.v(“bounds”,“matrixsX=“+matrixX+”dx“+dx+”width“+width+”image width=“+view.getWidth()/2”);
//如果(dx!=-0.0){
//
////dx=(浮点)-0.0;
//                        }}
}
//如果图像将超出右边界
if(matrixX+dx+width>view.getWidth()){
dx=view.getWidth()-matrixX-width;
Log.v(“bounds”,“matrixsX=“+matrixX+”dx“+dx+”width“+width+”image width=“+view.getWidth());
}
//如果图像将超出顶部边界
if(矩阵y+dy<0){
dy=-矩阵;
}
//如果图像将超出底部边界
if(矩阵y+dy+height>view.getHeight()){
dy=view.getHeight()-matrixY-height;
}
矩阵后翻译(dx,dy);
}else if(mode==ZOOM&&event.getPointerCount()==2){
float newDist=间距(事件);
矩阵集(savedMatrix);
如果(新距离>10f){
比例=新距离/旧距离;
浮点[]值=新浮点[9];
矩阵。获取值(值);
float currentScale=值[Matrix.MSCALE_X];
如果(缩放*当前缩放>最大缩放){
比例=最大缩放/当前比例;
}
else if(缩放*当前缩放<最小缩放)
{scale=MIN_ZOOM/currentScale;}
矩阵。后标度(标度、标度、中x、中y);
}
if(lastEvent!=null){
newRot=旋转(事件);
浮点数r=newRot-d;
matrix.postRotate(r,view.getMeasuredWidth()/2,
view.getMeasuredHeight()/2);
}
}
打破
}
//执行转换
视图.setImageMatrix(矩阵);
返回true;//指示事件已处理
}
这段代码我想你几乎可以在每一个地方找到,我稍微更新了一下,增加了一些限制,比如离开屏幕等等

**问题**

当我启动我的应用程序时,我希望它显示在底部,但有些时候它会粘在中间,当我触摸它弹出的图像视图时,它看起来像是从上角开始自己启动,然后下降到我们触摸它的位置,在某些设备上它会变大,在某些设备上会变小

我想这是因为这条线

view.setScaleType(ImageView.ScaleType.MATRIX)

如果我删除这一行并将其放入xml中,例如

android:scaleType=“矩阵”

然后我的图像粘在上面,我不知道