Android精仿淘宝/QQ空间标题栏渐变效果

声明:本篇文章已授权微信公众号 YYGeeker 独家发布

前言

最近在淘宝上囤年货买买买的时候,注意到淘宝购物详情页的渐变效果,觉得效果还是挺不错的,有种似曾相识的感觉,没错,好像QQ空间的标题栏也是类似的做法。鉴于这种效果在平时可能会用得比较多,所以就自己研究了一下然后把它实现出来了,项目完整demo在文章底部有链接,大家可下载参考研究。文章原创,转载请注明地址:小嵩的CSDN博客,地址:http://blog.csdn.net/qq_22393017

正文

按照惯例,先上一张要实现的效果图吧,有兴趣的小伙伴可以继续往下看。
淘宝APP的实际效果

淘宝购物详情页GIF

自己实现的效果:

淘宝标题渐变效果GIF图
(文章末尾有demo下载地址,可下载demo查看完整源代码)

主要功能点

本文会详细地讲解这个功能的实现思路,主要有以下四个功能点:

  1. 滑动时标题栏透明度渐变。
  2. 标题栏的几个ICON控件在滑动时背景渐变
  3. 在标题栏有透明度时,ICON是白色的;标题栏变成不透明时,ICON替换成灰色。
  4. 头部图片滑动视差效果

以上这四个功能点都是通过手指的滑动距离来进行处理的。那么首先,我们就需要监听获取滑动距离,那么怎样获取这个滑动距离并进行处理呢?不急,咱们慢慢思考,一步一步来。淘宝这个页面的内容部分,应该是用的ScrollView,而原生的ScrollView,它没有提供onScrollChanged的回调方法。所以我们有两种方式:

  • 一种是通过自定义View,让其包含ScrollView子控件。
  • 一种是自定义一个ScrollView,重写onScrollChanged方法。

第一种方式可以参考Android–仿淘宝商品详情(继续拖动查看详情)及标题栏渐变 这篇博客,这篇博客由于写了Scrollview滑动到底部,继续拖动查看详情的动能,所以我就不重复写了,可参考它的实现方式。

这篇文章我们换第二种方式,即自定义Scrollview来实现标题栏渐变。onScrollChanged(int x, int y, int oldx, int oldy)方法有x,y,oldx,oldy四个参数,x,y分别代表着本次滑动时,控件距离原来位置(原点)的X轴、Y轴的距离;oldx,oldy分别代表上一次触发该方法时,控件距离原来位置(原点)的x,y轴距离。由于我们只需要监听Y轴方向,所以只需要传递Y轴方向的参数。所以我们采用接口回调的方式,定义一个接口,在onScrollChanged方法中将滑动的竖直距离y 以及手指滑动方向:isUp利用接口回调到Activity去。

实现步骤

Step1: 自定义ScrollView
package com.titlebargradient.widget;

import android.content.Context;
import android.util.AttributeSet;
import android.widget.ScrollView;

/**
 * TODO<自定义监听滑动的ScrollView>
 *
 * @author: 小嵩
 * @date: 2017/1/9 11:37
 */

public class ObservableScrollView extends ScrollView {
   

    private ScrollViewListener scrollViewListener = null;

    public ObservableScrollView(Context context) {
   
        super(context);
    }

    public ObservableScrollView(Context context, AttributeSet attrs,
                                int defStyle) {
   
        super(context, attrs, defStyle);
    }

    public ObservableScrollView(Context context, AttributeSet attrs) {
   
        super(context, attrs);
    }

    public void setOnScrollListener(ScrollViewListener scrollViewListener) {
   
        this.scrollViewListener = scrollViewListener;
    }

    @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
   
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
   

            if (oldy < y ) {
   // 手指向上滑动,屏幕内容下滑
                scrollViewListener.onScroll(oldy,y,false);

            } else if (oldy > y ) {
   // 手指向下滑动,屏幕内容上滑
                scrollViewListener.onScroll(oldy,y,true);
            }

        }
    }

    public  interface ScrollViewListener{
   //dy Y轴滑动距离,isUp 是否返回顶部
         void onScroll(int oldy,int dy,boolean isUp);
    }
}
Step2. 布局文件引用自定义的Scrollview

控件路径替换成自己项目自定义ScrollView的路径

  <com.titlebargradient.widget.ObservableScrollView
            android:id="@+id/scrollView"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
  </com.titlebargradient.widget.ObservableScrollView>
Step3. xml页面布局编写

完整XML布局代码如下:

activity_scrollview.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <LinearLayout
        android:id="@+id/content"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation
  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
您好!针对您的问题,您可以使用 Android 中的 Toolbar 控件来实现滑动渐变标题栏。 具体实现步骤如下: 1. 在布局文件中添加 Toolbar 控件,并设置其高度为 wrap_content。 2. 在代码中通过 findViewById 获取 Toolbar 对象,并调用 setSupportActionBar 方法将其设置为当前 Activity 的 ActionBar。 3. 在 Activity 的 onCreate 方法中,通过 getSupportActionBar().setDisplayHomeAsUpEnabled(true) 设置标题栏左侧显示返回按钮。 4. 在滑动时,通过监听 RecyclerView 的滚动事件,动态改变标题栏背景颜色透明度,实现滑动渐变效果。 5. 在 onScrollStateChanged 方法中,根据当前滚动状态判断是否需要执行动画效果。 下面是一个简单的示例代码: ```java // 获取 Toolbar 对象 Toolbar toolbar = findViewById(R.id.toolbar); // 将 Toolbar 设置为当前 Activity 的 ActionBar setSupportActionBar(toolbar); // 显示返回按钮 getSupportActionBar().setDisplayHomeAsUpEnabled(true); // 监听 RecyclerView 的滚动事件 recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); if (newState == RecyclerView.SCROLL_STATE_IDLE) { // 滑动停止时执行动画效果 animateToolbarColor(0xFF0000FF, 0x00000000); } } @Override public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); // 获取当前 RecyclerView 的滚动位置 int scrollY = recyclerView.computeVerticalScrollOffset(); // 计算标题栏透明度 int alpha = Math.min(255, scrollY * 2); // 执行动画效果 animateToolbarColor(Color.argb(alpha, 0xFF, 0x00, 0x00), Color.argb(0, 0x00, 0x00, 0x00)); } }); // 改变标题栏背景颜色透明度的动画效果 private void animateToolbarColor(int fromColor, int toColor) { ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), fromColor, toColor); colorAnimation.setDuration(250); colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { toolbar.setBackgroundColor((int) animator.getAnimatedValue()); } }); colorAnimation.start(); } ``` 希望这个示例能够对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值