如何在使用双指缩放和拖动动作,以保持内部的屏幕范围的图像? [英] How to keep an image inside the screen limits while using pinch zoom and drag gestures?

查看:154
本文介绍了如何在使用双指缩放和拖动动作,以保持内部的屏幕范围的图像?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我建立一个使用双指缩放和拖动一个应用程序。问题是,现在我可以拖动图片出来的界定。我想知道我怎么可以使用拖放并确保图像在屏幕上停留在同一时间。

下面是我的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&安培;&安培; xS​​cale等&其中; = 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