您好,欢迎访问梧州木鱼网络科技有限公司

Android自定义CheckBox 动画效果

发布日期:2021年09月20日     浏览次数:1512
导语:你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。

你有一个苹果,我有一个苹果,我们交换一下,一人还是一个苹果;你有一个思想,我有一个思想,我们交换一下,一人就有两个思想。

这是一个会动的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,有动画效果。


提交新评论