Android实现控件点击波纹扩散效果

效果图

Android实现控件点击波纹扩散效果_第1张图片

代码

public class MyButton extends android.support.v7.widget.AppCompatImageButton {
    private static final String TAG = "MyButton";
    public static final int INVALIDATE_DURATION = 15;
//    每次扩散半径
    public static int DIFUSE_GAP = 10;
//    系统判定为长按事件的时间
    private int longPressTimeout;
    private Paint colofrPaint;
    //背景颜色
    private Paint bgPaint;
//    按下的时间
    private long downTime = 0;
    private int eventX;
    private int eventY;
    private boolean isPushButton;
//    当前半径
    private int shaderRadio;
//    最大半径
    private int maxRadio;
    private int viewwidth;
    private int viewheight;
    public MyButton(Context context) {
        this(context,null);
    }

    public MyButton(Context context, AttributeSet attrs) {
        super(context, attrs);
        initPaint();
//        系统判定长按的时间
        longPressTimeout = ViewConfiguration.getLongPressTimeout();//500
        Log.d(TAG, "MyButton: "+longPressTimeout);
    }
    public void initPaint(){
        colofrPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        bgPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        colofrPaint.setColor(getResources().getColor(R.color.bottom_color));
        bgPaint.setColor(getResources().getColor(R.color.reveal_color));
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                if(downTime==0) {
                    downTime = SystemClock.elapsedRealtime();
                }
                eventX = (int) event.getX();
                eventY = (int) event.getY();
                countMaxRatio();
                isPushButton = true;
                Log.d(TAG, "onTouchEvent: "+maxRadio);
                postInvalidateDelayed(INVALIDATE_DURATION);
                break;
            case MotionEvent.ACTION_MOVE:
                break;
            case MotionEvent.ACTION_UP:
                //判断是否是长按
                if (SystemClock.elapsedRealtime() - downTime < longPressTimeout) {
                    DIFUSE_GAP = 30;
                    postInvalidate();
                } else {
                    clearData();
                }
                break;
        }
        return super.onTouchEvent(event);
    }

    @Override
    protected void dispatchDraw(Canvas canvas) {
        super.dispatchDraw(canvas);
        if(!isPushButton)return;
        //绘制按下后的背景
        canvas.drawRect(0,0,viewwidth,viewheight,bgPaint);
        canvas.save();
        //绘制扩散圆背景
        canvas.clipRect(0,0,viewwidth,viewheight);
        Log.d(TAG, "dispatchDraw: "+shaderRadio);
        canvas.drawCircle(eventX,eventY,shaderRadio,colofrPaint);
        canvas.restore();
        if(shaderRadio0,0,viewwidth,viewheight);
            shaderRadio += DIFUSE_GAP;
        } else{
            clearData();
        }
    }
    //计算最大半径
    public void countMaxRatio(){
        if (viewwidth>viewheight) {
            if(eventX2){
                maxRadio =  viewwidth - eventX;
            } else{
                maxRadio = eventX;
            }
        }else{
            if (eventY < viewheight/2){
                maxRadio = viewheight - eventY;
            }else{
                maxRadio = viewheight/2+eventY;
            }
        }
    }
    public void clearData(){
        downTime = 0;
        DIFUSE_GAP = 10;
        isPushButton = false;
        shaderRadio = 0;
        postInvalidate();
    }

    @Override
    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
        super.onSizeChanged(w, h, oldw, oldh);
        viewwidth = w;
        viewheight = h;
    }
}

你可能感兴趣的:(Android实现控件点击波纹扩散效果)