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);
}
}
}
效果如下:
滑动前
滑动变色中
参考的view超出屏幕后
希望本文所述对大家Android程序设计有所帮助。
来源:http://blog.csdn.net/u010499721/article/details/50724353
标签:Android,scrollview
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
IDEA如何自动生成serialVersionUID的设置
2023-08-09 04:00:33
![](https://img.aspxhome.com/file/2023/1/57701_0s.png)
springboot实现FastJson解析json数据的方法
2023-11-27 22:12:48
一篇文章彻底搞清楚c#中的委托与事件
2021-09-07 02:24:03
![](https://img.aspxhome.com/file/2023/5/87025_0s.png)
Java锁擦除与锁粗化概念和使用详解
2022-02-09 15:32:30
Java 中责任链模式实现的三种方式
2023-11-08 14:32:31
![](https://img.aspxhome.com/file/2023/5/58915_0s.png)
Android 开发程序锁应用简单实例
2021-10-07 07:41:34
![](https://img.aspxhome.com/file/2023/4/139224_0s.png)
Java实现LeetCode(1.两数之和)
2021-06-03 02:11:19
基于javaMybatis存进时间戳的问题
2023-11-29 02:55:51
SpringBoot小程序推送信息的项目实践
2021-12-07 04:23:34
![](https://img.aspxhome.com/file/2023/4/91114_0s.png)
C# 数独求解算法的实现
2022-04-04 18:48:57
![](https://img.aspxhome.com/file/2023/2/68102_0s.png)
C#泛型类创建与使用的方法
2023-02-28 21:26:36
![](https://img.aspxhome.com/file/2023/3/96433_0s.jpg)
MyBatis resultMap id标签的错误使用方式
2022-02-01 05:25:37
![](https://img.aspxhome.com/file/2023/6/128916_0s.jpg)
Android自定义View仿QQ运动步数效果
2021-06-25 00:11:37
![](https://img.aspxhome.com/file/2023/6/138566_0s.jpg)
解决@Cacheable在同一个类中方法调用不起作用的问题
2022-02-19 01:46:54
![](https://img.aspxhome.com/file/2023/1/62031_0s.png)
Unity的OnOpenAsset实用案例深入解析
2021-05-30 01:37:16
C#软件注册码的实现代码
2021-10-14 06:14:38
Java中volatile关键字的作用
2023-06-02 17:02:55
![](https://img.aspxhome.com/file/2023/1/108381_0s.png)
SpringBoot 过滤器 Filter使用实例详解
2021-11-08 13:46:00
Java中ArrayList与顺序表的定义与实现方法
2022-06-08 03:27:12
![](https://img.aspxhome.com/file/2023/7/67197_0s.png)
Spring Security中的Servlet过滤器体系代码分析
2023-03-23 19:05:34
![](https://img.aspxhome.com/file/2023/3/92553_0s.png)