Android 顶部标题栏随滑动时的渐变隐藏和渐变显示效果

发布时间 - 2026-01-11 01:45:08    点击率:

各位早上好,话不多说,先上效果图:

注意顶部:首页TextView的变化(显示和隐藏)!

首先分析下:UI状态,其是由RecyclerView添加头部组成+RecyclerView

头部添加和RecyclerView分别引用如下:具体的分装数据的过程这里就不在说明,下篇博客会更加深入的写关于

RecyclerView总添加多种不同type类型

compile 'com.bartoszlipinski.recyclerviewheader:library:1.2.1'
compile 'com.android.support:recyclerview-v7:25.3.1'

第一步:生成布局视图

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       android:background="#f2f2f2"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
  <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
  <TextView
    android:background="#ffffff"
    android:paddingTop="5dp"
    android:paddingBottom="5dp"
    android:gravity="center_horizontal"
    tools:visibility="visible"
    android:textColor="#000000"
    android:textSize="20sp"
    android:id="@+id/home_text"
    android:visibility="invisible"
    android:text="首页"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"/>
</FrameLayout>

第二步:直接上其他主要的代码,其注释很详细,不多说

public class MainActivity extends AppCompatActivity {
  private TextView mTextView;
  private int mTextViewHeight;
  private RecyclerView mRecyclerView;
  private RecyclerViewHeader mRecyclerViewHeader;
  //头部图片(轮播图的高度)
  private int mRecyclerHeaderBannerHeight;
  //头部的高度
  private int mRecyclerHeaderHeight;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    mTextView = (TextView) findViewById(R.id.home_text);
    //recyclerView填充数据(忽略不计)
    initData();
    mRecyclerView = (RecyclerView) findViewById(R.id.recycler);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    mRecyclerView.setAdapter(mAdapter);
    //获取到文本的高度
    mTextViewHeight = mTextView.getHeight();
    //轮播图片的高度--和xml图片的高度是一样的
    mRecyclerHeaderBannerHeight = (int) getResources().getDimension(R.dimen.home_page_banner_height);
    //RecyclerView每个Item之间的距离,和Adapter中设置的距离一样
    final int recyclerItemHeight = (int) getResources().getDimension(R.dimen.home_page_list_item_margin_top);
    //添加头部视图,其布局文件就忽略
    mRecyclerViewHeader = RecyclerViewHeader.fromXml(this, R.layout.list_item_prime_product_header);

    //设置其滑动事件
    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
      @Override
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        //设置其透明度
        float alpha = 0;
        int scollYHeight = getScollYHeight(true, mRecyclerHeaderHeight);
        //起始截止变化高度,如可以变化高度为mRecyclerHeaderHeight
        int baseHeight = mRecyclerHeaderBannerHeight - recyclerItemHeight - mTextViewHeight;
        if(scollYHeight >= baseHeight) {
          //完全不透明
          alpha = 1;
        }else {
        //产生渐变效果
          alpha = scollYHeight / (baseHeight*1.0f);
        }
        mTextView.setAlpha(alpha);
        super.onScrolled(recyclerView, dx, dy);
      }
    });
    //将头部视图添加到RecyclerView中
    mRecyclerViewHeader.attachTo(mRecyclerView);
    //第一次进来其状态显示
    mRecyclerViewHeader.post(new Runnable() {
      @Override
      public void run() {
        mRecyclerHeaderHeight = mRecyclerViewHeader.getHeight();
        mTextViewHeight = mTextView.getHeight();
        mTextView.setVisibility(View.VISIBLE);
        mTextView.setAlpha(0);
      }
    });
  }

第三步:获取其滑动的距离

