RecyclerView滑动监听实现button消失与展现动画

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/firesmog/article/details/81511012

需求说明:

由于界面大小限制,我们写完listview或者recyclerView展现图片后已经占据了整个屏幕,屏幕下方还有个button,我们需要在滑动图片的时候button隐藏,出现图片的时候展现button。

需求分析:

一、给receycleview添加滑动监听事件

二、给button添加动画效果

需求实现:

一、我们要实现滑动监听

//定义自动隐藏监听内部类,实现recycleView滑动监听
public AutoHideListener(Activity activity, View view, Animation hide, int hideDuration, Animation show, int showDuration) {
            _ref = new WeakReference<>(activity);
            _view = view;
            _hide = hide;
            _hideDuration = hideDuration;
            _show = show;
            _showDuration = showDuration;
        }

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            final Activity activity = _ref.get();
            if (activity == null) return;

            switch (newState) {
                case RecyclerView.SCROLL_STATE_IDLE:
                    doOnIdle(activity);
                    break;
                case RecyclerView.SCROLL_STATE_DRAGGING :
                case RecyclerView.SCROLL_STATE_SETTLING:
                    LogUtil.d("SCROLL_STATE_SETTLING");
                    doOnScroll(activity);
                    break;
            }
            //_onScrollChange = false;
        }

        private void doOnScroll(final Activity activity) {
            if (_state != Hide) {
                new Thread() {
                    @Override
                    public void run() {
                        super.run();
                        if (_onScrollChange) {
                            activity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    _state = Hide;
                                    _view.setClickable(false);
                                    _view.startAnimation(_hide);
                                }
                            });
                        }
                    }
                }.start();
            }
        }

        private void doOnIdle(final Activity activity) {
            _onScrollChange = false;
            if (_state != Show) {
                if (_idleThread != null) {
                    synchronized (this) {
                        _idleTime = DefaultIdleTime;
                    }
                } else {
                    _idleTime = DefaultIdleTime;
                    _idleThread = new Thread() {
                        @Override
                        public void run() {
                            super.run();
                            synchronized (this) {
                                while (_idleTime > 0) {
                                    _idleTime -= 100;
                                    SystemClock.sleep(100);
                                }
                            }
                            activity.runOnUiThread(new Runnable() {
                                @Override
                                public void run() {
                                    _view.setClickable(true);
                                    _view.startAnimation(_show);
                                }
                            });
                            SystemClock.sleep(_showDuration);
                            _state = Show;
                            _idleThread = null;
                        }
                    };
                    _idleThread.start();
                }
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            _onScrollChange = true;
        }
    }

二、实现监听方法

private static void setViewAutoHide(final Activity activity, final View view, final RecyclerView list) {
        view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
            @SuppressLint("NewApi")
            @Override
            public void onGlobalLayout() {
                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
                int height = view.getMeasuredHeight() + 2;
                Log.i("TAGAAA", "height=" + height);
                final TranslateAnimation hide = new TranslateAnimation(0, 0, 0, height);
                final int hideDuration = 250;
                hide.setDuration(hideDuration);
                AccelerateDecelerateInterpolator i = new AccelerateDecelerateInterpolator();
                hide.setInterpolator(i);
                hide.setFillAfter(true);
                final TranslateAnimation show = new TranslateAnimation(0, 0, height, 0);
                final int showDuration = 250;
                show.setDuration(showDuration);
                show.setInterpolator(i);
                show.setFillAfter(true);
                list.addOnScrollListener(new AutoHideListener(activity, view, hide, hideDuration, show, showDuration));
            }
        });
    }

三、调用方法

setViewAutoHide(this, btTextWantUpdate,recyclerView);

小节:

实现方法有多种,不过我刚好用到了他,大家共同学习进步

猜你喜欢

转载自blog.csdn.net/firesmog/article/details/81511012
今日推荐