2012-07-17 221 views
1

我被困在这个问题中。我有一个imageView,我想只在图像中获得我的触摸位置。当我接触图像时,我必须显示x=0y=0。在这个应用程序,我必须知道调整大小,缩放和旋转图像,功能是固定的,但我只有在图像内的图像的坐标有问题。如何在android中的imageview中获取图像的x和y坐标?

这里是一个链接,我的意思link

这是一个同样的问题,我尝试解决:How to get Coordinates X,Y of Image after Zoom and Pan

非常感谢。

的Ondrej

这里是我的代码:

public class Sample extends Activity{ 
     static final int NONE = 0; 
    static final int DRAG = 1; 
    static final int ZOOM = 2; 
    int mode = NONE; 

    Matrix matrix = new Matrix(); 
    Matrix savedMatrix = new Matrix(); 

    PointF start = new PointF(); 
    PointF mid = new PointF(); 
    float oldDist = 1f; 

    int[] location = new int[2]; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final ImageView image = (ImageView) findViewById(R.id.mapView); 

     final Bitmap icon = BitmapFactory.decodeResource(this.getResources(), 
       R.drawable.mapa); 
     image.setImageBitmap(icon); 



     image.setOnTouchListener(new View.OnTouchListener() 
     { 

      public boolean onTouch(View v, MotionEvent event) 
      { 
       final ImageView view = (ImageView) v; 


       switch (event.getAction() & MotionEvent.ACTION_MASK) 
       { 
       case MotionEvent.ACTION_DOWN: 
        savedMatrix.set(matrix); 
        start.set(event.getX(), event.getY()); 
        mode = DRAG; 
        RectF r = new RectF(); 
        matrix.mapRect(r); 

        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; 
       case MotionEvent.ACTION_POINTER_DOWN: 
        oldDist = spacing(event); 
        if (oldDist > 10f) 
        { 
         savedMatrix.set(matrix); 
         midPoint(mid, event); 
         mode = ZOOM; 
        } 
        break; 

       } 

       // Perform the transformation 
       view.setImageMatrix(matrix); 
       return true; 
      } 
     }); 
    } 

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

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

而且main.xml中的样子:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <ImageView 
     android:id="@+id/mapView" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_gravity="right" 
     android:adjustViewBounds="true" 
     android:scaleType="matrix" > 
    </ImageView> 

</FrameLayout> 

回答

-1
+0

虽然这可能在理论上回答这个问题,但[这将是更可取的](http://meta.stackexchange.com/q/8259)在这里包含答案的基本部分,并提供供参考的链接。 – 2012-07-17 22:26:37

+0

非常感谢您的留言,但它非常广泛。我尝试解决同样的问题,例如:[如何在缩放和平移后获取图像的坐标X,Y](http://stackoverflow.com/questions/ 9093429/android-how-to-get-coordinates-xy-image-after-zoom-and-pan?s = d0f1ef64-d0d7-497b-aae8-824fe8027177#new-answer),但我不明白如何得到一个规模和一个左和顶部变量。谢谢 – user1532985 2012-07-18 23:13:22

0

我真的不明白你问什么,但我会尽量尝试回答。这听起来像你想使用getRawX()和getRawY()来获得屏幕上的触摸位置而不是视图。对于imageView之外的任何内容,您可能还必须重写onTouchEvent方法。

+0

嗨安迪,首先,非常感谢您对我的回答的反应,对于我的英语感到抱歉,问题在于:当我缩小图像时,比屏幕小,坐标x = 0和y = 0必须位于图片的左上角,并且我们对图片或图片周围的图片不感兴趣。我尝试制作一个图像,这里有一个链接[链接](http://imageshack.us/photo/my-images/836/exampledz.png/) – user1532985 2012-07-18 13:24:37

+0

在ImageView的onTouchEvent()方法中,您正在调用getX()和getY(),正确吗?我在说,你应该试试getRawX()和getRawY()来代替。这将让您阅读缩放到显示大小的触摸坐标。换句话说,getRawX和getRawY会告诉你你正在触摸整个屏幕上的哪个像素。如果您使用getRawX和getRawY,只有当您触摸屏幕的左上角时,才会看到X = 0和Y = 0。但是,为了在ImageView之外获得触摸事件,您需要覆盖保存imageview的布局的onTouchEvent()。 – 2012-07-18 14:06:01

+0

是的,这是一个很好的观点,但是我想在缩放或平移之后获得图像的位置,没有像getX()或getY()这样的屏幕位置。这是同样的问题,我有[链接](http://stackoverflow.com/questions/9093429/android-how-to-get-coordinates-xy-of-image-after-zoom-and-pan?s= d0f1ef64-d0d7-497b-aae8-824fe8027177#new-answer),但我不明白热得到一个规模或左和顶变量 – user1532985 2012-07-18 23:05:52

相关问题