Android实现点击Button产生水波纹效果

2019-12-10 19:27:22丽君

矩形区域找到之后,这个区域就是我们要绘制的博波纹所在地,上面也说过了,波纹其实就是圆环,绘制圆的画是需要知道圆心坐标和圆的半径,圆心坐标肯定就是down时候的x和y了,但是半径怎么计算合适?大家看到上面的图知道如果view的宽度大于高度,点击view的左下角或者右下角,那么半径基本上就是等于view的宽度,点击view的上部或者下部分,半径就是在0和view的高度之间,具体的计算方式看下图: 

Android实现点击Button产生水波纹效果

那么根据上图,半径的计算方式就应该是:

  float left = circleCenterX - targetTouchRectF.left;
  float right = targetTouchRectF.right - circleCenterX;
  float top = circleCenterY - targetTouchRectF.top;
  float bottom = targetTouchRectF.bottom - circleCenterY;
  // 计算出最大的值则为半径
  rawRadius = Math.max(bottom, Math.max(Math.max(left, right), top));

半径算出来了,虽说圆心就是down时的x和y,但是有个地方还是需要注意的,在绘制圆环的时候提供的圆心坐标的x和y是在本文中是相对于layout的,所以在计算y的时候是需要进行一定处理的:

  /**
   * 获取圆环的中心坐标
   */
  public float[] getCircleCenterPostion(float x,float y){
    int[] location = new int[2];
    float[] mDownPositon = new float[2];
    getLocationOnScreen(location );
    mDownPositon[0] = x;
    mDownPositon[1] = y -location[1];
    return mDownPositon;
  }

圆心坐标和半径都计算好了,记下来就可以绘制圆形波纹了,那么在哪里绘制这个波纹比较合适呢?有朋友立马就说肯定是在onDraw方法里面绘制了,那么恭喜你在我看来你是答错了,我们的layout中是很有很多childview的,而layout是个viewGroup,viewGroup在绘制的时候,是先绘制自身的背景,再绘制自身,再绘制childview,如果在onDraw中绘制波纹,也就意味者后面绘制出来的childView会将我们的波纹遮盖,所以我们就应该等到childview绘制完毕后再来绘制波纹,这样可以保证childview在最顶层。