关于下拉刷新的实现原理我在上篇文章Android自定义控件之仿美团下拉刷新中已经详细介绍过了,这篇文章主要介绍表盘的动画实现原理
汽车之家的下拉刷新分为三个状态:
第一个状态为下拉刷新状态(pull to refresh),在这个状态下是一个表盘随着下拉的距离动态改变指针的角度
第二个状态为放开刷新状态(release to refresh),在这个状态下是指针角度变化的一个动画
第一个状态的实现:
这个效果我们使用自定义View来实现,我们从汽车之家apk中拿到下拉刷新所用到的两张图片:
我们将第一张图片画在画布上作为背景,接着我们根据当前进度值来动态旋转画布,然后再将第二章图片画在画布上,我们看到表针的旋转实则是画布在旋转。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
//现将第一张图片画在画布上
canvas.drawBitmap(finalBackGroundBitmap,0,0,null);
//旋转画布
canvas.rotate(mCurrentProgress*2.7f,x/2,y/2);
//将第二张图片画在旋转后的画布上
canvas.drawBitmap(finalPointerBitmap, 0, 0, null);
}
自定义View的完整代码如下:
/**
* Created by zhangqi on 15/10/17.
*/
public class AutoHome extends View{
private Bitmap backGroundBitmap;
public Bitmap pointerBitmap;
private int x;
private int y;
private Bitmap finalBackGroundBitmap;
private Bitmap finalPointerBitmap;
private float mCurrentProgress;
public AutoHome(Context context) {
super(context);
init(context);
}
public AutoHome(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public AutoHome(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
backGroundBitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(contex