覆盖 libs onTouch 侦听器

Overriding libs onTouch listener

我正在使用 PhotoView https://github.com/chrisbanes/PhotoView
它本身已经在您提供的 ImageView 上实现了 OnTouchListener

这是我的问题,我还需要实现一个 OnLongTouchListener,并且在其中我需要触摸事件的 X & Y coordinates。问题是我无法从 OnLongTouchListener->onLongClick(View ..) 得到那些,这意味着我还需要实现我自己的 OnTouchListenerMotionEvent 得到 X & Y 把它们放在 class 变量中在 OnLongTouchListener 做我的事。

但是,我自己的 OnTouchListener 覆盖了 PhotoViews 侦听器,删除了缩放和滑动功能。

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;

import java.util.Observable;

import uk.co.senab.photoview.PhotoViewAttacher;

public class MapView extends Observable {

    private MainActivity activity;
    private PhotoViewAttacher photoView;
    private Matrix viewMatrix;

    protected ImageView view;
    protected Bitmap bitmap;

    public MapView(MainActivity activity) {
        this.activity = activity;

        view = (ImageView) activity.findViewById(R.id.map_view);
        bitmap = BitmapFactory.decodeResource(activity.getResources(), R.drawable.floorplan);

        photoView = new PhotoViewAttacher(view);
        viewMatrix = view.getImageMatrix();

        view.setOnTouchListener(new MapViewTouchListener());
        view.setOnLongClickListener(new MapViewLongTouchListener());
    }

    private class MapViewLongTouchListener implements View.OnLongClickListener {

        public boolean onLongClick(View v) {
            Log.i("output", "Long press");
            return true;
        }

    }

    private class MapViewTouchListener implements View.OnTouchListener {

        public boolean onTouch(View v, MotionEvent event) {
            Log.i("output", "Touch");
            return true;
        }

    }
}

临时解决。我创建了自己的 class 并覆盖了 onTouch 方法。原来 PhotoViewAttacher 实现了 OnTouchListener 所以我能够让它工作只是重新实现该方法。

要检查长按,我想你需要这样的东西:

if(event.getActionMasked() == MotionEvent.ACTION_POINTER_DOWN && event.getActionIndex()==0){
    mFingerTimeDown = System.currentTimeMillis();
}

if(event.getActionMasked() == MotionEvent.ACTION_POINTER_UP &&     event.getActionIndex()==0 ){
    if ((System.currentTimeMillis()-mFingerDownTime) >= LONG_PRESS_TIME_MILLIS)
        //long press action
    else
        //short press action
}

在您的侦听器中尝试 return false。如果侦听器事件方法 returns 为真,则表示该事件已处理并且不会传播到下面的视图。

解决方案是简单地扩展 PhotoViewAttacher class 实现 OnLongClickListener 并从内部 onTouch 方法将 MotionEvent 传递给它。

private class ZoomableMapView extends PhotoViewAttacher implements OnLongClickListener {

  private MotionEvent event;

  public ZoomableMapView(ImageView view) {
    super(view);
  }

  public boolean onTouch(View view, MotionEvent event) {
    this.event = event;
    return super.onTouch(view, event):
  } 

  public boolean onLongClickListener(View view) {
    // Access event.getX.getY... here
    ...
    return false;
  }
}