2012-10-02 1 views
2

Image에서 접촉 한 지점을 가져 오려는 앱을 만들고 있습니다. 내가 포인트를 감동 ​​올바른 얻을 수 아니에요,Android : ImageView에 터치 위치 점 받기

Android: how to detect touch location on ImageView if the image view is scaled by matrix?

그러나 :이 링크를 사용하여 시도했다.

내가 뭘 잘못하고 있니?

도움을 주시면 감사하겠습니다.

여기 내 코드입니다 :

public boolean onTouch(View v, MotionEvent event) { 
       v.onTouchEvent(event); 




       matrix.getValues(m); 
       float x = m[Matrix.MTRANS_X]; 
       float y = m[Matrix.MTRANS_Y]; 
       PointF curr = new PointF(event.getX(), event.getY()); 

       switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN: 
        last.set(event.getX(), event.getY()); 
        EventX=event.getX(); 
        EventY=event.getY(); 
        Log.d("ImageX"+event.getX(), "ImageY"+event.getY()); 
        start.set(last); 
        mode = DRAG; 
        PosterActivity.isTouched=false; 

        break; 
       case MotionEvent.ACTION_MOVE: 
        // Log.i("onTouch", "origWidth : " + origWidth + 
        // " origHeight : " + origHeight); 
        if (mode == DRAG) { 
         deltaX= curr.x - last.x; 
         Log.d("deltaX",""+deltaX); 

         deltaY = curr.y - last.y; 
         Log.d("deltay",""+deltaY); 
         scaleWidth = Math.round(origWidth * saveScale); 
         scaleHeight = Math.round(origHeight * saveScale); 
         if (scaleWidth < width) { 
          deltaX = 0; 
          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } else if (scaleHeight < height) { 
          deltaY = 0; 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 
         } else { 
          if (x + deltaX > 0) 
           deltaX = -x; 
          else if (x + deltaX < -right) 
           deltaX = -(x + right); 

          if (y + deltaY > 0) 
           deltaY = -y; 
          else if (y + deltaY < -bottom) 
           deltaY = -(y + bottom); 
         } 
         matrix.postTranslate(deltaX, deltaY); 
         last.set(curr.x, curr.y); 
         PosterActivity.isTouched=true; 

        } 
        break; 

       case MotionEvent.ACTION_UP: { 
        mode = NONE; 
        int xDiff = (int) Math.abs(curr.x - start.x); 
        int yDiff = (int) Math.abs(curr.y - start.y); 
        if (xDiff < CLICK && yDiff < CLICK) { 
         Log.v("ACTION_UP", "ACTION_UP"); 
         mPosX = curr.x; 
         mPosY = curr.y; 

         PosterActivity.isTouched=true; 
         performClick(); 

        } 
        //setImageMatrix(matrix); 
        //invalidate(); 
        break; 
       } 
       case MotionEvent.ACTION_POINTER_UP: 
        mode = NONE; 
        break; 
       } 
       setImageMatrix(matrix); 
       invalidate(); 
       return true; // indicate event was handled 
      } 

답변

2

내가 성공적으로 연결된 한 질문의 answare을 사용했던 점을 얻을 수 있습니다. 난 그냥 getRawX()와 getRawY()와 getX()와 getY()()를 변경했습니다

이 코드 샘플

// calculate inverse matrix 
    Matrix inverse = new Matrix(); 
    matrix.invert(inverse); 
    // map touch point from ImageView to image 
    float[] touchPoint = new float[] {event.getRawX(), event.getRawY()}; 
    inverse.mapPoints(touchPoint); 
    // touchPoint now contains x and y in image's coordinate system  
    Log.d(TAG, "touch coords="+touchPoint[0] + " - " + touchPoint[1]); 
으로 시도