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=“矩阵”
然后我的图像粘在上面,我不知道