public class TestXferModeRippleView extends TextView { public TestXferModeRippleView(Context context) { super(context); init(); } public TestXferModeRippleView(Context context, AttributeSet attrs) { super(context, attrs); init(); } private void init() { m_Paint = new Paint(Paint.ANTI_ALIAS_FLAG); m_Paint.setColor(Color.GREEN); m_Paint.setTextSize(60); m_Paint.setStyle(Paint.Style.FILL); m_Paint.setStrokeWidth(2f); m_Paint.setColor(Color.BLUE); m_DPoint = new PointF(0, 0); } @Override public boolean onTouchEvent(MotionEvent event) { switch(event.getAction()) { case MotionEvent.ACTION_DOWN: isKeyUP = false; //判断落点,处理点击事件 float pW = event.getX(); float pH = event.getY(); m_Dis[0] = (int)Math.sqrt(Math.pow(pW, 2) + Math.pow(pH, 2)); m_Dis[1] = (int)Math.sqrt(Math.pow(pW, 2) + Math.pow(getHeight() - pH, 2)); m_Dis[2] = (int)Math.sqrt(Math.pow(getWidth() - pW, 2) + Math.pow(pH, 2)); m_Dis[3] = (int)Math.sqrt(Math.pow(getWidth() - pW, 2) + Math.pow(getHeight() - pH, 2)); m_DPoint.set(pW, pH); rippleAnimate(Math.max(m_Dis[0], Math.max(m_Dis[1], Math.max(m_Dis[2], m_Dis[3])))); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: isKeyUP = true; rippleAnimate(0); break; default: break; } return true; } @Override protected void onDraw(Canvas c) { super.onDraw(c); c.save(); // m_Lock.lock(); drawRipple(c); m_Lock.unlock(); c.restore(); } private void drawRipple(Canvas c) { m_Paint.setAlpha(100); c.drawCircle(m_DPoint.x, m_DPoint.y, m_RipRadius, m_Paint); } private void rippleAnimate(final int radius) { if(m_RippleAnimator != null) { m_RippleAnimator.cancel(); m_RippleAnimator = null; } m_RippleAnimator = new Animation() { @Override protected void applyTransformation(float interpolatedTime, Transformation t) { m_RipRadius = (int)(radius * interpolatedTime); TestXferModeRippleView.this.postInvalidate(); if(interpolatedTime == 1) if(isKeyUP) m_RipRadius = 0; } }; m_RippleAnimator.setDuration(500); m_RippleAnimator.setInterpolator(new LinearInterpolator()); startAnimation(m_RippleAnimator); } private boolean isKeyUP; private ReentrantLock m_Lock = new ReentrantLock(); private Paint m_Paint; private PointF m_DPoint; private int m_RipRadius; private final int[] m_Dis = new int[4]; private Animation m_RippleAnimator; }