package com.cheng.animationstudy.customview.meituan;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.view.View;
import com.cheng.animationstudy.R;
/**
* 第一个状态的实现:
* 思路是:当前这个椭圆形有一个进度值,这个进度值从0变为1,
* 然后对这个椭圆形进行缩放,可以使用自定义View来实现这个效果
*/
public class MeiTuanRefreshFirstStepView extends View {
private Bitmap mInitialBitmap;
private Bitmap mEndBitmap;
private Bitmap mScaledBitmap;
private int mMeasuredWidth;
private int mMeasuredHeight;
private float mCurrentProgress;
public MeiTuanRefreshFirstStepView(Context context) {
super(context);
init(context);
}
public MeiTuanRefreshFirstStepView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public MeiTuanRefreshFirstStepView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init(context);
}
private void init(Context context) {
// 初始化椭圆形图片
mInitialBitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.sdd_meituan_pull_image));
// 这个是第二个状态娃娃的图片,之所以要这张图片,是因为第二个状态和第三个状态的图片的大小是一致的,而第一阶段
// 椭圆形图片的大小与第二阶段和第三阶段不一致,因此我们需要根据这张图片来决定第一张图片的宽高,来保证
// 第一阶段和第二、三阶段的View的宽高一致
mEndBitmap = Bitmap.createBitmap(BitmapFactory.decodeResource(getResources(), R.mipmap.sdd_meituan_pull_end_image_frame_05));
}
/**
* 重写onMeasure方法主要是设置wrap_content时 View的大小
* @param widthMeasureSpec
* @param heightMeasureSpec
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 根据设置的宽度来计算高度 设置为符合第二阶段娃娃图片的宽高比例
setMeasuredDimension(measureWidth(widthMeasureSpec), measureWidth(widthMeasureSpec)*mEndBitmap.getHeight()/mEndBitmap.getWidth());
}
/**
* 当wrap_content的时候,宽度即为第二阶段娃娃图片的宽度
* @param widthMeasureSpec
* @return
*/
private int measureWidth(int widthMeasureSpec) {
int result = 0;
int size = MeasureSpec.getSize(widthMeasureSpec);
int mode = MeasureSpec.getMode(widthMeasureSpec);
if (mode == MeasureSpec.EXACTLY) {
result = size;
} else {
result = mEndBitmap.getWidth();
if (mode == MeasureSpec.AT_MOST) {
result = Math.min(result, size);
}
}
return result;
}
/**
* 在onLayout里面获得测量后View的宽高
* @param changed
* @param left
* @param top
* @param right
* @param bottom
*/
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
mMeasuredWidth = getMeasuredWidth();
mMeasuredHeight = getMeasuredHeight();
// 根据第二阶段娃娃宽高 给椭圆形图片进行等比例的缩放
mScaledBitmap = Bitmap.createScaledBitmap(
mInitialBitmap,
mMeasuredWidth,
mMeasuredWidth*mInitialBitmap.getHeight()/mInitialBitmap.getWidth(),
true);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 这个方法是对画布进行缩放,从而达到椭圆形图片的缩放,
// 第一个参数为宽度缩放比例,第二个参数为高度缩放比例,
canvas.scale(mCurrentProgress, mCurrentProgress, mMeasuredWidth/2, mMeasuredHeight/2);
// 将等比例缩放后的椭圆形画在画布上面
canvas.drawBitmap(mScaledBitmap, 0, mMeasuredHeight/4, null);
}
/**
* 设置缩放比例,从0到1 0为最小 1为最大
* @param currentProgress
*/
public void setCurrentProgress(float currentProgress) {
this.mCurrentProgress = currentProgress;
}
}