android 滑动透明效果

2018-08-09  本文已影响205人  半夏微凉sheila

文章链接 https://blog.csdn.net/qq_22393017/article/details/54602925
在做类似淘宝上滑的透明效果时 ,用到文章中的滑动渐变的功能,记录一下,主要代码为

//获取dimen属性中 标题和头部图片的高度
final float title_height = getResources().getDimension(R.dimen.title_height);
final float head_height = getResources().getDimension(R.dimen.head_height);

    //滑动事件回调监听(一次滑动的过程一般会连续触发多次)
    scrollView.setOnScrollListener(new ObservableScrollView.ScrollViewListener() {
        @Override
        public void onScroll(int oldy, int dy, boolean isUp) {

            float move_distance = head_height - title_height;
            if (!isUp && dy <= move_distance) {//手指往上滑,距离未超过200dp
                //标题栏逐渐从透明变成不透明
                toolbar.setBackgroundColor(ContextCompat.getColor(ScrollViewActivity.this, R.color.color_white));
                TitleAlphaChange(dy, move_distance);//标题栏渐变
                HeaderTranslate(dy);//图片视差平移

            } else if (!isUp && dy > move_distance) {//手指往上滑,距离超过200dp
                TitleAlphaChange(1, 1);//设置不透明百分比为100%,防止因滑动速度过快,导致距离超过200dp,而标题栏透明度却还没变成完全不透的情况。

                HeaderTranslate(head_height);//这里也设置平移,是因为不设置的话,如果滑动速度过快,会导致图片没有完全隐藏。

                ivBack.setImageResource(R.mipmap.ic_back_dark);
                ivMore.setImageResource(R.mipmap.ic_more_dark);
                ivShoppingCart.setImageResource(R.mipmap.ic_shopping_dark);
                spiteLine.setVisibility(View.VISIBLE);

            } else if (isUp && dy > move_distance) {//返回顶部,但距离头部位置大于200dp
                //不做处理

            } else if (isUp && dy <= move_distance) {//返回顶部,但距离头部位置小于200dp
                //标题栏逐渐从不透明变成透明
                TitleAlphaChange(dy, move_distance);//标题栏渐变
                HeaderTranslate(dy);//图片视差平移

                ivBack.setImageResource(R.mipmap.ic_back);
                ivMore.setImageResource(R.mipmap.ic_more);
                ivShoppingCart.setImageResource(R.mipmap.ic_shopping_cart);
                spiteLine.setVisibility(View.GONE);
            }
        }
    });
}

private void HeaderTranslate(float distance) {
    lvHeader.setTranslationY(-distance);
    ivHeader.setTranslationY(distance/2);
}

private void TitleAlphaChange(int dy, float mHeaderHeight_px) {//设置标题栏透明度变化
    float percent = (float) Math.abs(dy) / Math.abs(mHeaderHeight_px);
    //如果是设置背景透明度,则传入的参数是int类型,取值范围0-255
    //如果是设置控件透明度,传入的参数是float类型,取值范围0.0-1.0
    //这里我们是设置背景透明度就好,因为设置控件透明度的话,返回ICON等也会变成透明的。
    //alpha 值越小越透明
    int alpha = (int) (percent * 255);
    toolbar.getBackground().setAlpha(alpha);//设置控件背景的透明度,传入int类型的参数(范围0~255)

    ivBack.getBackground().setAlpha(255 - alpha);
    ivMore.getBackground().setAlpha(255 - alpha);
    ivShoppingCart.getBackground().setAlpha(255 - alpha);
}
上一篇下一篇

猜你喜欢

热点阅读