/**
   * 计算RecyclerView滑动的距离
   * @param hasHead 是否有头部
   * @param headerHeight RecyclerView的头部高度
   * @return 滑动的距离
   */
  private int getScollYHeight(boolean hasHead, int headerHeight) {
    LinearLayoutManager layoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
    //获取到第一个可见的position,其添加的头部不算其position当中
    int position = layoutManager.findFirstVisibleItemPosition();
    //通过position获取其管理器中的视图
    View firstVisiableChildView = layoutManager.findViewByPosition(position);
    //获取自身的高度
    int itemHeight = firstVisiableChildView.getHeight();
    //有头部
    if(hasHead) {
      return headerHeight + itemHeight*position - firstVisiableChildView.getTop();
    }else {
      return itemHeight*position - firstVisiableChildView.getTop();
    }
  }

以上:就可以实现其效果!

以上所述是小编给大家介绍的Android 顶部标题栏随滑动时的渐变隐藏和渐变显示效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# android标题栏滑动显示隐藏  # android  # 标题栏渐变  # Android中自定义标题栏样式的两种方法  # 3种Android隐藏顶部状态栏及标题栏的方法  # Android自定义状态栏颜色与应用标题栏颜色一致  # Android中去掉标题栏的几种方法(三种)  # Android 全屏无标题栏的三种实现方法  # Android中隐藏标题栏和状态栏的方法  # Android 使用CoordinatorLayout实现滚动标题栏效果的实例  # Android ScrollView滑动实现仿QQ空间标题栏渐变  # Android中隐藏状态栏和标题栏的方法汇总(隐藏状态栏、标题栏的五种方法)  # Android实现可折叠式标题栏  # 多说  # 首页  # 小编  # 在此  # 是由  # 给大家  # 第二步  # 所述  # 到第  # 给我留言  # 第三步  # 感谢大家  # 就可以  # 显示效果  # 标题栏  # 不透明  # 早上好  # 疑问请  # 有任何  # 器中 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 网站制作报价单模板图片,小松挖机官方网站报价?  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置  如何用AWS免费套餐快速搭建高效网站?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel Octane如何提升性能_使用Laravel Octane加速你的应用  Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】  Python文本处理实践_日志清洗解析【指导】  JS中对数组元素进行增删改移的方法总结  教你用AI将一段旋律扩展成一首完整的曲子  如何彻底卸载建站之星软件?  黑客如何通过漏洞一步步攻陷网站服务器?  如何在腾讯云服务器上快速搭建个人网站?  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  js实现点击每个li节点,都弹出其文本值及修改  简历在线制作网站免费版,如何创建个人简历?  JS碰撞运动实现方法详解  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  EditPlus中的正则表达式 实战(4)  利用vue写todolist单页应用  Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制  Linux安全能力提升路径_长期防护思维说明【指导】  微信h5制作网站有哪些,免费微信H5页面制作工具?  香港网站服务器数量如何影响SEO优化效果?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  如何注册花生壳免费域名并搭建个人网站?  Laravel怎么配置S3云存储驱动_Laravel集成阿里云OSS或AWS S3存储桶【教程】  用yum安装MySQLdb模块的步骤方法  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  免费制作统计图的网站有哪些,如何看待现如今年轻人买房难的情况?  Laravel模型事件有哪些_Laravel Model Event生命周期详解  北京的网站制作公司有哪些,哪个视频网站最好?  黑客如何利用漏洞与弱口令入侵网站服务器?  音响网站制作视频教程,隆霸音响官方网站?  制作无缝贴图网站有哪些,3dmax无缝贴图怎么调?  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  长沙企业网站制作哪家好,长沙水业集团官方网站?  免费网站制作appp,免费制作app哪个平台好?  如何在服务器上三步完成建站并提升流量?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  Laravel如何处理CORS跨域问题_Laravel项目CORS配置与解决方案  Laravel路由怎么定义_Laravel核心路由系统完全入门指南  Laravel API资源类怎么用_Laravel API Resource数据转换  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  如何在阿里云购买域名并搭建网站?  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel如何发送邮件和通知_Laravel邮件与通知系统发送步骤  Laravel怎么在Controller之外的地方验证数据  Laravel Eloquent关联是什么_Laravel模型一对一与一对多关系精讲