如何解决将触摸事件传递到父视图
| 我有一个自定义“ 0”,在其中实现了触摸事件,所以我 能够使用触摸屏在屏幕上滚动。 我的布局层次结构如下所示:<ViewSwitcher>
<LinearLayout>
<ListView />
</LinearLayout>
<LinearLayout>
<ListView />
</LinearLayout>
</ViewSwitcher>
现在的问题是触摸事件正在被
ListViews
,无法切换视图。当我工作正常
没有ListViews
。我需要能够滚动浏览
查看并滚动ListView
。
我该如何解决?
编辑:我还需要ListView
项目才能单击。
提前致谢!
解决方法
谢谢大家回答这个问题。但是我能够以一种简单得多的方式解决它。由于我的“ 0”没有检测到触摸事件,因此我拦截了名为“ 7”的触摸事件并返回了“ 8”。这里:
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
onTouchEvent(ev);
return false;
}
通过覆盖ѭ10,我可以拦截活动中的触摸事件。然后我在ViewSwitcher
中调用了onTouchEvent()
来处理ListViews
的切换。最后,通过返回false
,确保ViewGroup
不会消耗事件。
, 将子视图的TouchEvent传递到父视图的最简单方法是将其添加到子视图:
@Override
public boolean onTouchEvent(MotionEvent event) {
super.onTouchEvent(event);
return false;
}
, 在我的父级布局中,我发现阻止孩子捕获触摸事件的唯一方法是重写onInterceptTouchEvent以返回true。
@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{
return true;
}
, 我认为您没有简便的方法可以做到这一点。
并没有那么复杂,但是您将需要创建自己的扩展ListView的视图。然后,您可以覆盖onTouch
处理函数,并决定(取决于touch事件)是要处理它(并返回true)还是将其传递给父级View。
问题还在于,一旦视图处理了触摸事件,它将获取所有剩余的触摸事件。
从Android文档:
onTouch()-这将返回一个布尔值
指明您的听众
消耗此事件。重要的
事情是这个事件可以有
跟随每个动作
其他。因此,如果您在以下情况下返回false
收到向下动作事件,您
表示您还没有消耗
该事件,也没有兴趣
在此事件的后续操作中。
因此,您不会被要求任何
事件中的其他动作,例如
作为手指手势,或者最终
向上动作事件
因此,例如,如果您希望垂直移动以滚动列表并在同一触摸事件期间(不松开手指),则希望水平移动来切换视图,这将是非常具有挑战性的。
但是,如果您可以使用手势作为示例,或者在自定义视图中处理所有事情,并根据MotionEvent的不同,将命令发送到ViewSwitcher。
, 您是否尝试过将ListView项设置为不可点击,如下所示:listView.setClickable(false);这应该向上推动click事件。
, 如果您的视图要传递事件,请确保在onTouchEvent中返回false。否则,平台会认为您消耗了该事件,因此不需要进一步处理。
, 我所做的是在viewswitcher的listview上设置一个toucheventlistener,处理事件,检测猛击动作,并调用viewswitcher的方法。有用。
, 您也可以在dispatchTouchEvent
中插入一个呼叫以处理touchevent
,但是在这种情况下,您还必须覆盖onTouchEvent
以返回true,否则将仅传递手势的第一个MotionEvent
DOWN。
这是可触摸的包装容器:
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<view xmlns:android=\"http://schemas.android.com/apk/res/android\"
android:id=\"@+id/pager\"
android:layout_width=\"match_parent\"
android:layout_height=\"match_parent\"
class=\"com.example.myapp.FragmentContainer$TouchableWrapper\" />
和班级:
public static class TouchableWrapper extends FrameLayout {
private GestureDetector gestureDetector;
public void setGestureDetector(GestureDetector gestureDetector) {
this.gestureDetector = gestureDetector;
}
// these constructors for the XML inflater
public TouchableWrapper(Context context) {
super(context);
}
public TouchableWrapper(Context context,AttributeSet attrs) {
super(context,attrs);
}
public TouchableWrapper(Context context,AttributeSet attrs,int defStyle) {
super(context,attrs,defStyle);
}
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
Log.d(TAG,\"onInterceptTouchEvent \" + event.toString());
return false; // true for intercept,false è default and pass on to children View
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
Log.d(TAG,\"dispatchTouchEvent \" + event.toString());
gestureDetector.onTouchEvent(event);
return super.dispatchTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
Log.d(TAG,\"onTouchEvent \" + event.toString());
return true; //return super.onTouchEvent(event);
}
}
这是“ 25”参考:
private GestureDetector gestureDetector;
这GestureListener
:
private GestureDetector.SimpleOnGestureListener sOGL = new GestureDetector.SimpleOnGestureListener() {
private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;
@Override
public boolean onDown(MotionEvent e) {
return true;
}
@Override
public boolean onFling(MotionEvent e1,MotionEvent e2,float velocityX,float velocityY) {
boolean result = false;
try {
float diffY = e2.getY() - e1.getY();
float diffX = e2.getX() - e1.getX();
if (Math.abs(diffX) > Math.abs(diffY)) {
if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
if (diffX > 0) {
goToRight(); // onSwipeRight();
} else {
goToLeft(); // onSwipeLeft();
}
}
result = true;
} else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
if (diffY > 0) {
// onSwipeBottom();
} else {
// onSwipeTop();
}
}
result = true;
} catch (Exception exception) {
exception.printStackTrace();
}
return result; // return false indicate event not handled
}
};
使用此工具加载可触摸容器片段和包含的片段:
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {
Log.d(TAG,\"onCreateView()\");
View view = inflater.inflate(R.layout.fragmentcontainer,container,false);
gestureDetector = new GestureDetector(view.getContext(),sOGL);
((FragmentContainer.TouchableWrapper) view).setGestureDetector(gestureDetector);
FragmentManager fm = this.getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.replace(R.id.pager,frag).commit();
return view;
}
, 必须使用autoLink = \“ three \”处理父视图中TextView中的触摸
这样做:
private LinearLayout mParentView;
private TextView mTextView;
private View.OnTouchListener mParentListener = new OnTouchListener() {
@Override
public boolean onTouch(View v,MotionEvent event) {
......
return false;
}
};
mParentView.setOnTouchListener(mParentListener);
mTextView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v,MotionEvent event) {
mParentListener.onTouch(mParentView,event);
return false;
}
};
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。