Android开发实现标题随scrollview滑动变色的方法详解
作者:touch_ping 发布时间:2022-10-04 07:52:24
标签:Android,scrollview
本文实例讲述了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


猜你喜欢
- 1.导入jar包: <!--jmsTemplate--> <dependency> <
- 本文实例为大家分享了安装和配置maven环境的具体步骤,供大家参考,具体内容如下下载maven:1.进入官网下载:http://maven.
- 在C#绘制中国象棋棋盘是C#程序设计中GDI+的一个重要组成部分。这也是非常考验编程技巧的操作。在绘制之前首先要对棋盘有一个完整的认识。下面
- 在上一章中,有个问题可能大家都没有注意,Acitivity 在使用startActivityForResult后,可以给另一个的Acitiv
- 一、问题来源项目中遇到 json 模型映射成 RadialGradient 组件的需求,其他参数正常传递即可;唯独 radius 参数效果有
- 在应用程序中使用多个线程的一个好处是每个线程都可以异步执行。对于 Windows 应用程序,耗时的任务可以在后台执行,而使应用程序窗口和控件
- springboot上传文件大小的配置我这里记录两种,一种是设置在配置文件里只有两行代码,一种是加个Bean首先第一种:applicatio
- 本文实例讲述了C#设置软件开机自动运行的方法。分享给大家供大家参考,具体如下:#region/// <summary>/// 开
- 前言 侧滑的实现方式有很多方式来实现,这次总结的ViewDragHe
- 本文主要介绍的是一个球形水波的百分比控件,市面上有各种形形色色的百分比控件,我一直觉得水波是最炫的,UI给了我这个机会,然而网上搜了一大堆,
- 前言最近遇到个小问题,要为几十个文本框添加相同的失去焦点事件,常规的办法是在VS的事件管理器里面添加,但那样太繁琐了,几十个文本框,要加几十
- 学习Java实现飞机航班管理系统,本文有该系统的功能截图,和数据库设计SQL语句供大家参考1.飞机航班管理系统背景本系统模拟飞机航班管理业务
- What内含一个或多个maven模块的SpringBoot项目称为SpringBoot多模块项目Why便于维护 将一个大的单体项目分成多个子
- 先来个效果图觉得不好看可以自己调整1.绘制数据点线状图一般由数据点和连线组成在绘制连线之前,我们先标出数据点这里我选择用Image图片来绘制
- 记录一下在项目中用纯 YML(application.yml 或者 application.properties)文件、Java 代码配置
- 1.使用多线程的几种方式(1)不需要传递参数,也不需要返回参数ThreadStart是一个委托,这个委托的定义为void ThreadSta
- 前言在java里,当我们需要拷贝一个对象时,有两种类型的拷贝:浅拷贝与深拷贝。浅拷贝只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对
- 前言本文主要给大家介绍了关于Spring Boot应用事件监听的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧1.
- 异步方法很好的解决了这些问题,异步执行某个方法,程序立即开辟一个新线程去运行你的方法,主线程包括界面就不会死掉了。异步如何开始,好理解,现在
- 前言在实际生活中,地图是我们经常使用的一种工具,通常我们会用它进行导航,输入一个出发城市,输入一个目的地城市,就可以把路线规划好,而在规划好