导语:你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。
你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。
这是一个会动的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,有动画效果。
