package com.xunao.effectdemo.view; import android.animation.ValueAnimator; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Paint; import android.os.Handler; import android.os.Message; import android.util.AttributeSet; import android.view.View; import android.view.animation.LinearInterpolator; import androidx.annotation.NonNull; import androidx.annotation.Nullable; /** * author : 程中强 * e-mail : 740479946@qq.com * date : 2022/8/2615:10 * desc : * version: 1.0 */ public class MyLikeView extends View { private Context context; private int ivResore; private int dotNum; private Paint mCircle; private Paint mBitmap; private int centerX; private int centerY; private Bitmap bitmap; private Float mBimt; private String canvasType; private Float circleR; private Float circleR0; private Float dotR; private int circleColor; private int[] dotColors; private int width; private int height; private Handler handler; public MyLikeView(@NonNull Context context) { this(context, (AttributeSet)null); } public MyLikeView(@NonNull Context context, @Nullable AttributeSet attrs) { this(context, attrs, -1); } public MyLikeView(@NonNull Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); this.dotNum = 7; this.mBimt = 0.0F; this.canvasType = "Bitmap"; this.circleR = 0.0F; this.circleR0 = 0.0F; this.dotR = 10.0F; this.dotColors = new int[]{-2446854, -868533, -1852250, -13460755, -5117031, -9975379, -2200660}; this.handler = new Handler() { public void handleMessage(Message msg) { super.handleMessage(msg); if (msg.what == 0) { MyLikeView.this.postInvalidate(); } } }; // TypedArray typedArray = context.obtainStyledAttributes(attrs, styleable.MyLikeView); // if (typedArray != null) { // this.ivResore = typedArray.getResourceId(styleable.MyLikeView_bitmap, mipmap.heart); // this.circleColor = typedArray.getColor(styleable.MyLikeView_circleColor, ContextCompat.getColor(context, color.colorPrimary)); // this.dotNum = typedArray.getInteger(styleable.MyLikeView_dotNum, 7); // } // // typedArray.recycle(); this.init(context); this.setOnClickListener(new OnClickListener() { public void onClick(View view) { MyLikeView.this.start(); } }); } protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); if (this.bitmap != null) { this.width = this.bitmap.getWidth() * 4; this.height = this.bitmap.getWidth() * 4; this.setMeasuredDimension(this.width, this.height); } } private void init(Context context) { this.context = context; this.mCircle = new Paint(); this.mCircle.setAntiAlias(true); this.mBitmap = new Paint(); this.mBitmap.setAntiAlias(true); BitmapFactory.Options options = new BitmapFactory.Options(); options.inScaled = false; this.bitmap = BitmapFactory.decodeResource(context.getResources(), this.ivResore, options); } protected void onDraw(Canvas canvas) { super.onDraw(canvas); this.centerX = this.getWidth() / 2; this.centerY = this.getHeight() / 2; String var2 = this.canvasType; byte var3 = -1; switch(var2.hashCode()) { case 68905: if (var2.equals("Dot")) { var3 = 2; } break; case 1990057295: if (var2.equals("Bitmap")) { var3 = 0; } break; case 2018617584: if (var2.equals("Circle")) { var3 = 1; } } switch(var3) { case 0: this.canvasHeart(canvas); break; case 1: this.canvasCircle(canvas); break; case 2: this.canvasDot(canvas); } } private void canvasDot(Canvas canvas) { this.canvasHeart(canvas); if (this.mBimt == 36.0F) { float angleA = 0.0F; float angleB = -0.15707964F; for(int i = 0; i < this.dotNum; ++i) { this.mCircle.setColor(this.dotColors[i]); canvas.drawCircle((float)((double)(this.circleR + 5.0F) * Math.sin((double)angleB)), (float)((double)(this.circleR + 5.0F) * Math.cos((double)angleB)), this.dotR, this.mCircle); angleA = (float)((double)angleA + 6.283185307179586D / (double)this.dotNum); canvas.drawCircle((float)((double)this.circleR * Math.sin((double)angleA)), (float)((double)this.circleR * Math.cos((double)angleA)), this.dotR - 2.0F, this.mCircle); angleB = (float)((double)angleB + 6.283185307179586D / (double)this.dotNum); } } } private void canvasCircle(Canvas canvas) { this.mCircle.setColor(this.circleColor); canvas.drawCircle((float)this.centerX, (float)this.centerY, this.circleR0, this.mCircle); } private void canvasHeart(Canvas canvas) { canvas.translate((float)this.centerX, (float)this.centerY); canvas.drawBitmap(this.bitmap, (float)(-this.bitmap.getWidth() / 2), (float)(-this.bitmap.getWidth() / 2), this.mBitmap); } public void start() { this.circleR = (float)this.bitmap.getWidth(); this.circleR0 = 0.0F; this.dotR = 6.0F; ValueAnimator animator = ValueAnimator.ofFloat(new float[]{0.0F, 72.0F}); animator.setDuration(500L); animator.setInterpolator(new LinearInterpolator()); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { public void onAnimationUpdate(ValueAnimator animation) { Float value = (Float)animation.getAnimatedValue(); if (value <= 36.0F) { MyLikeView.this.mBimt = value; MyLikeView.this.canvasType = "Circle"; } else { MyLikeView.this.canvasType = "Dot"; MyLikeView.this.circleR = MyLikeView.this.circleR + 1.0F; MyLikeView.this.dotR = MyLikeView.this.dotR - 0.2F; } MyLikeView.this.circleR0 = MyLikeView.this.circleR0 + 1.0F; if (value == 72.0F) { MyLikeView.this.mBimt = value / 2.0F; try { Thread.sleep(50L); (new Thread(MyLikeView.this.new progrssThread())).start(); } catch (InterruptedException var4) { var4.printStackTrace(); } } MyLikeView.this.invalidate(); } }); animator.start(); } public void setIvResore(int ivResore) { this.ivResore = ivResore; } public void setCircleColor(int circleColor) { this.circleColor = circleColor; } public void setDotNum(int dotNum, int[] dotColors) { this.dotNum = dotNum; this.dotColors = dotColors; } public class progrssThread implements Runnable { public progrssThread() { } public void run() { while(MyLikeView.this.dotR > 0.0F) { try { Thread.sleep(9L); Message msg = Message.obtain(); msg.what = 0; MyLikeView.this.dotR = MyLikeView.this.dotR - 0.3F; if (MyLikeView.this.circleR < 36.0F) { MyLikeView.this.circleR = MyLikeView.this.circleR + 1.0F; } MyLikeView.this.handler.sendMessage(msg); } catch (InterruptedException var2) { var2.printStackTrace(); } } } } }