覆盖 libs onTouch 侦听器
Overriding libs onTouch listener
我正在使用 PhotoView
https://github.com/chrisbanes/PhotoView
它本身已经在您提供的 ImageView
上实现了 OnTouchListener
。
这是我的问题,我还需要实现一个 OnLongTouchListener
,并且在其中我需要触摸事件的 X & Y coordinates
。问题是我无法从 OnLongTouchListener->onLongClick(View ..)
得到那些,这意味着我还需要实现我自己的 OnTouchListener
从 MotionEvent
得到 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;
}
}
我正在使用 PhotoView
https://github.com/chrisbanes/PhotoView
它本身已经在您提供的 ImageView
上实现了 OnTouchListener
。
这是我的问题,我还需要实现一个 OnLongTouchListener
,并且在其中我需要触摸事件的 X & Y coordinates
。问题是我无法从 OnLongTouchListener->onLongClick(View ..)
得到那些,这意味着我还需要实现我自己的 OnTouchListener
从 MotionEvent
得到 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;
}
}