Android开发实现标题随scrollview滑动变色的方法详解

作者:touch_ping 时间:2022-10-04 07:52:24 

本文实例讲述了Android开发实现标题随scrollview滑动变色的方法。分享给大家供大家参考,具体如下:

要实现某个view的背景透明度跟随scrollview滑动而改变需要重新scrollview的onOverScrolled方法,该方法随着滑动变化(包括手指滑动、手指移开惯性滑动)而响应,所以最适合做变色处理。

step1:设定布局

由于我们要实现的是滑动时标题的背景透明度改变,固定顶部的标题view不能在srcollview里面跟随滑动,所以需要这样布局:


<FrameLayout
   android:layout_width="match_parent"
   android:layout_height="match_parent">
   <com.****.ScrollChangeScrollView
     android:id="@+id/scrollView"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:fillViewport="true">
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:orientation="vertical">
         <TextView
           android:layout_width="0dp"
           android:layout_height="wrap_content"
           android:layout_weight="1"
           android:drawablePadding="5dp"
           android:drawableTop="@drawable/dicovery_vintner_icon_wine"
           android:gravity="center"
           android:text="葡萄酒"
           android:textColor="@color/hometitlebg" />
     </LinearLayout>
   </com.***.ScrollChangeScrollView>
   <Button
     android:id="@+id/btn_back"
     android:layout_width="match_parent"
     android:layout_height="35dp"
     android:layout_centerVertical="true"
     android:background="@null"
     android:drawableLeft="@drawable/icon_back"
     android:padding="10dp" />
</FrameLayout>

step2:添加需要用到的方法

滑动时,某个view要变色,重新scrollview后,添加方法让其知道该view需要变色


private View mTitleView;
/**
* 变色标题view
* @param view
*/
public void setupTitleView (View view) {
   this.mTitleView = view;
}

滑动时变色需要参考scrollview里面的某个子view的滑动高度,如果该子view上划完全划出屏幕,则标题view背景透明为0:


private View mByWhichView;
/**
* 跟随的view
* @param view
*/
public void setupByWhichView(View view) {
   mByWhichView = view;
}

再添加一个设置,如果不要背景透明度渐变:


private boolean shouldSlowlyChange;
public void setShouldSlowlyChange(boolean slowlyChange) {
   this.shouldSlowlyChange = slowlyChange;
}

step3:代码实现


**
* 滑动时标题变色view
* Created by george.yang on 16/2/21.
*/
public class ScrollChangeScrollView extends ScrollView {
 private View mByWhichView;
 private View mTitleView;
 private boolean shouldSlowlyChange = true;
 public ScrollChangeScrollView(Context context) {
   super(context);
 }
 public ScrollChangeScrollView(Context context, AttributeSet attrs) {
   super(context, attrs);
 }
 public ScrollChangeScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
   super(context, attrs, defStyleAttr);
 }
 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
 public ScrollChangeScrollView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
   super(context, attrs, defStyleAttr, defStyleRes);
 }
 @Override
 public void scrollTo(int x, int y) {
   //这是为了修复noScrllListView嵌套在srcollview时就自动滑动到noscrolllistview的顶部的bug,不影响使用
   if (x == 0 && y == 0 || y <= 0) {
     super.scrollTo(x, y);
   }
 }
 public void setListener(OnScrollListener listener){
   this.mListener = listener;
 }
 public void setShouldSlowlyChange(boolean slowlyChange) {
   this.shouldSlowlyChange = slowlyChange;
 }
 /**
  * 设置透明度渐变的标题view
  * @param view
  */
 public void setupTitleView (View view) {
   this.mTitleView = view;
 }
 /**
  * 跟随的view
  * @param view
  */
 public void setupByWhichView(View view) {
   mByWhichView = view;
 }
 @Override
 protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX,
                boolean clampedY) {
   super.onOverScrolled(scrollX, scrollY, clampedX, clampedY);
   if (scrollY >= mByWhichView.getTop() + mByWhichView.getMeasuredHeight()) {
     mTitleView.setBackgroundColor(Color.BLACK);
   } else if (scrollY>=0) {
     if (!shouldSlowlyChange) {
       mTitleView.setBackgroundColor(Color.TRANSPARENT);
     } else {
       float persent = scrollY * 1f / (mByWhichView.getTop() + mByWhichView.getMeasuredHeight());
       int alpha = (int) (255 * persent);
       int color = Color.argb(alpha,0,0,0);
       mTitleView.setBackgroundColor(color);
     }
   }
   if (mListener!=null) {
     mListener.onScroll(scrollX, scrollY);
   }
 }
}

效果如下:

滑动前

Android开发实现标题随scrollview滑动变色的方法详解

滑动变色中

Android开发实现标题随scrollview滑动变色的方法详解

参考的view超出屏幕后

Android开发实现标题随scrollview滑动变色的方法详解

希望本文所述对大家Android程序设计有所帮助。

来源:http://blog.csdn.net/u010499721/article/details/50724353

标签:Android,scrollview
0
投稿

猜你喜欢

  • IDEA如何自动生成serialVersionUID的设置

    2023-08-09 04:00:33
  • springboot实现FastJson解析json数据的方法

    2023-11-27 22:12:48
  • 一篇文章彻底搞清楚c#中的委托与事件

    2021-09-07 02:24:03
  • Java锁擦除与锁粗化概念和使用详解

    2022-02-09 15:32:30
  • Java 中责任链模式实现的三种方式

    2023-11-08 14:32:31
  • Android 开发程序锁应用简单实例

    2021-10-07 07:41:34
  • Java实现LeetCode(1.两数之和)

    2021-06-03 02:11:19
  • 基于javaMybatis存进时间戳的问题

    2023-11-29 02:55:51
  • SpringBoot小程序推送信息的项目实践

    2021-12-07 04:23:34
  • C# 数独求解算法的实现

    2022-04-04 18:48:57
  • C#泛型类创建与使用的方法

    2023-02-28 21:26:36
  • MyBatis resultMap id标签的错误使用方式

    2022-02-01 05:25:37
  • Android自定义View仿QQ运动步数效果

    2021-06-25 00:11:37
  • 解决@Cacheable在同一个类中方法调用不起作用的问题

    2022-02-19 01:46:54
  • Unity的OnOpenAsset实用案例深入解析

    2021-05-30 01:37:16
  • C#软件注册码的实现代码

    2021-10-14 06:14:38
  • Java中volatile关键字的作用

    2023-06-02 17:02:55
  • SpringBoot 过滤器 Filter使用实例详解

    2021-11-08 13:46:00
  • Java中ArrayList与顺序表的定义与实现方法

    2022-06-08 03:27:12
  • Spring Security中的Servlet过滤器体系代码分析

    2023-03-23 19:05:34
  • asp之家 软件编程 m.aspxhome.com