效果图

代码
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();
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(shaderRadio<maxRadio) {
postInvalidateDelayed(INVALIDATE_DURATION,0,0,viewwidth,viewheight);
shaderRadio += DIFUSE_GAP;
} else{
clearData();
}
}
public void countMaxRatio(){
if (viewwidth>viewheight) {
if(eventX<viewwidth/2){
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;
}
}