我正在研究一个简单的滑动抽屉组件。它与已弃用的SlidingDrawer组件类似。
我正在扩展LinearLayout(因为这适合我需要做的事情)。我没有做任何非常花哨的事情,只是一个你点击打开和关闭抽屉的手柄。
我的抽屉包含在RelativeLayout中,并且对于打开和关闭它使用TranslateAnimation来重新定位视图,大部分是在屏幕外(只显示句柄)。
我遇到的问题是,当抽屉关闭时,抽屉内的儿童组件会响应同一屏幕位置的触摸事件,就像抽屉打开一样 - 即使它们显然不在那个位置。 / p>
对于我的右侧抽屉,这是特别糟糕的,因为您应该能够单击手柄的区域不起作用,因为正在处理事件而是由于抽屉打开时将处于该位置的组件
真的很奇怪。我在onAnimationEnd事件中尝试了抽屉上的requestLayout,但这没有帮助(在绝望中我也尝试了invalidate和forceLayout - 也没有用)。我也尝试在父视图上调用requestLayout。
关于我还能尝试什么的任何想法?
答案 0 :(得分:2)
似乎奇怪的触摸事件发生是因为视图已被翻译,并且无论出于何种原因,此翻译也未应用于触摸区域 - 请参阅图。
我通过清除动画(删除翻译)解决了问题,然后使用布局参数重新定位视图。这是一个片段......
@Override
public void onAnimationEnd(Animation a) {
drawer.clearAnimation();
MarginLayoutParams lp = (MarginLayoutParams) drawer.getLayoutParams();
switch (drawer.mAlign) {
case ALIGN_LEFT:
lp.leftMargin = x2;
break;
case ALIGN_RIGHT:
lp.rightMargin = -x;
break;
case ALIGN_TOP:
lp.topMargin = y2;
break;
case ALIGN_BOTTOM:
lp.bottomMargin = -y2;
break;
}
drawer.setLayoutParams(lp);
}
x2 和 y2 是先前计算的最终x和y位置,用于 TranslateAnimation ,然后在此处重复使用。
注意:在动画上我使用 setFillAfter(true)。您可以将其删除,然后您也不需要 clearAnimation(),但我发现这样做会导致闪烁。
我希望这有助于其他人。我对Android来说是一个菜鸟,所以非常高兴任何更正或更好的处理方式!
答案 1 :(得分:0)
3.0之前的动画系统只更新给定视图的绘图,而不是包括可触摸区域在内的实际边界。
您可以使用较新的动画属性(如果您想支持预蜂窝,则需要9OldAndroids),或者在动画完成后将绘图视图设置为已经完成。
您也可以尝试使用offsetLeftAndRight