如何在使用双指缩放和拖动动作,以保持内部的屏幕范围的图像? [英] How to keep an image inside the screen limits while using pinch zoom and drag gestures?
本文介绍了如何在使用双指缩放和拖动动作,以保持内部的屏幕范围的图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我建立一个使用双指缩放和拖动一个应用程序。问题是,现在我可以拖动图片出来的界定。我想知道我怎么可以使用拖放并确保图像在屏幕上停留在同一时间。
下面是我的code:
公共布尔onTouch(视图V,MotionEvent事件){
ImageView的观点=(ImageView的)V;
//这里处理触摸事件。
开关(event.getAction()及MotionEvent.ACTION_MASK){
案例MotionEvent.ACTION_DOWN:
savedMatrix.set(矩阵);
start.set(event.getX(),event.getY());
Log.d(TAG模式= DRAG);
模式=阻力;
打破;
案例MotionEvent.ACTION_POINTER_DOWN:
oldDist =间距(事件);
Log.d(TAG,oldDist =+ oldDist);
如果(oldDist> 10F){
savedMatrix.set(矩阵);
中点(中,事件);
模式=变焦;
Log.d(TAG模式= ZOOM);
}
打破;
案例MotionEvent.ACTION_UP:
案例MotionEvent.ACTION_POINTER_UP:
模式=无;
Log.d(TAG模式= NONE);
打破;
案例MotionEvent.ACTION_MOVE:
如果(模式==拖动){
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
否则,如果(模式==变焦){
浮法newDist =间距(事件);
Log.d(TAG,newDist =+ newDist);
如果(newDist> 10F){
matrix.set(savedMatrix);
浮规模= newDist / oldDist;
矩阵临时=新的Matrix();
temp.set(矩阵);
temp.postScale(规模化,规模化,mid.x,mid.y);
浮动[] F =新的浮动[9];
temp.getValues(F);
浮xScale等= F [0];
如果(xScale等> = 1&安培;&安培; xScale等&其中; = 10){
matrix.postScale(规模化,规模化,mid.x,mid.y);
savedMatrixZoom.set(矩阵);
}其他{
matrix.set(savedMatrixZoom);
}
}
打破;
}
} //执行转换。
view.setImageMatrix(矩阵);
返回true; //表示事件已经被处理
}
解决方案
为什么不抢的屏幕尺寸,并检查MotionEvent坐标中,这些更新你的矩阵前?
喜欢的东西..
DisplayMetrics displaymetrics =新DisplayMetrics();
。getWindowManager()getDefaultDisplay()getMetrics(displaymetrics)。
INT screenHight = displaymetrics.heightPixels;
INT屏幕宽度= displaymetrics.widthPixels;
...
案例MotionEvent.ACTION_MOVE:
如果(模式==拖动){
INT下一页末= event.getX() - start.x;
INT newY = event.getY() - start.y;
如果((下一页末< = 0 ||下一页末> =屏幕宽度)||
(newY< = 0 || newY> = screenHeight))
打破;
matrix.set(savedMatrix);
matrix.postTranslate(下一页末,newY);
}
...
I'm building an app that uses the pinch zoom and drag. The problem is that for now I can drag the picture out of it bounds. I wanted to know how can I use drag and make sure the image stays on the screen at the same time.
Here is my code :
public boolean onTouch(View v, MotionEvent event) {
ImageView view = (ImageView)v;
//handle touch events here.
switch (event.getAction() & MotionEvent.ACTION_MASK) {
case MotionEvent.ACTION_DOWN:
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);
Log.d(TAG, "oldDist=" + oldDist);
if (oldDist > 10f) {
savedMatrix.set(matrix);
midPoint(mid, event);
mode = ZOOM;
Log.d(TAG, "mode=ZOOM" );
}
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
mode = NONE;
Log.d(TAG, "mode=NONE" );
break;
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
matrix.set(savedMatrix);
matrix.postTranslate(event.getX() - start.x,
event.getY() - start.y);
}
else if (mode == ZOOM) {
Float newDist = spacing(event);
Log.d(TAG, "newDist=" + newDist);
if (newDist > 10f) {
matrix.set(savedMatrix);
Float scale = newDist / oldDist;
Matrix temp = new Matrix();
temp.set(matrix);
temp.postScale(scale, scale, mid.x, mid.y);
float[] f = new float[9];
temp.getValues(f);
Float xScale = f[0];
if(xScale >= 1 && xScale <= 10){
matrix.postScale(scale, scale, mid.x, mid.y);
savedMatrixZoom.set(matrix);
}else{
matrix.set(savedMatrixZoom);
}
}
break;
}
} //perform the transformation.
view.setImageMatrix(matrix);
return true; // indicate event was handled
}
解决方案
Why not grab the dimensions of the screen and check the MotionEvent coordinates are within these before updating your matrix?
Something like..
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int screenHight = displaymetrics.heightPixels;
int screenWidth = displaymetrics.widthPixels;
...
case MotionEvent.ACTION_MOVE:
if (mode == DRAG) {
int newX = event.getX() - start.x;
int newY = event.getY() - start.y;
if ( (newX <= 0 || newX >= screenWidth) ||
(newY <= 0 || newY >= screenHeight) )
break;
matrix.set(savedMatrix);
matrix.postTranslate(newX, newY);
}
...
这篇关于如何在使用双指缩放和拖动动作,以保持内部的屏幕范围的图像?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文