1. 预览图
图比较大,有6M左右,网速较慢的请耐心等待
2. 需求拆解
- 首先取得当前ScrollView的滑动距离
- 自定义TitleView,根据滚动距离展示不同的效果
- 标题栏分为3个部分:圆角背景、图标、文字
- 只有在最底部的时候,才显示图标,其他时候不显示图标
- 定义背景和文本的原始位置信息和目标位置信息,然后根据滚动距离动态计算实际的位置信息
- 在onDraw中根据实际位置信息,绘制背景和文字
3. 带滚动监听的ScrollView
低版本的ScrollView是没有类似onScrollChangeListener的监听器的,因为为了实现兼容,需要自己自定义一个ScrollView
/**
* Created by chenchen on 2017/8/31.
*/
public class RollCallbackScrollView extends ScrollView {
private OnScrollChangeListener onScrollChangeListener;
private int threshold = Utils.dip2px(getContext(), 150);
public RollCallbackScrollView(Context context) {
super(context);
}
public RollCallbackScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public RollCallbackScrollView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public void setOnScrollChangeListener(OnScrollChangeListener onScrollChangeListener) {
this.onScrollChangeListener = onScrollChangeListener;
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if (onScrollChangeListener != null) {
onScrollChangeListener.onScrollChanged(l, t, oldl, oldt);
}
}
public interface OnScrollChangeListener {
void onScrollChanged(int l, int t, int oldl, int oldt);
}
}
4. 自定义标题栏控件
因为代码比较简单,解释起来却比较复杂,我就直接在代码中注释,相信大家应该能看得懂
/**
* Created by chenchen on 2017/9/4.
*/
public class AnimTitleView extends View {
//背景的原始颜色和目标颜色
private static final int bgFromColor =Color.parseColor("#CC323744");
private static final int bgToColor =Color.parseColor("#FF2296F3");
//阈值,在这个值内渐变
private static final int Threshold = 300;
// 控件的宽高
private int width;
private int height;
private Paint pai