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

时间:2012-07-16 02:13:06

标签: android events views touch ontouchevent

我有一个看起来像这样的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 个答案:

答案 0 :(得分:1)

我建议您将ImageZoomView的 OnTouchListener 中的逻辑移动到 dispatchTouchEvent 方法。

在我之前遇到的问题中,我发现dispatchTouchEvent / dispatchKeyEvent通常在onTouchListener / onKeyListener不能按预期工作时有效。

答案 1 :(得分:0)

ImageZoomView类继承。

此继承的类具有对RelativeLayout的引用。

覆盖触摸处理方法并将以下伪代码放入:

bool result = super.onTouch();
referencedRelativeLayout.onTouch();
return result;

这样两个小部件都能得到这个事件。

答案 2 :(得分: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扩展)即可。

希望有所帮助。

答案 3 :(得分:0)

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

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

        return onTouchEvent(ev);
}

我必须实现方法 onTouchEvent 才能返回“false”:

@Override
public boolean onTouchEvent(MotionEvent event) {

      gesturedetector.onTouchEvent(event);      
   return false;
}

这样我就可以在发送给孩子们之前拦截这些事件。所以,在那之前我做了我想要的处理。