如何在ScrollView中检测包含多种类型视图的不可见视图

时间:2013-09-27 09:33:10

标签: android

目前,我有代码来检测ScrollView

中的不可见视图
// This is code for class extends from ScrollView
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);

    LinearLayout list = (LinearLayout)this.findViewById(R.id.card_container);

    for (int i = 0; i < list.getChildCount(); ++i) {
        View card = list.getChildAt(i);

        list.getHitRect(mRect);
        // If tag == 'false' and View is visible we know that
        // View became visible during this scroll event.
        if ((Boolean) card.getTag() == false
                && card.getLocalVisibleRect(mRect)) {
            card.startAnimation(AnimationUtils.loadAnimation(getContext(),
                    R.anim.slide_up));                
            card.setTag(true);
        }
    }
}

模仿Google+卡片动画行为。当用户向下滚动时,首次可见的卡片将向上滑动。

为了检查卡片在滚动视图中是否可见,我使用card.getLocalVisibleRect(mRect)

中的技术<ScrollView> <LinearLayout> <LinearLayout card_container> <Card /> <Card /> <Card /> <Card /> <Card /> </LinearLayout> </LinearLayout> </ScrollView>

如果我的布局如下,这很有效。

<ScrollView>
    <LinearLayout>
        <LinearLayout button_container>
            <Button />
            <Button />
            <Button />
        </Linear>
        <LinearLayout card_container>
            <Card />
            <Card />
            <Card />
            <Card />
            <Card />
        </LinearLayout>
    </LinearLayout>
</ScrollView>

根据上面的代码和布局,系统会知道我第一次向下滚动,从第4位开始的卡片是不可见的。

但是,如果我在卡片顶部添加一些其他视图

{{1}}

添加按钮容器后,我希望系统让我知道,从第2个位置开始的卡片是不可见的(因为某些先前的空间被按钮容器占用)。

然而,系统仍然让我知道,从第4位开始的卡片是不可见的。 (这是不正确的)

有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

我使用getGlobalVisibleRect。不确定这是一个很好的解决方案。

// This is code for class extends from ScrollView
@Override
public void onScrollChanged(int l, int t, int oldl, int oldt) {
    super.onScrollChanged(l, t, oldl, oldt);

    LinearLayout list = (LinearLayout)this.findViewById(R.id.card_container);


    for (int i = 0; i < list.getChildCount(); ++i) {
        View card = list.getChildAt(i);

        // If tag == 'false' and View is visible we know that
        // View became visible during this scroll event.
        if ((Boolean) card.getTag() == false
                && card.getGlobalVisibleRect(mRect)) {
            card.startAnimation(AnimationUtils.loadAnimation(getContext(),
                    R.anim.slide_up));                
            card.setTag(true);
        }
    }
}