效果图
代码
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;
}
}
转载请注明原文地址: https://ju.6miu.com/read-668315.html