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 中处理相同的触摸事件。

有没有办法做到这一点?

我使用的是安卓 2.2+。

先感谢您!

4

4 回答 4

1

我建议您将 ImageZoomView 的 OnTouchListener 中的逻辑移至dispatchTouchEvent方法

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

于 2012-07-16T05:14:26.510 回答
0

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

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

        return onTouchEvent(ev);
}

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

@Override
public boolean onTouchEvent(MotionEvent event) {

      gesturedetector.onTouchEvent(event);      
   return false;
}

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

于 2012-07-17T03:53:12.027 回答
0

ImageZoomView类继承。

这个继承的类有一个对您的 RelativeLayout 的引用。

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

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

这样,两个小部件都可以获取事件。

于 2012-07-16T02:26:19.140 回答
0

以免说您的ImageZoomView课程 extends 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就像它是一个按钮(从视图扩展)一样对待。

希望有帮助。

于 2012-07-16T02:26:54.070 回答