DrawerLayout 默认灵敏度还可以,但是我想让在屏幕一侧做从左到右的滑动手势打开drawerlayout更容易一些。我发现在平板电脑上特别困难,但在某些手机上也是如此。
我在 Web API 的 DrawerLayout 页面中没有看到任何手势或手势控制器引用。有没有人看到可以让我们这样做的东西?
DrawerLayout 默认灵敏度还可以,但是我想让在屏幕一侧做从左到右的滑动手势打开drawerlayout更容易一些。我发现在平板电脑上特别困难,但在某些手机上也是如此。
我在 Web API 的 DrawerLayout 页面中没有看到任何手势或手势控制器引用。有没有人看到可以让我们这样做的东西?
因为android.support.v4.widget.DrawerLayout
我想出了一个技巧,它允许您扩展滑动手势(笔划)可以开始的区域,从而使滑动手势更容易。
破解实现:
// 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
}
解释:
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 ..
}
mLeftDragger
和都是mRightDragger
私有字段,mFieldSize
字段 inViewDragHelper
也是私有的。没有公共方法可以让客户端代码设置这些字段 - 因此黑客依赖于反射,这对于 ViewDragHelper 和 DrawerLayout 类中的内部实现更改很脆弱。
一个简单的手势示例:您可以尝试在屏幕顶部放置2个带圆圈的图像,当您按下一个时跳转到另一层,再次按下前一个圆圈时再次跳转。尝试从一个活动跳到另一个活动,如果你想关闭前一个活动,在你调用下一个活动后,只需使用 .finish(); 关闭前一个活动;