android - 可拖动父视图中的可缩放 ImageView 冲突
问题描述
我有一个具有 ViewPager 的活动,并且每个页面都是具有可缩放图像视图的片段。我已经在可缩放 imageView 的父视图上使用 onTouch 方法实现了拖动以关闭功能,并且拖动工作正常。但我想检查在 dispatchTouchEvent 中是否检测到 2 个数字,然后忽略 onTouch 方法并将触摸传递给子视图,以便我可以缩放图像。我试过写一个如下的类,但它不起作用。我该如何解决这个问题?因此,缩放和拖动不会相互冲突。
谢谢
自定义视图:
public class DraggableRelativeLayout extends RelativeLayout {
private final int THRESHOLD = ScreenUtils.dpToPx(10);
float diffX, diffY;
private float initialXValue;
private float initialYValue;
public DraggableRelativeLayout(Context context) {
super(context);
}
public DraggableRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public DraggableRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public DraggableRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
switch (ev.getAction()) {
case MotionEvent.ACTION_DOWN:
initialXValue = ev.getX();
initialYValue = ev.getY();
// return false;
break;
case MotionEvent.ACTION_MOVE:
diffX = ev.getX() - initialXValue;
diffY = ev.getY() - initialYValue;
if (Math.abs(diffY) <THRESHOLD || ev.getPointerCount() > 1)
return true;
else
return super.dispatchTouchEvent(ev);
//break;
case MotionEvent.ACTION_UP:
break;
}
return super.dispatchTouchEvent(ev);
}
}
onTouchListener:
public class PostDetailTouchListener implements View.OnTouchListener {
public PostDetailTouchListener(Context context, View view, View viewToZoom, OnDragInteractionListener mListener) {
dragView = view;
dragListener = mListener;
zoomView = viewToZoom;
}
@Override
public boolean onTouch(View view2, MotionEvent event) {
// doing my work
}
解决方案
您可以使用手势检测器来实现此目的以获取详细链接
class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent event) {
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
return true;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onDoubleTap(MotionEvent e) {
return true;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {
return true;
}
@Override
public boolean onFling(MotionEvent event1, MotionEvent event2,float velocityX, float velocityY) {
return true;
}
}
推荐阅读
- r - 如何将向量传递给函数的点 (...) 参数
- java - 执行java时-D命令行选项是什么意思
- powershell - PSObject 太大而无法测量或加载
- sql-server - 如果 TSQL 中存在有时缺少的列(如果不存在,则包含替代列)
- c++ - std::bad_alloc 抛出质数任务
- rpm - 带有多个 rpm-spec 文件的 Rpm 包
- r - nls.lm 的停止条件
- python - 单行字符串迭代器;AttributeError:“生成器”对象没有“替换”属性
- c++ - 当参数被转发而不是移动构造时,std::move 在参数列表中是否安全?
- java - 用户池不存在