通过视图android传递点击事件

时间:2012-11-21 08:53:41

标签: android click

我有框架布局:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_margin="10dp" >

<LinearLayout
    android:id="@+id/widgetView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_margin="10dp"
    android:gravity="center" >
</LinearLayout>

<LinearLayout
    android:id="@+id/widgetOverlayFrame"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:clickable="false" >
</LinearLayout>

第一个布局包含窗口小部件布局,第二个布局是透明的,并且接收onLongClick用于拖动方法。问题是当我想要与窗口小部件交互时,点击某些内容,点击事件由overlayFrame拍摄。如何将click事件通过overlayFrame传递给widgetView?

编辑:

现在我正在尝试将GestureLister附加到overlayFrame LinearLayout,以某种方式查看代表单击和长按的MotionEvent之间的区别。我面临的问题是手势监听器中的OnLongPress总是被调用,无论我做什么,单击还是长按。

这种行为有解释吗? TNX!

5 个答案:

答案 0 :(得分:2)

在我的情况下,我向视图的layoutParams添加了标志,该标志应该已经在以下条件下传递了touch事件:

WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE

这样,视图将忽略所有触摸(例如具有可见性的视图已消失)

答案 1 :(得分:0)

也许设置叠加层的属性android:focusable="false"android:focusableInTouchMode="false"就足够了。

您也可以制作自己的叠加窗口小部件并覆盖其onInterceptTouchEvent方法,以便始终返回false。

public class NotTouchableLinearLayout extends LinearLayout {

    // Override constructors
    // ...

   @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return false;
    }
}

答案 2 :(得分:0)

您应该创建自己的扩展GestureListener的类并覆盖它的LinearLayout方法,而不是在顶部布局上设置onTouchEvent。 在那里你可以实现长按\短按等逻辑。

点击事件将首先发送到窗口小部件布局,并且只有当它不处理它们时(因此onTouchEvent返回false),您将在顶部布局上获得它们。 / p>

修改

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" >

<LinearLayout
android:id="@+id/widgetView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_margin="10dp"
android:gravity="center" >
</LinearLayout>

<com.example.touchtesting.MyLinearLayout
android:id="@+id/widgetOverlayFrame"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false" >
</com.example.touchtesting.MyLinearLayout>

</FrameLayout>

com.example.touchtesting更改为您的包名称。 这是班级:

        public class MyLinearLayout extends LinearLayout{

        public MyLinearLayout(Context context, AttributeSet attrs) {
            super(context, attrs);
        }

        private long startClick = 0;

        @Override
        public boolean onTouchEvent(MotionEvent ev) {
            switch (ev.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    startClick = ev.getEventTime();
                    break;
                case MotionEvent.ACTION_CANCEL:
                case MotionEvent.ACTION_UP:
                    if (ev.getEventTime() - startClick < 500) {
                        Log.i("example","short click");
                    }
                    else {
                        Log.i("example","long click");
                    }
                    break;
            }

            return true;
        }

    }

答案 3 :(得分:0)

您可以用这种方式覆盖onTouchListener,而不是使用GestureListener。

这将在计时器用完时调用longPress,如果它之间有一个up,它将取消LongPress

   CountDownTimer c;
    long time=5000;
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                c= new CountDownTimer(5000, 1000) {
                          public void onTick(long millisUntilFinished) {
                                  time=millisUntilFinished;
                           }

                          public void onFinish() {
                                 Log.i("","LONG PRESS");
                           }}.start();

            break;
            case MotionEvent.ACTION_UP:
                if (time>0) {
                    Log.i("example","short click");
                    c.cancel();
                }
            break;
        }

        return true;
    }

答案 4 :(得分:0)

要获得长时间点击以通过widgetView LinearLayout添加android:longClickable="true"。 (对于普通点击,请添加android:clickable="true"

所以widgetView变为:

<LinearLayout
    android:id="@+id/widgetView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:layout_margin="10dp"
    android:gravity="center" 
    android:longClickable="true">
</LinearLayout>