(请注意,这个问题中所描述的行为仅仅是因为我们正在做的一些看似无关的事情。见.)
我们有一个带有GridView的安卓活动,在RelativeLayout中有一个SlidingDrawer。此活动对跟踪球(或光标键)的响应方式相当奇怪。焦点将在GridView中的项之间移动,但每当光标向“出”GridView的方向移动时。(例如,在顶部向上,在最左边时离开)滑动抽屉打开或关闭。值得注意的是,焦点停留在GridView中的同一项上--它不会移动到滑动的抽屉。
对于一个轨迹球,这是特别可怕的,因为旋转的轨迹球经过你真正的目的地将导致滑动抽屉反复打开和关闭。
我们已经确定可以完全通过重写onTrackballEvent()来关闭跟踪球。我们更愿意让轨迹球和光标在GridView上正常工作,但不会导致滑动抽屉打开或关闭。原则上,我们还希望轨迹球在打开时集中注意滑动抽屉的各种内容。
多么?
发布于 2011-12-01 20:56:05
您可以考虑创建自定义视图,扩展GridView和SlidingDrawer,并为GridView使用onInterceptTouchEvent和onTouchEvent的自定义实现,为SlidingDrawer使用仅针对onInterceptTouchEvent的自定义实现。根据可能在SlidingDrawer上触发的用户交互,您可能不需要实现自定义handle。
对于您的自定义GridView,给它一个可能定义如下的接口:
public interface MyGridViewListener {
public boolean shouldPreventScroll();
}如果打开自定义SlidingDrawer,则返回。返回的值将用于确定是否应该在onInterceptTouchEvent和onTouchEvent方法上执行操作。因此,当打开SlidingDrawer时,在GridView上执行的操作不会触发SlidingDrawer上的任何操作。
活性:
MyGridView gridView = (MyGridView) findViewById(R.id.gridView);
gridView.setMyGridViewListener(new MyGridViewListener() {
@Override
public boolean shouldPreventScroll() {
return slidingDrawer.isOpened();
}
});每当在MyCustomGridView:上发生触摸/跟踪事件时,都会调用shouldIntercept。
private boolean shouldIntercept() {
boolean shouldIntercept = false;
if(myGridViewListener != null) {
shouldIntercept = myGridViewListener.shouldPreventScroll();
}
return shouldIntercept;
}
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
return shouldIntercept() ? true : super.onInterceptTouchEvent(ev);
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
return shouldIntercept() ? true : super.onTouchEvent(ev);
}
@Override
public boolean onTrackballEvent(MotionEvent event) {
return shouldIntercept() ? true : super.onTrackballEvent(event);
}
public MyGridViewListener getMyGridViewListener() {
return myGridViewListener;
}
public void setMyGridViewListener(
MyGridViewListener myGridViewListener) {
this.myGridViewListener = myGridViewListener;
}我希望这能给你指明一个正确的方向,或者至少有所帮助。
发布于 2011-12-01 21:56:33
在玩自定义的滑动抽屉时,我将手柄的布局设置为一些奇数,如下所示
handle.layout(0, 0,0, 0);要使手柄消失,但从屏幕一侧拖动手指仍会打开滑动抽屉,这正是我不想要的,所以我设置了
handle.layout(10000, 10000, 10000, 10000); 它将它移动到可视区域之外,从屏幕一侧拖出的抽屉将不再被手动拉出。在查看了源代码后,它的句柄的位置决定了抽屉的滑动,摆脱了这个句柄,它会解决你的问题。
如果需要打开/关闭抽屉,请调用animateOpen()/animateClose()
https://stackoverflow.com/questions/8314936
复制相似问题