Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/187.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在android中为图像启用(两个手指)放大/缩小功能_Android_Image_Zooming - Fatal编程技术网

如何在android中为图像启用(两个手指)放大/缩小功能

如何在android中为图像启用(两个手指)放大/缩小功能,android,image,zooming,Android,Image,Zooming,可能重复: 我对安卓非常陌生。。我的布局中有一个图像视图。。我想为来自此图像视图的图像启用放大和缩小功能。。缩放应通过两个手指触摸完成。。 谁能告诉我怎么做到这一点 谢谢 Raj看到了吗 private static final String TAG = "Touch"; //These matrices will be used to move and zoom image Matrix matrix = new Matrix(); Matrix savedMatrix = new Mat

可能重复:

我对安卓非常陌生。。我的布局中有一个图像视图。。我想为来自此图像视图的图像启用放大和缩小功能。。缩放应通过两个手指触摸完成。。 谁能告诉我怎么做到这一点

谢谢

Raj

看到了吗

private static final String TAG = "Touch";

//These matrices will be used to move and zoom image
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;
static final int DRAW =3;
int mode = NONE;

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

// Limit zoomable/pannable image
private float[] matrixValues = new float[9];
private float maxZoom;
private float minZoom;
private float height;
private float width;
private RectF viewRect;
/////////************ touch events functions **************////////////////////
@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    if(hasFocus){  init();   }
}
private void init() {
    maxZoom = 4;
    minZoom = 0.25f;
    height = myimage.getDrawable().getIntrinsicHeight()+20;
    width = myimage.getDrawable().getIntrinsicWidth()+20;
    viewRect = new RectF(0, 0, myimage.getWidth()+20, myimage.getHeight()+20);
}

  /////////************touch events for image Moving, panning and zooming   ***********///
public boolean onTouch(View v, MotionEvent event) {

    // Dump touch event to log
    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:
    case MotionEvent.ACTION_POINTER_UP:
        mode = NONE;
        Log.d(TAG, "mode=NONE");
        break;
    case MotionEvent.ACTION_MOVE:
        if (mode == DRAW){ onTouchEvent(event);}
        if (mode == DRAG) {
                ///code for draging..        
        } 
     else if (mode == ZOOM) {
         float newDist = spacing(event);
         Log.d(TAG, "newDist=" + newDist);
         if (newDist > 10f) {
             matrix.set(savedMatrix);
             float scale = newDist / oldDist;
             matrix.getValues(matrixValues);
             float currentScale = matrixValues[Matrix.MSCALE_X];
             // limit zoom
             if (scale * currentScale > maxZoom) {
                 scale = maxZoom / currentScale; 
                }else if(scale * currentScale < minZoom){
                    scale = minZoom / currentScale; 
                 }
             matrix.postScale(scale, scale, mid.x, mid.y);
            }
     }
     break;
    }
    myimage.setImageMatrix(matrix);
    return true; // indicate event was handled
}

//*******************Determine the space between the first two fingers
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);
}

//************* Calculate the mid point of the first two fingers 
private void midPoint(PointF point, MotionEvent 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 String TAG=“Touch”;
//这些矩阵将用于移动和缩放图像
矩阵=新矩阵();
矩阵savedMatrix=新矩阵();
//我们可能处于这三种状态之一
静态最终int NONE=0;
静态最终整数阻力=1;
静态最终整数缩放=2;
静态最终整数绘制=3;
int模式=无;
//记住一些关于缩放的事情
PointF start=新的PointF();
PointF mid=新的PointF();
浮动oldDist=1f;
//限制可缩放/可平移图像
私有浮动[]矩阵值=新浮动[9];
私有浮点最大缩放;
私有浮动最小缩放;
私人浮动高度;
私有浮动宽度;
私有RectF viewRect;
/////////************触摸事件功能**************////////////////////
@凌驾
WindowFocusChanged上的公共无效(布尔hasFocus){
super.onWindowFocusChanged(hasFocus);
if(hasFocus){init();}
}
私有void init(){
maxZoom=4;
最小缩放=0.25f;
高度=myimage.getDrawable().getIntrinsicHeight()+20;
宽度=myimage.getDrawable().getIntrinsicWidth()+20;
viewRect=new RectF(0,0,myimage.getWidth()+20,myimage.getHeight()+20);
}
/////////************用于图像移动、平移和缩放的触摸事件***********///
公共布尔onTouch(视图v,运动事件){
//将触摸事件转储到日志
dumpEvent(事件);
//在这里处理触摸事件。。。
开关(event.getAction()&MotionEvent.ACTION\u掩码){
case MotionEvent.ACTION\u DOWN:
savedMatrix.set(矩阵);
set(event.getX(),event.getY());
Log.d(标记“mode=DRAG”);
模式=拖动;
打破
case MotionEvent.ACTION\u指针\u向下:
oldDist=间距(事件);
Log.d(标记“oldDist=“+oldDist”);
如果(旧区>10f){
savedMatrix.set(矩阵);
中点(中点,事件);
模式=缩放;
Log.d(标记“mode=ZOOM”);
}
打破
case MotionEvent.ACTION\u UP:
case MotionEvent.ACTION\u指针\u向上:
模式=无;
Log.d(标记“mode=NONE”);
打破
case MotionEvent.ACTION\u移动:
if(mode==DRAW){onTouchEvent(event);}
如果(模式==拖动){
///拖航代码。。
} 
else if(模式==缩放){
float newDist=间距(事件);
Log.d(标记“newDist=“+newDist”);
如果(新距离>10f){
矩阵集(savedMatrix);
浮动比例=新距离/旧距离;
矩阵。获取值(矩阵值);
float currentScale=矩阵值[Matrix.MSCALE_X];
//极限变焦
如果(缩放*当前缩放>最大缩放){
比例=最大缩放/当前比例;
}else if(缩放*当前缩放<最小缩放){
比例=最小缩放/当前比例;
}
矩阵。后标度(标度、标度、中x、中y);
}
}
打破
}
设置图像矩阵(矩阵);
返回true;//指示事件已处理
}
//*******************确定前两个手指之间的间距
专用浮动间距(MotionEvent事件){
float x=event.getX(0)-event.getX(1);
float y=event.getY(0)-event.getY(1);
返回FloatMath.sqrt(x*x+y*y);
}
//*************计算前两个手指的中点
专用空心中点(点F点、MotionEvent事件){
float x=event.getX(0)+event.getX(1);
float y=event.getY(0)+event.getY(1);
点集(x/2,y/2);
}
}    

请看此图,使用上面的代码,我可以成功地放大和缩小。。但是图像从我的布局中移走了。。是否可以限制布局中的图像缩放。。最初的图像大小应该与屏幕大小相等,你能告诉我如何将图像限制在屏幕内吗