android - 在滚动视图中显示视图时通知的方式?

and*_*per 3 android view listener hide scrollview

我有一个简单的问题:

假设我对 scrollView(或水平滚动视图)有一些看法。有什么方法可以添加一个监听器,它会告诉我这样的视图何时进入可见区域的内部和外部?

我见过的唯一类似问题是: Android:如何检查 ScrollView 中的视图是否可见? 但我想在发生此类事件时得到通知(变得隐藏/可见)。

Ris*_*nha 5

子类化您正在使用的视图类(我为 ImageView 做了这个,因为我只是将它们添加到我的滚动视图中):

public class PeekImageView extends ImageView implements ViewTreeObserver.OnScrollChangedListener {
    private static final String LOG_TAG = "PeekImageView";
    private InViewportListener inViewportListener;
    private boolean isInViewport = false;

    public PeekImageView(Context context) {
        super(context);
    }

    public PeekImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public PeekImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public interface InViewportListener {
        void onViewportEnter(PeekImageView view);
        void onViewportExit(PeekImageView view);
    }

    public void setInViewportListener(InViewportListener listener) {
        this.inViewportListener = listener;
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        ViewTreeObserver vto = getViewTreeObserver();
        if (vto != null) {
            vto.addOnScrollChangedListener(this);
        }
    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        ViewTreeObserver vto = getViewTreeObserver();
        if (vto != null) {
            vto.removeOnScrollChangedListener(this);
        }
    }

    @Override
    public void onScrollChanged() {
        Rect bounds = new Rect();
        boolean inViewport = getLocalVisibleRect(bounds);
        Log.d(LOG_TAG, "is in view " + bounds + " : " + inViewport + " ; " + bounds);
        if (inViewportListener != null && isInViewport != inViewport) {
            if (inViewport) {
                inViewportListener.onViewportEnter(this);
            } else {
                inViewportListener.onViewportExit(this);
            }
        }
        isInViewport = inViewport;
    }
}
Run Code Online (Sandbox Code Playgroud)

将 附加InViewportListener到此实例PeekImageView将在视图进入或离开窗口的可见部分(视口)时通知您。