【问题标题】:Overriding libs onTouch listener覆盖库 onTouch 监听器
【发布时间】:2015-06-21 07:52:48
【问题描述】:

我正在使用PhotoViewhttps://github.com/chrisbanes/PhotoView
它自己已经在你给它的ImageView 上实现了一个OnTouchListener。

这是我的问题,我还需要实现 OnLongTouchListener 并且在其中我需要触摸事件的 X & Y coordinates。问题是我无法从OnLongTouchListener->onLongClick(View ..) 获取那些,这意味着我还需要实现我自己的OnTouchListener 从MotionEvent 获取X & Y 将它们放在类变量中,而不是在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;
        }

    }
}

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

【问题讨论】:

    标签: android android-imageview


    【解决方案1】:

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

    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
    }
    

    【讨论】:

    • 问题是当我设置自己的 onTouch 监听器时,它会覆盖 PhotoView 中的监听器。 : /
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-05
        • 2018-04-29
        相关资源
        最近更新 更多