视图移动后触摸事件的问题

时间:2013-09-18 09:58:42

标签: android android-layout translate-animation

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

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

我的抽屉包含在RelativeLayout中,并且对于打开和关闭它使用TranslateAnimation来重新定位视图,大部分是在屏幕外(只显示句柄)。

我遇到的问题是,当抽屉关闭时,抽屉内的儿童组件会响应同一屏幕位置的触摸事件,就像抽屉打开一样 - 即使它们显然不在那个位置。 / p>

对于我的右侧抽屉,这是特别糟糕的,因为您应该能够单击手柄的区域不起作用,因为正在处理事件而是由于抽屉打开时将处于该位置的组件

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

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

2 个答案:

答案 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