关于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的源码,还是没有找到原因,哈哈。所以说到最后只知道一个解决方法,但是没有找到其原因所在,希望知道原因的同志们指点一下,欢迎指正评论。

2 0
原创粉丝点击