在Android上的双指缩放比例限制 [英] Scale limits on pinch zoom of android
本文介绍了在Android上的双指缩放比例限制的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
如何设置最大和最小缩放级别捏缩放?
下面是我的code: //
公共类TouchImageView扩展ImageView的{
私有静态最后字符串变量=触摸;
//这些矩阵将用于移动和放大图像
字模=新的Matrix();
矩阵savedMatrix =新的Matrix();
静态PinchZoomExample sPinchZoomExample = NULL;
//我们可以在这3个状态之一
静态最终诠释无= 0;
静态最终诠释DRAG = 1;
静态最终诠释ZOOM = 2;
INT模式=无;
静态位图sCurrentImage;
//记住一些东西放大
的PointF开始=新的PointF();
的PointF中期=新的PointF();
浮oldDist = 1F;
上下文语境;
公共TouchImageView(上下文的背景下){
超(上下文);
super.setClickable(真正的);
this.context =背景;
matrix.setTranslate(1F,1F);
setImageMatrix(矩阵);
setScaleType(ScaleType.MATRIX);
setOnTouchListener(新OnTouchListener(){
@覆盖
公共布尔onTouch(视图V,MotionEvent rawEvent){
WrapMotionEvent事件= WrapMotionEvent.wrap(rawEvent);
//转储触摸事件日志
/ *如果(Viewer.isDebug ==真){
dumpEvent(事件);
} * /
//这里处理触摸事件...
开关(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:
INT xDiff =(INT)Math.abs(event.getX() - start.x);
INT yDiff =(INT)Math.abs(event.getY() - start.y);
如果(xDiff&所述8安培;&安培; yDiff&所述; 8){
performClick();
sPinchZoomExample.displayGallery();
}
案例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.postScale(规模化,规模化,mid.x,mid.y);
//帆布油画=新的Canvas();
//位图BM = Bitmap.createBitmap(sCurrentImage,0,0,sCurrentImage.getWidth()
//,sCurrentImage.getHeight(),矩阵,真正的);
Log.d(尺度,规模=+规模++的getWidth()++的getHeight());
//bm.recycle();
}
}
打破;
}
setImageMatrix(矩阵);
返回true; //表示事件已经被处理
}
});
}
公共无效setImage(位图BM,诠释displayWidth,INT displayHeight,PinchZoomExample PZE){
super.setImageBitmap(BM);
sCurrentImage = BM;
sPinchZoomExample = PZE;
//适应屏幕。
浮规模;
如果((displayHeight / bm.getHeight())> =(displayWidth / bm.getWidth())){
规模=(浮点)displayWidth /(浮点)bm.getWidth();
} 其他 {
规模=(浮点)displayHeight /(浮点)bm.getHeight();
}
savedMatrix.set(矩阵);
matrix.set(savedMatrix);
matrix.postScale(规模化,规模化,mid.x,mid.y);
setImageMatrix(矩阵);
//中心图像
浮动redundantYSpace =(浮点)displayHeight - (规模*(浮点)bm.getHeight());
浮动redundantXSpace =(浮点)displayWidth - (规模*(浮点)bm.getWidth());
redundantYSpace / =(浮点)2;
redundantXSpace / =(浮点)2;
savedMatrix.set(矩阵);
matrix.set(savedMatrix);
matrix.postTranslate(redundantXSpace,redundantYSpace); //matrix.postTranslate(50,50);
setImageMatrix(矩阵);
}
/ **确定第一两个手指之间的空间* /
私人浮动间距(WrapMotionEvent事件){
// ...
浮X = event.getX(0) - event.getX(1);
浮Y = event.getY(0) - event.getY(1);
返回FloatMath.sqrt(X * X + Y * Y);
}
/ **计算前两个手指的中点* /
私人无效中点(的PointF点,WrapMotionEvent事件){
// ...
浮X = event.getX(0)+ event.getX(1);
浮Y = event.getY(0)+ event.getY(1);
point.set(X / 2,Y / 2);
}
}
解决方案
私有静态最终浮动MIN_ZOOM = 1.0F;
私有静态最终浮动MAX_ZOOM = 5.0F;
规模= Math.max(MIN_ZOOM,Math.min(规模,MAX_ZOOM));
How to set Max and Min zoom levels for Pinch-Zoom?
Here is my code: //
public class TouchImageView extends ImageView {
private static final String TAG = "Touch";
// These matrices will be used to move and zoom image
Matrix matrix = new Matrix();
Matrix savedMatrix = new Matrix();
static PinchZoomExample sPinchZoomExample = null;
// 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;
static Bitmap sCurrentImage;
// Remember some things for zooming
PointF start = new PointF();
PointF mid = new PointF();
float oldDist = 1f;
Context context;
public TouchImageView(Context context) {
super(context);
super.setClickable(true);
this.context = context;
matrix.setTranslate(1f, 1f);
setImageMatrix(matrix);
setScaleType(ScaleType.MATRIX);
setOnTouchListener(new OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent rawEvent) {
WrapMotionEvent event = WrapMotionEvent.wrap(rawEvent);
// Dump touch event to log
/* if (Viewer.isDebug == true){
dumpEvent(event);
}*/
// 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:
int xDiff = (int) Math.abs(event.getX() - start.x);
int yDiff = (int) Math.abs(event.getY() - start.y);
if (xDiff < 8 && yDiff < 8){
performClick();
sPinchZoomExample.displayGallery();
}
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.postScale(scale, scale, mid.x, mid.y);
//Canvas canvas = new Canvas();
// Bitmap bm = Bitmap.createBitmap(sCurrentImage,0, 0, sCurrentImage.getWidth()
// , sCurrentImage.getHeight(), matrix, true);
Log.d("SCALE", "scale=" + scale + " " + getWidth() + " " + getHeight());
//bm.recycle();
}
}
break;
}
setImageMatrix(matrix);
return true; // indicate event was handled
}
});
}
public void setImage(Bitmap bm, int displayWidth, int displayHeight , PinchZoomExample pze) {
super.setImageBitmap(bm);
sCurrentImage = bm;
sPinchZoomExample = pze;
//Fit to screen.
float scale;
if ((displayHeight / bm.getHeight()) >= (displayWidth / bm.getWidth())){
scale = (float)displayWidth / (float)bm.getWidth();
} else {
scale = (float)displayHeight / (float)bm.getHeight();
}
savedMatrix.set(matrix);
matrix.set(savedMatrix);
matrix.postScale(scale, scale, mid.x, mid.y);
setImageMatrix(matrix);
// Center the image
float redundantYSpace = (float)displayHeight - (scale * (float)bm.getHeight()) ;
float redundantXSpace = (float)displayWidth - (scale * (float)bm.getWidth());
redundantYSpace /= (float)2;
redundantXSpace /= (float)2;
savedMatrix.set(matrix);
matrix.set(savedMatrix);
matrix.postTranslate(redundantXSpace, redundantYSpace); //matrix.postTranslate(50, 50);
setImageMatrix(matrix);
}
/** Determine the space between the first two fingers */
private float spacing(WrapMotionEvent event) {
// ...
float x = event.getX(0) - event.getX(1);
float y = event.getY(0) - event.getY(1);
return FloatMath.sqrt(x * x + y * y);
}
/** Calculate the mid point of the first two fingers */
private void midPoint(PointF point, WrapMotionEvent event) {
// ...
float x = event.getX(0) + event.getX(1);
float y = event.getY(0) + event.getY(1);
point.set(x / 2, y / 2);
}
}
解决方案
private static final float MIN_ZOOM = 1.0f;
private static final float MAX_ZOOM = 5.0f;
scale = Math.max(MIN_ZOOM, Math.min(scale, MAX_ZOOM));
这篇关于在Android上的双指缩放比例限制的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文