自定义水波扩散图片

公司产品需要一个按钮有一个水波纹扩散的效果,就简单的做了一个。先上图

然后就是源码了,代码很简单 我就不解释了,就是想留着做个纪念

package com.example.administrator.myapplication.view;

import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.os.Handler;
import android.os.Message;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;

import com.example.administrator.myapplication.R;

/**
 * Created by Xuyan on 2017/6/13 0013.
 */

public class MyImageView extends android.support.v7.widget.AppCompatImageView {
    /**
     * 画边框的画笔
     */
    private Paint paint;

    /**
     *边框的颜色
     */
    private int bordColor;

    /**
     * 边框总共的数量
     * @param context
     */
    private final static int Total = 3;

    /**
     * 是否要创建新的边框
     * @param context
     */
    private boolean isBord = true;
    /**
     * 边框半径
     */
    private float bordRadio = 0;


    private RectF rectF ;

    private int alpha=255;

    private int bordWith =10;
    public MyImageView(Context context) {
        super(context);
    }

    public MyImageView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public MyImageView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        TypedArray a =context.obtainStyledAttributes(attrs, R.styleable.MyImageView);
        bordColor = a.getColor(R.styleable.MyImageView_bordcolor, Color.parseColor("#ffffff"));
        a.recycle();
        init();
    }
    public void init(){
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStrokeWidth(bordWith);
        paint.setStyle(Paint.Style.STROKE);
        rectF = new RectF();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int with = setMeasure(widthMeasureSpec,100);
        int height = setMeasure(heightMeasureSpec,100);
        if (with!=height){
            with=Math.max(with,height);
            height =with;
        }
        setMeasuredDimension(with,height);
        rectF.set(0,0,getMeasuredWidth(),getMeasuredWidth());
        new Thread(runnable).start();
    }
    public int setMeasure(int MeasureSpec,int defultsize){
        int model = View.MeasureSpec.getMode(MeasureSpec);
        int size = View.MeasureSpec.getSize(MeasureSpec);
        int result;
        if (model==View.MeasureSpec.EXACTLY){
            result = size;
        }else {
            if (model== View.MeasureSpec.AT_MOST){
                result = Math.max(size,defultsize);
            }else {
                result = defultsize;
            }
        }
        return result;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        for (int i=0;i<Total;i++){
            canvas.drawCircle(getMeasuredHeight()/2,getMeasuredHeight()/2,bordRadio-i*100,paint);
        }

    }
    Handler hanl = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            super.handleMessage(msg);
            if (msg.what==0){
                paint.setAlpha(alpha);
                invalidate();
            }
        }
    };
    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            while (true){
                if (bordRadio>getMeasuredWidth()/2){
                    bordRadio = 0;
                    bordWith =10;
                    alpha=255;
                }else {
                    bordRadio=bordRadio+2;
                    alpha =(alpha-(int)(bordRadio/255))<0?0:(alpha-(int)(bordRadio/255));
                    bordWith +=10;
                }
                try {
                    Thread.sleep(20);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                hanl.sendEmptyMessage(0);
            }

        }
    };
    /**
     * 设置圆环半径
     */
    public  void setRadio(int bordRadio){
        if (bordRadio>getMeasuredHeight()/2){
            this.bordRadio = getMeasuredHeight()/2;
        }else {
            this.bordRadio = bordRadio;
        }
    }
    /**
     * 设置圆环初始的边框宽度
     */
    public void setBordWith(int bordWith){
        if (bordWith>50||bordWith<0){
            bordWith=10;
        }else {
            this.bordWith =bordWith;
        }

    }
}

猜你喜欢

转载自blog.csdn.net/u013487404/article/details/73198515