2012-07-17 2 views
3

안녕하세요 Android, 3 판에서 Pinch to Zoom 기능에있는 코드를 사용하고 있습니다. 이것을 사용하여 핀치가 잘 작동하지만 확대 한 후에 이미지 뷰에서 절대 클릭 위치를 얻고 싶습니다. 여기 Android : 확대 후 ImageView에서 절대 클릭 위치 찾기 (핀치를 사용하여 매트릭스 레이아웃을 사용하여 줌)

package org.example.touch; 
import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.Matrix; 
import android.graphics.PointF; 
import android.os.Bundle; 
import android.util.FloatMath; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import android.widget.GridView; 
import android.widget.ImageView; 

public class Touch extends Activity implements OnTouchListener { 
private static final String TAG = "Touch"; 

private static final float MIN_ZOOM = 1.0f; 
private static final float MAX_ZOOM = 5.0f; 

// 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; 
int mode = NONE; 

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

ImageView image2; 
image2 = (ImageView)this.findViewById(R.id.imageView2); 
image2.setOnTouchListener(new OnTouchListener() { 

       public boolean onTouch(View v, MotionEvent event) { 

        ImageView view = (ImageView) image2; 
         // Handle touch events here... 
         switch (event.getAction() & MotionEvent.ACTION_MASK) { 
         case MotionEvent.ACTION_DOWN: 
          savedMatrix.set(matrix); 
          start.set(event.getX(), event.getY()); 
          mode = DRAG; 
          break; 
         case MotionEvent.ACTION_POINTER_DOWN: 
          oldDist = spacing(event); 
          if (oldDist > 10f) { 
           savedMatrix.set(matrix); 
           midPoint(mid, event); 
           mode = ZOOM; 
          } 
          break; 
         case MotionEvent.ACTION_UP: 
         case MotionEvent.ACTION_POINTER_UP: 
          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); 
           if (newDist > 10f) { 
            matrix.set(savedMatrix); 
            float scale = newDist/oldDist; 
            matrix.postScale(scale, scale, mid.x, mid.y); 
           } 
          } 
          break; 
         } 
         view.setImageMatrix(matrix); 
} 

     /** 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); 
     } 

답변

0

float[] values = new float[9]; 
matrix.getValues(values); 

계산 scaleFactor와 pinchzoom하기 전에 아래의 논리를 적용 내 코드입니다;

scaleX=values[0]; 
scaleY=vales[4]; 

이제 상대 터치 당신은 원래의 기본 포인트에/포인트를 매핑 할 이미지 뷰에 적용되는 매트릭스를 사용할 수 있습니다 핀치 줌 후 iamge에

float relativeX = ((event.getX() - values[2])*sacleX)/values[0]; 
float relativeY = ((event.getY() - values[5])*scaleY)/values[4]; 
1

에 따라 좌표를 계산합니다.

//points from a touch/click event on the zoomed/translated imageview 
float X; 
float Y; 

float initialPoints = new float[]{X, Y}; 

//invert the matrix and map points back 
    if(transformMatrix.invert(inverseTransformMatrix)) 
      inverseTransformMatrix.mapPoints(initialFocalPoints); 

initialPoints 이제 더 매트릭스는 이미지 뷰에 적용되지 않은 경우 클릭 포인트가 될 것 원래의 포인트를, 즉 포함

편집 : 당신은 그들이 무엇인지 알 수 있도록 어딘가에서 이것을 추가한다 .

Matrix inverseTransformMatrix = new Matrix(); 
Matrix transformMatrix = new Matrix();