关于android使用design:25.1.0及以上包后,使用自定义behavivor(上拉隐藏,下拉显示)的view隐藏后不再显示的问题
来源:互联网 发布:南海转移国内矛盾知乎 编辑:程序博客网 时间:2024/05/02 19:05
问题描述:我的项目中主页有个右下脚有个悬浮按钮FloatingActionButton,悬浮按钮有个自定义的behavior,效果是下拉隐藏,上拉显示。本来项目用的design包版本是compile ‘com.android.support:design:23.4.0’,后来更新了AndroidStudio,顺便也把design包改为compile ‘com.android.support:design:25.3.0’了,改了之后,主页下拉列表,悬浮按钮可以正常隐藏,但是上拉就不显示了。问题就如下写得小例子所示:
只要把design包版本还原成原来23.4.0就可以了,其实也试了好几个版本的,版本25.1.0及以上版本的都不行了,以下的都可以,这就很尴尬了。
定位问题 从behavior入手,先来看一下代码:
ScaleDownShowBehavior.xml
public class ScaleDownShowBehavior extends FloatingActionButton.Behavior { /*** 隐藏动画是否正在执行。*/ private boolean isAnimatingOut = false; /*加速器*/ public static final LinearOutSlowInInterpolator FAST_OUT_SLOW_IN_INTERPOLATOR = new LinearOutSlowInInterpolator(); public ScaleDownShowBehavior(Context context, AttributeSet attrs) { super(); } /** * 处理竖直方向的滑动 */ @Override public boolean onStartNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View directTargetChild, View target, int nestedScrollAxes) { return nestedScrollAxes == ViewCompat.SCROLL_AXIS_VERTICAL; } @Override public void onNestedScroll(CoordinatorLayout coordinatorLayout, FloatingActionButton child, View target, int dxConsumed, int dyConsumed, int dxUnconsumed, int dyUnconsumed) { //检测第一步 Log.e("onNestedScroll()", "dyConsumed:"+dyConsumed); if ((dyConsumed > 0 || dyUnconsumed > 0) && !isAnimatingOut && child.getVisibility() == View.VISIBLE) {//往下滑 scaleHide(child); } else if ((dyConsumed < 0 || dyUnconsumed < 0) && child.getVisibility() != View.VISIBLE) { scaleShow(child); } } /** * 显示btn * @param child */ private void scaleShow(FloatingActionButton child) { child.setVisibility(View.VISIBLE); ViewCompat.animate(child) .scaleX(1.0f) .scaleY(1.0f) .alpha(1.0f) .setDuration(800) .setListener(null) .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) .start(); } /** * 隐藏btn * @param child */ private void scaleHide(FloatingActionButton child) { ViewCompat.animate(child) .scaleX(0.0f) .scaleY(0.0f) .alpha(0.0f) .setDuration(800) .setInterpolator(FAST_OUT_SLOW_IN_INTERPOLATOR) .setListener(viewPropertyAnimatorListener) .start(); } private ViewPropertyAnimatorListener viewPropertyAnimatorListener = new ViewPropertyAnimatorListener() { @Override public void onAnimationStart(View view) { isAnimatingOut = true; } @Override public void onAnimationEnd(View view) { isAnimatingOut = false; view.setVisibility(View.GONE); //检测第二步 Log.e("onAnimationEnd()", "隐藏按钮"); } @Override public void onAnimationCancel(View arg0) { isAnimatingOut = false; } };}
定位问题的第一步,我先在onNestedScroll()方法中打印一个Log,然后发现,在执行完隐藏操作以后,无论上拉还是下拉,都不在打印Log了,这说明不再执行onNestedScroll()方法了,确切的说不再处理上拉和下拉操作了。第二步,为了确定是第一次滑动结束(即第一次手指从屏幕离开)后,还是动画结束后,onNestedScroll()不再执行。我在onAnimationEnd(View view)方法中又打印了一个Log,然后发现是在动画结束后,onNestedScroll()不再执行了。第三步, 我推测是因为view设置为Gone后,造成的这种现象,所以我旧先把view.setVisibility(View.GONE);这就话先注释了,测试打印的结果显示就是因为view设为GONE之后onNestedScroll()方法不再执行
解决方案: 我抱着测试的态度,把view.setVisibility(View.GONE)修改为view.setVisibility(View.INVISIBLE)。结果还真可以了,效果如下:
到这里,我其实是很疑惑的,为什么GONE不行,INVISIBLE就可以了,所以我把父类所有的override方法重写处理打印Log,看一下是否是因为某个方法的原因导致它俩之间的差异。最后发现view设置为GONE后,动画结束后会再次调用
@Override public boolean layoutDependsOn(CoordinatorLayout parent, FloatingActionButton child, View dependency) { return super.layoutDependsOn(parent, child, dependency); }
view设置为INVISIBLE没有这个现象。然而看了这个方法的解释还有,看了其他方法对它的调用,还是没有原因所在。也推测FloatingActionButton.Behavior的某个方法监听child的显示状态,但是看了FloatingActionButton.Behavior的源码,还是没有找到原因,哈哈。所以说到最后只知道一个解决方法,但是没有找到其原因所在,希望知道原因的同志们指点一下,欢迎指正评论。
- 关于android使用design:25.1.0及以上包后,使用自定义behavivor(上拉隐藏,下拉显示)的view隐藏后不再显示的问题
- 关于项目中依赖的design版本升级过后,项目中的自定义behavivor(上拉隐藏,下拉显示)的view隐藏后不再显示的问题解决方案
- Android FloatingActionButton下拉隐藏后,上拉不显示
- android软键盘的显示后隐藏
- android软键盘的显示后隐藏
- android软键盘的显示后隐藏
- android布局用GONE隐藏后不能显示的问题
- 自定义HUD显示的View,并在指定的时间段后自动隐藏
- android 下拉筛选菜单 view的显示和隐藏动画
- 【Android】(已更新解决方案)更新SDK版本(25)后,自定义FloatingActionButton的Behavior(跟随列表滑动显示隐藏)只隐藏不出现的问题
- RecyclerView上拉隐藏Toolbar,下拉显示
- Tabbar上拉隐藏下拉显示
- Recycleview上拉隐藏与下拉显示
- iOS 解决导航栏隐藏后显示的问题
- 关于华为手机自定义view中NavigationBar显示与隐藏造成高度问题的解决办法
- Android中关于view隐藏显示的参数设置
- cordova SplashScreen插件在android上退出app后不再显示启动画面的问题
- jquery实现的固定位置下拉隐藏上拉显示悬浮导航菜单特效
- Java封装
- Collection和map的区别
- Linux基本知识
- Allegro学习之纠正之前对生成网络表时元件封装的理解错误
- C++函数的重载、覆盖与隐藏
- 关于android使用design:25.1.0及以上包后,使用自定义behavivor(上拉隐藏,下拉显示)的view隐藏后不再显示的问题
- Red and Black POJ
- Llinux 内核源码目录介绍
- Struts数据回显
- 链表的基本操作
- 三种方法求最大公约数,最小公倍数
- Android ThreadLocal理解--续篇
- 算法训练 最大的算式
- KMP字符串模式匹配