废话不多说,上图
项目需求是默认显示白色返回按钮,及白色文字栏为透明.滑动到第一屏看不到的时候将白色背景以渐变的形式显示.并且将文字及返回图标变为深色.
首先获取要开始进行渐变位置的高及滑动到某处标题完全显示的高并设置ScrollView滑动监听,(使用kotlin,java自行转换)
titlHeight = DisplayUtil.dip2px(this, 60f)
windowHeight = DisplayUtil.getDensityHeight(this) - titlHeight
scrollHeight = DisplayUtil.getDensityHeight(this) - (titlHeight * 2)
因为我的需求是先显示一整屏,然后显示到两倍标题栏高度的时候开始渐变,到标题栏高度的时候完全显示.
sv.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
when {
scrollHeight > scrollY -> {
//滑动小于开始渐变的位置 标题栏为透明 图标及文字为白色
setTitleViewAlpha(0f)
}
scrollY in scrollHeight..windowHeight -> {
//alpha 为控件的透明程度 0完全透明 1 不透明
var alpha = (scrollY - scrollHeight) * 1.0 / titlHeight
setTitleViewAlpha(alpha.toFloat())
}
else -> {
//滑动大于完全显示的位置 标题栏为白色 图标及文字为深色
setTitleViewAlpha(1f)
}
}
})
private fun setTitleViewAlpha(alpha: Float) {
when (alpha) {
0f -> { //为0时 则白色文字及图标显示 父布局background为透明
//设置控件的background的alpha 取值为0~255
//设置控件的alpha 取值为0~1
ll_title.background.alpha = 0
ivLeft_white.alpha = 1f
ivLeft.alpha = 0f
tvTitleWhite.alpha = 1f
tvTitle.alpha = 0f
tvTitle.visibility = View.INVISIBLE
tvTitleWhite.visibility = View.VISIBLE
ivLeft.visibility = View.INVISIBLE
ivLeft_white.visibility = View.VISIBLE
}
1f -> { //为1时 则深色文字及图标显示 父布局background为白色
ll_title.background.alpha = 255
ivLeft_white.alpha = 0f
ivLeft.alpha = 1f
tvTitleWhite.alpha = 0f
tvTitle.alpha = 1f
tvTitle.visibility = View.VISIBLE
tvTitleWhite.visibility = View.GONE
ivLeft.visibility = View.VISIBLE
ivLeft_white.visibility = View.GONE
}
else -> { //其余则设置alpha即可
ll_title.background.alpha = (alpha * 255).toInt()
ivLeft_white.alpha = 1f - alpha
ivLeft.alpha = alpha
tvTitleWhite.alpha = 1f - alpha
tvTitle.alpha = alpha
tvTitle.visibility = View.VISIBLE
tvTitleWhite.visibility = View.VISIBLE
ivLeft.visibility = View.VISIBLE
ivLeft_white.visibility = View.VISIBLE
}
}
}
布局中两个返回按钮 两个文本 一个白色一个深色,通过alpha来控制
补上工具类DisplayUtil
public class DisplayUtil {
public static float getDensity(Context context) {
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
return dm.density;
}
public static int getDensityWdith(Context context) {
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
return dm.widthPixels;
}
public static int getDensityHeight(Context context) {
Resources resources = context.getResources();
DisplayMetrics dm = resources.getDisplayMetrics();
return dm.heightPixels;
}
// 1.代码中设置setXXSize的都是px单位,都需要把布局中的dp,sp转成px才能使用
/**
* 根据手机分辨率从 px(像素) 单位 转成 dp
*/
public static int px2dip(Context context, float pxValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (pxValue / scale + 0.5f);
}
/**
* 根据手机分辨率从 dp 单位 转成 px(像素)
*/
public static int dip2px(Context context, float dpValue) {
final float scale = context.getResources().getDisplayMetrics().density;
return (int) (dpValue * scale + 0.5f);
}
/**
* 将px值转换为sp值,保证文字大小不变
*
* @param pxValue
* @param
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int px2sp(Context context, float pxValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (pxValue / fontScale + 0.5f);
}
/**
* 将sp值转换为px值,保证文字大小不变
*
* @param spValue
* @param
* (DisplayMetrics类中属性scaledDensity)
* @return
*/
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}