0

我正在研究一个简单的滑动抽屉组件。它类似于已弃用的 SlidingDrawer 组件。

我正在扩展 LinearLayout (因为这适合我需要做的事情)。我没有做任何花哨的事情,只是一个把手,你可以点击它来打开和关闭抽屉。

我的抽屉包含在 RelativeLayout 中,为了打开和关闭它,它使用 TranslateAnimation 将视图重新定位在屏幕外(仅显示手柄)。

我遇到的问题是,当抽屉关闭时,抽屉内的子组件会在与抽屉打开时相同的屏幕位置响应触摸事件——即使它们显然不在那个位置。

对于我的右侧抽屉来说,这尤其糟糕,因为您应该能够单击手柄的区域不起作用,因为如果抽屉打开,事件正在由位于该位置的组件处理。

这真的很奇怪。我在 onAnimationEnd 事件中的抽屉上尝试了 requestLayout,但这没有帮助(绝望中我也尝试了 invalidate 和 forceLayout - 也没有工作)。我也尝试在父视图上调用 requestLayout。

关于我还能尝试什么的任何想法?

4

2 回答 2

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);
}

x2y2是之前计算的用于TranslateAnimation的最终 x 和 y 位置,然后在此处重用。

注意:在动画中我使用setFillAfter(true)。您可能会忽略它,然后您以后也不需要clearAnimation(),但我发现这样做会导致闪烁。

我希望这对其他人有帮助。我对 Android 有点菜鸟,非常高兴有任何更正或更好的处理方法!

于 2013-09-18T23:52:00.233 回答
0

3.0 之前的动画系统只更新给定视图的绘图,而不是它的实际边界,包括可触摸区域。

您可以使用较新的动画属性(如果您想支持 prehoneycomb,则需要 9OldAndroids),或者在动画滑动完成后将绘制视图设置为消失。

您也可以尝试使用 offsetLeftAndRight

于 2013-09-18T10:08:33.047 回答