Android App页面滑动标题栏颜色渐变详解

作者:任缥缈 时间:2023-10-14 20:08:17 

通常,我们会被要求实现类似支付宝首页的特效:随着界面的滑动,标题栏的背景透明度渐变。

在实际开发中,常见的滑动有列表RecyclerView(ListView)滑动,NestedScrollView(ScrollView)嵌套滑动等等。

本文主要从上述两方面来探讨滑动效果。

一、RecyclerView滑动标题栏渐变

废话不多说,直接撸代码:
布局文件如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:background="@color/white"
    tools:context=".scroll_toolbar.ScrollToolBarActivity">

    <!-- title标题栏-->
    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/white">

        <ImageView
            android:id="@+id/ivBack"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="@dimen/qb_px_20"
            android:gravity="center_vertical"
            android:src="@drawable/theme_toolbar_btn_back_fg_normal0"
            android:textColor="#ffffff" />

        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="#666666"
            android:textSize="16sp"
            android:padding="@dimen/qb_px_20"
            android:text="RecyclerView控制titleBar渐变"/>
    </android.support.v7.widget.Toolbar>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvZhangjie"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="@dimen/qb_px_50"
        android:layout_marginRight="@dimen/qb_px_50"
        android:layout_marginTop="@dimen/qb_px_20"
        android:background="@color/back_ground"/>
</LinearLayout>

Java代码如下:

private void toolBarColor(){
        Toolbar toolbar = findViewById(R.id.toolbar);
        ImageView  ivBack = findViewById(R.id.ivBack);
        TextView tvName = findViewById(R.id.tvName);
        RecyclerView  rvZhangjie = findViewById(R.id.rvZhangjie);
        List<String> stringList = dealData();
        ScrollAdapter scrollAdapter = new ScrollAdapter(this, stringList);
        LinearLayoutManager manager = new LinearLayoutManager(this);
        manager.setOrientation(LinearLayoutManager.VERTICAL);
        rvZhangjie.setLayoutManager(manager);
        rvZhangjie.setAdapter(scrollAdapter);

        rvZhangjie.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                 //toolbar的高度
                toolbarHeight = toolbar.getBottom();
                //滑动的距离
                mDistanceY += dy;
                //当滑动的距离 <= toolbar高度的时候,改变Toolbar背景色的透明度,达到渐变的效果
                if (mDistanceY <= toolbarHeight) {
                    float scale = (float) mDistanceY / toolbarHeight;
                    float alpha = scale * 255;
                    toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0));
                } else {
                    //上述虽然判断了滑动距离与toolbar高度相等的情况,但是实际测试时发现,标题栏的背景色
                    //很少能达到完全不透明的情况,所以这里又判断了滑动距离大于toolbar高度的情况,
                    //将标题栏的颜色设置为完全不透明状态
                    toolbar.setBackgroundResource(R.color.colorPrimary);
                }
            }
        });
}

上面代码中的 dealData()方法很简单就是想一个String型List里面添加数据,没什么难度。

关键点在于给rvZhangjie.addOnScrollListener()也就是给RecyclerView设置滑动监听,并复写onScrolled()方法。该方法里面3个参数:

第一个RecyclerView recyclerView,这个很明显就是目标RecyclerView;
第二个int dx,表示RecyclerView在水平X方向的相对滑动量;
第三个int dy,表示RecyclerView在垂直Y方向的相对滑动量;

我们可以通过累加计算RecyclerView滑动的距离相对于指定距离的百分比,来计算透明度的变化量:

mDistanceY += dy;
float scale = (float) mDistanceY / toolbarHeight;
float alpha = scale * 255;

最后再将alpha透明度值设置给ToolBar:

 toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0));

二、NestedScrollView滑动标题栏渐变

其实NestedScrollView滑动渐变和RecyclerView的滑动渐变原理是一样的,本质上都是监听View滑动的距离,通过距离换算成透明度值。只不过二者的滑动偏移量稍有点不同。

代码细节我就不贴出来了,就说说关键的对NestedScrollView的监听和偏移量的处理:

nsvScroolBack.setOnScrollChangeListener(new View.OnScrollChangeListener() {
        @Override
        public void onScrollChange(View v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            //scrollY > oldScrollY:向上滑动
            //scrollY < oldScrollY:向下滑动
            // scrollY:滚动过的距离。
            toolbarHeight = toolbar.getBottom() * 1.5f;
            if (scrollY <= toolbarHeight){
                float scale = (float)scrollY / toolbarHeight;
                float alpha =scale * 255;
                toolbar.setBackgroundColor(Color.argb((int) alpha, 255, 0, 0));
            }else {
                toolbar.setBackgroundColor(Color.BLUE);
            }
        }
    });

通过上面的代码,很容易发现NestedScrollView滑动渐变和RecyclerView的滑动渐变就一回事。代码实现上差别很细微。不同的是RecyclerView的滑动渐变哪里,我们要通过对dy的累加来获得RecyclerView在垂直方向的滑动偏移量。而在NestedScrollView的滑动渐变里面,NestedScrollView在x或者y方向的滑动偏移量,系统已经帮我们计算出来了:scrollX或者scrollY。然后进行透明度的计算即可。

来源:https://blog.csdn.net/haoyuegongzi/article/details/85053509

标签:Android,App,滑动
0
投稿

猜你喜欢

  • Android弹出窗口实现方法

    2022-05-25 06:27:31
  • Java使用WatchService监控文件内容变化的示例

    2023-02-15 10:10:19
  • C#实现悬浮窗口的方法详解

    2022-06-15 12:29:29
  • Android实现图片缓存与异步加载

    2022-02-25 14:21:06
  • C# 如何调用C++ dll string类型返回

    2023-01-31 02:27:55
  • Android开发中MJRefresh自定义刷新动画效果

    2023-11-27 06:04:20
  • 详解java接口基础知识附思维导图

    2023-11-09 10:07:28
  • 详解Android Studio正式签名进行调试的实现步骤

    2021-12-30 21:56:07
  • Java Spring框架简介与Spring IOC详解

    2021-08-06 03:05:56
  • Android 自定义返回按钮的实例详解

    2023-07-04 01:13:43
  • Elasticsearch percolate 查询示例详解

    2021-07-15 04:57:54
  • Android 开发之BottomBar+ViewPager+Fragment实现炫酷的底部导航效果

    2022-01-07 19:39:20
  • 用C#将图片保存至Oracle BLOB字段中的方法

    2023-06-12 01:29:16
  • ASP.NET C#中Application的用法教程

    2023-09-16 14:09:32
  • JavaMail入门教程之接收邮件(4)

    2023-11-09 03:12:34
  • 详解Java Spring AOP

    2023-09-06 15:40:02
  • SpringBoot v2.2以上重复读取Request Body内容的解决方案

    2022-06-27 11:00:16
  • java实现超市商品库存管理平台

    2022-05-25 10:09:20
  • Java 反射类型Type的用法说明

    2023-01-23 04:15:44
  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    2021-10-20 01:14:56
  • asp之家 软件编程 m.aspxhome.com