DrawerLayout修改灵敏度?

Dan*_*mot 12 android android-layout

DrawerLayout默认灵敏度没问题,但我想让屏幕一侧的左右滑动手势更容易打开抽象布局.我发现它在平板电脑上特别困难,但在某些手机上也是如此.

我在Web API的DrawerLayout页面中没有看到任何手势或手势控制器引用.有没有人看过允许我们这样做的东西?

ani*_*rov 5

因为android.support.v4.widget.DrawerLayout我想出了一个 hack,它允许你扩展滑动手势(笔画)可以开始的区域,从而使滑动手势更容易。

黑客实施:

    // assuming mDrawerLayout is an instance of android.support.v4.widget.DrawerLayout
    try {

        // get dragger responsible for the dragging of the left drawer
        Field draggerField = DrawerLayout.class.getDeclaredField("mLeftDragger");
        draggerField.setAccessible(true);
        ViewDragHelper vdh = (ViewDragHelper)draggerField.get(mDrawerLayout);

        // get access to the private field which defines
        // how far from the edge dragging can start
        Field edgeSizeField = ViewDragHelper.class.getDeclaredField("mEdgeSize");
        edgeSizeField.setAccessible(true);

        // increase the edge size - while x2 should be good enough,
        // try bigger values to easily see the difference
        int origEdgeSize = (int)edgeSizeField.get(vdh);
        int newEdgeSize = (int) (origEdgeSize * 2); 
        edgeSizeField.setInt(vdh, newEdgeSize);

    } catch (Exception e) {
        // we unexpectedly failed - e.g. if internal implementation of 
        // either ViewDragHelper or DrawerLayout changed
    }
Run Code Online (Sandbox Code Playgroud)

解释:

hack 基于 DrawerLayout 类依赖ViewDragHelper 的实例来处理拖动的事实。有两个实例 - 一个用于左侧抽屉,一个用于右侧抽屉。他们像这样被实例化:

 public DrawerLayout(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);

    ... code omitted for brevity ..

    mLeftDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mLeftCallback);
    mLeftDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_LEFT);
    mLeftDragger.setMinVelocity(minVel);
    mLeftCallback.setDragger(mLeftDragger);

    mRightDragger = ViewDragHelper.create(this, TOUCH_SLOP_SENSITIVITY, mRightCallback);
    mRightDragger.setEdgeTrackingEnabled(ViewDragHelper.EDGE_RIGHT);
    mRightDragger.setMinVelocity(minVel);
    mRightCallback.setDragger(mRightDragger);

    ... code omitted for brevity ..
}
Run Code Online (Sandbox Code Playgroud)

这两个mLeftDraggermRightDragger是私人领域,mFieldSize领域ViewDragHelper也是私有的。没有公共方法可以让客户端代码设置这些字段 - 因此 hack 依赖于反射,这对于 ViewDragHelper 和 DrawerLayout 类中的内部实现更改很脆弱。

奖励:
关于 ViewDragHelper 使用的综合教程


小智 -1

一个简单的手势示例:您可以尝试在顶部屏幕上放置2个带圆圈的图像,当您按下其中一个时跳到另一层,然后再次按下前一个圆圈再次跳转。尝试从一个活动跳转到另一个活动,如果您想关闭前一个活动,在调用下一个活动后只需使用 .finish() 关闭前一个活动即可;