Android触摸事件解析(自定义DrawerLayout)

2017-05-07  本文已影响0人  MLLWF

基础知识概述:

首先来了解三个方法:

之后我们在说一下能够触发这三个方法传递触摸事件的容器:

事件相关方法 | 方法功能 | Activity | ViewGroup | View
---||||---|||---
public boolean dispatchTouchEvent | 事件分发 | Yes | Yes | Yes
public boolean onInterceptTouchEvent | 事件拦截 | No | Yes | No
public boolean onTouchEvent | 事件消费 | Yes | Yes | Yes

代码示例

需求:我想用DrawerLayou类来做滑动侧边看,但是有一个问题,就是当侧边栏打开的时候,主屏幕会变暗并且不能触发点击事件,我现在想通过自定义的形式解决这一问题,并且当侧边栏打开的时候点击主界面的时候侧边栏不会自定收起。

先看下效果图:


图片.png

再看下布局的资源文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        android:titleTextColor="@color/colorAccent" />
    
    <com.mllwf.slidesidebar.TEDrawerLayout
        android:id="@+id/drawer_layout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.mllwf.slidesidebar.CustormFrameLayout
            android:id="@+id/container"
            android:layout_width="match_parent"
            android:layout_height="match_parent">

            <com.mllwf.slidesidebar.CustormButton
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:gravity="center"
                android:onClick="toCanSlieDrawer"
                android:padding="16dp"
                android:text="是否能滑动" />
        </com.mllwf.slidesidebar.CustormFrameLayout>

        <RelativeLayout
            android:id="@+id/nav_view"
            android:layout_width="150dp"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            android:background="@android:color/darker_gray">

            <Button
                android:id="@+id/btn_one"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:background="@color/colorPrimary"
                android:text="这是顶部按钮"
                android:textColor="@color/colorAccent" />

            <Button
                android:id="@+id/btn_two"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:background="@color/colorPrimary"
                android:text="这是中间的按钮"
                android:textColor="@color/colorAccent" />

            <Button
                android:id="@+id/btn_three"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:background="@color/colorPrimary"
                android:text="这是底部按钮"
                android:textColor="@color/colorAccent" />
        </RelativeLayout>
    </com.mllwf.slidesidebar.TEDrawerLayout>
</LinearLayout>

简要说明(请结合效果图和布局文件):

下面分别看下分别看些这几个自定义布局的相关代码:

首先默认没有打开侧边栏,点击按钮查看日志信息:


图片.png

从上面的日志信息可以看到,是一层层的传递的,这里用一张图解释下上面的传递流程:


图片.png

至于点击主界面不让侧边栏收回,就让主界面在动作为Activity_Up的时候消费事件(onTouchEvent()返回true)就可以了(因为DrawerLayout类在onTouchEvent()方法里关闭了侧边栏)


ViewGroup#onTouchEvent().png DrawerLayout#onTouchEvent().png

最后在总结一下:

项目源码
参考文章
有问题欢迎联系我(1021423736@qq.com)

上一篇下一篇

猜你喜欢

热点阅读