版权声明:本文为博主原创文章,未经博主允许不得转载。 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);
小节:
实现方法有多种,不过我刚好用到了他,大家共同学习进步