3

目前,我有代码来检测不可见视图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+ 卡片动画行为。第一次可见的卡片将向上滑动,而用户向下滚动。

为了检查卡片在滚动视图中是否可见,我使用Androidcard.getLocalVisibleRect(mRect)的以下技术:如何检查 ScrollView 内部的视图是否可见?

如果我的布局如下

<ScrollView>
    <LinearLayout>
        <LinearLayout card_container>
            <Card />
            <Card />
            <Card />
            <Card />
            <Card />
        </LinearLayout>
    </LinearLayout>
</ScrollView>

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

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

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

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

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

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

4

1 回答 1

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);
        }
    }
}
于 2013-09-27T10:44:25.967 回答