导语:你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。
你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。
这是一个会动的CheckBox
package com.haijingtech.myview; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.ColorFilter; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.PixelFormat; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.View; /** * Created by liaozhaohai on 2021/9/11. */ public class MyCheckBox extends View { String TAG = "MyCheckBox"; int animetionStep=0; String info=""; boolean isChecked=false; OnStateChangeListener onStateChangeListener; public void setChecked(boolean check) { if(isChecked!=check){ isChecked = check; onStateChangeListener.onStateChange(this,isChecked); } } public boolean isChecked(){ return isChecked; } public String getInfo() { return info; } public void setInfo(String info) { this.info = info; } Paint paint; Handler handler=new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); if(animetionStep>=5 && animetionStep<=10){ if(animetionStep%3==2){ MyCheckBox.this.setRotation(-3); }else if(animetionStep%3==1){ MyCheckBox.this.setRotation(3); }else{ MyCheckBox.this.setRotation(0); } }else{ MyCheckBox.this.setRotation(0); } MyCheckBox.this.invalidate(); } }; @Override public boolean callOnClick() { Log.i(TAG,"callOnCick "+isChecked); isChecked=!isChecked; return super.callOnClick(); } public MyCheckBox(Context context) { super(context); init(); } public MyCheckBox(Context context, @Nullable AttributeSet attrs) { super(context, attrs); init(); } public MyCheckBox(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } public MyCheckBox(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init(){ paint=new Paint(); paint.setColor(0xffaaaaaa); paint.setAntiAlias(true); paint.setStrokeWidth(2); paint.setStyle(Paint.Style.STROKE); startAnimation(); setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { isChecked=!isChecked; onStateChangeListener.onStateChange(MyCheckBox.this,isChecked); } }); } public void setOnStateChangeListener(OnStateChangeListener listener){ onStateChangeListener=listener; } interface OnStateChangeListener{ public void onStateChange(View view, boolean isChecked); } private void startAnimation(){ new Thread(){ @Override public void run() { super.run(); while(true){ try { if(animetionStep>=5 && animetionStep<=10){ Thread.sleep(150); }else{ Thread.sleep(80); } } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(1); animetionStep++; if(animetionStep==16){ animetionStep=0; } } } }.start(); } BitmapDrawable drawable=new BitmapDrawable() { @Override public void draw(@NonNull Canvas canvas) { int w=canvas.getHeight()>canvas.getWidth()?canvas.getWidth():canvas.getHeight(); canvas.drawRoundRect(0,0,w,w,3,3, paint); canvas.save(); } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(@Nullable ColorFilter colorFilter) { } @Override public int getOpacity() { return PixelFormat.UNKNOWN; } }; public static Bitmap drawableToBitmap(Drawable drawable) { int w = drawable.getIntrinsicWidth(); int h = drawable.getIntrinsicHeight(); Bitmap.Config config = drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565; Bitmap bitmap = Bitmap.createBitmap(w, h, config); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, w, h); drawable.draw(canvas); return bitmap; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setColor(0xffaaaaaa); int w=canvas.getHeight()>canvas.getWidth()?canvas.getWidth():canvas.getHeight(); if(animetionStep<=5){ canvas.drawRoundRect(7-animetionStep,7-animetionStep,w-(7-animetionStep),w-(7-animetionStep),3,3, paint); }else if(animetionStep<10){ Matrix m=new Matrix(); if(animetionStep%2==0){ m.setRotate(5); }else{ m.setRotate(-5); } canvas.drawRoundRect(2,2,w-2,w-2,3,3, paint); }else{ canvas.drawRoundRect(animetionStep-8,animetionStep-8,w-(animetionStep-8),w-(animetionStep-8),3,3, paint); } if(isChecked){ //画勾 paint.setColor(Color.BLACK); //canvas.drawCircle(w/2,w/2,w/2-6,paint); canvas.drawLine(8,w/2+4,w/2,w-4,paint); canvas.drawLine(w/2,w-4,w-2,8,paint); } } }
这是个自定义的CheckBox,有动画效果。