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

2019-12-10 19:27:22丽君
易采站长站为您分析Android实现点击Button产生水波纹效果,需要的朋友可以参考下  

先上图,看看接下来我要向大家介绍的是个什么东西,如下图: 

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

接下来要介绍的就是如何实现上述图中的波纹效果,这种效果如果大家没有体验过的话,可以看看百度手机卫士或者360手机卫士,里面的按钮点击效果都是这样的,另外Android 5.0以上的版本也出现了这种效果。不多说,下面聊聊具体的怎么实现。

首先大家看到的是三个button,水波纹的出现给我们的错觉是直接将波纹绘制在button上面的,但是这样能做到吗?首先button自己有background和src,如果把半透明的水波纹当作background或者src绘制到button上面,肯定是会损失button原有的样式的。可能有朋友猜想那就把水波纹绘制在屏幕上呗,恭喜这位朋友答对了,至少我是这么干的,具体思路就是,我们自己实现一个layout,在layout中捕捉事件,并对事件进行相应的处理,在down事件中寻找当前用户点击的是哪个view,找出view所在的矩形区域,将一个透明的圆环绘制到这个矩形区域,在up事件中,延时分发view的onclick事件。 

  • 1、自己实现一个layout:
  • 2、重写layout的dispatchTouchEvent方法,在down事件中找出被点击的view。
      public View findTargetView(float x, float y, View anchorView) {
        ArrayList<View> touchablesView = anchorView.getTouchables();
        View targetView = null;
        for (View child : touchablesView) {
          RectF rectF = getViewRectF(child);
          if (rectF.contains(x, y) && child.isClickable()) {
            // 这说明被点击的view找到了
            targetView = child;
            break;
          }
        }
        return targetView;
      }
    

    接着找出view所在的矩形区域,因为要将波纹绘制到该区域:

      public RectF getViewRectF(View view) {
        int[] location = new int[2];
        view.getLocationOnScreen(location);
        int childLeft = location[0];
        int childTop = location[1];
        int childRight = childLeft + view.getMeasuredWidth();
        int childBottom = childTop + view.getMeasuredHeight();
        return new RectF(childLeft, childTop, childRight, childBottom);
      }