安卓 - 如何使两个视图接收并执行相同的触摸事件?

4

我有一个RelativeLayout,看起来像这样:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#65ffffff" >

<com.sonyericsson.zoom.ImageZoomView
    android:id="@+id/zoomview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" />


</RelativeLayout>

我有一组针对RelativeLayout的触摸事件。然而,com.sonyericsson.zoom.ImageZoomView也有自己处理触摸事件的逻辑。
当我在屏幕上执行任何触摸事件时,首先调用的是com.sonyericsson.zoom.ImageZoomView类的触摸监听器(这是我期望的)。问题是,如果我在该触摸事件中返回“true”,则RelativeLayout的触摸监听器将不会被调用。而如果我返回“false”,它们将被调用,但是,类ImageZoomView所做的触摸处理就会被简单地忽略!(我猜测因为最终我返回了“false”,所以Android会忽略类com.sonyericsson.zoom.ImageZoomView之前所做的任何UI更新的触摸事件)。
简而言之,我想要能够在我的com.sonyericsson.zoom.ImageZoomView和RelativeLayout中同时处理同一个触摸事件。
有没有什么办法可以做到这一点?
我正在使用Android 2.2+。
谢谢!
4个回答

1

我最终使用了onInterceptTouchEvent方法,如下所示:

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

        return onTouchEvent(ev);
}

我必须实现方法onTouchEvent并返回“false”:
@Override
public boolean onTouchEvent(MotionEvent event) {

      gesturedetector.onTouchEvent(event);      
   return false;
}

这样我就能在事件发送给子组件之前拦截它们。因此,我可以在那之前进行所需的处理。


你能提供完整的代码吗? - c-an

1
我建议您将ImageZoomView中的逻辑移动到dispatchTouchEvent方法中,而不是OnTouchListener中。
在我之前遇到的问题中,我发现dispatchTouchEvent/dispatchKeyEvent通常可以正常工作,而onTouchListener/onKeyListener则不能按预期工作。

0
继承自ImageZoomView类。
这个继承的类有一个对你的RelativeLayout的引用。
覆盖触摸处理方法并放置以下伪代码:
bool result = super.onTouch();
referencedRelativeLayout.onTouch();
return result;

这样两个小部件都会接收到事件。


0
假设您的ImageZoomView类扩展了View,在主活动中,您可以执行以下操作:

ImageZoomView mView;    

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);       

    mView = (ImageZoomView) findViewById(R.id.zoomview);         
    mView.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {

        //Do whatever
        return false;
    });        

}

只需将ImageZoomView视为一个按钮(继承自View)即可。
希望对你有所帮助。

感谢回复0gravity。但问题在于,如果我在那里返回false,事件将被传递到下一个视图,好的(这是我想要的)。然而,由于某种原因,在“return false;”之前进行的所有处理(在onTouch方法内部)都被Android忽略了!也就是说,只有下一个视图(在我的情况下,RelativeLayout)的处理将被处理。我不希望忽略ImageZoomView的处理!! - Bitcoin Cash - ADA enthusiast
唯一的方法是返回true而不是false,这样才不会被忽略。然而,在这种情况下,事件将不会传递到下一个视图(RelativeLayout)... - Bitcoin Cash - ADA enthusiast

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接