当前位置: 首页 > 编程笔记 >

Android实现水波纹特效

漆雕升
2023-03-14
本文向大家介绍Android实现水波纹特效,包括了Android实现水波纹特效的使用技巧和注意事项,需要的朋友参考一下

最近需要做个类似于水波纹动画的效果,思考了一下不需要UI切个动态图,Android原生的技术利用动画或者自定义控件都可以实现,下面上个图类似于这样的效果

下面请看第一种动画实现,这种方式较为简单些,就是利用3个ImageView不断地做缩放和渐变的动画。

布局文件定义一下

<RelativeLayout
  android:id="@+id/rl"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:gravity="center"
  android:layout_marginBottom="160dp">
  <!--中心imageView-->
  <ImageView
    android:id="@+id/iv_wave"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
  <!--中间的imageView-->
  <ImageView
    android:id="@+id/iv_wave_1"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
  <!--最外层imageView-->
  <ImageView
    android:id="@+id/iv_wave_2"
    android:layout_width="150dp"
    android:layout_height="150dp"
    android:layout_centerHorizontal="true"
    android:background="@drawable/shape_circle" />
</RelativeLayout>

接下来中间的ImageView保持不变,通过操作另外两个ImageView达到效果

private void setAnim1() {
  AnimationSet as = new AnimationSet(true);
  //缩放动画,以中心从原始放大到1.4倍
  ScaleAnimation scaleAnimation = new ScaleAnimation(1.0f, 1.4f, 1.0f, 1.4f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
  //渐变动画
  AlphaAnimation alphaAnimation = new AlphaAnimation(1.0f, 0.5f);
  scaleAnimation.setDuration(800);
  scaleAnimation.setRepeatCount(Animation.INFINITE);
  alphaAnimation.setRepeatCount(Animation.INFINITE);
  as.setDuration(800);
  as.addAnimation(scaleAnimation);
  as.addAnimation(alphaAnimation);
  iv1.startAnimation(as);
}
private void setAnim2() {
  AnimationSet as = new AnimationSet(true);
  //缩放动画,以中心从1.4倍放大到1.8倍
  ScaleAnimation scaleAnimation = new ScaleAnimation(1.4f, 1.8f, 1.4f, 1.8f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
      ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
  //渐变动画
  AlphaAnimation alphaAnimation = new AlphaAnimation(0.5f, 0.1f);
  scaleAnimation.setDuration(800);
  scaleAnimation.setRepeatCount(Animation.INFINITE);
  alphaAnimation.setRepeatCount(Animation.INFINITE);
  as.setDuration(800);
  as.addAnimation(scaleAnimation);
  as.addAnimation(alphaAnimation);
  iv2.startAnimation(as);
}

接下来就是第二种自定义动画实现

首先定义style文件自定义属性--在values下创建attrs.xml文件

<declare-styleable name="SpreadView">
  <!--中心圆颜色-->
  <attr name="spread_center_color" format="color" />
  <!--中心圆半径-->
  <attr name="spread_radius" format="integer" />
  <!--扩散圆颜色-->
  <attr name="spread_spread_color" format="color" />
  <!--扩散间距-->
  <attr name="spread_distance" format="integer" />
  <!--扩散最大半径-->
  <attr name="spread_max_radius" format="integer" />
  <!--扩散延迟间隔-->
  <attr name="spread_delay_milliseconds" format="integer" />
</declare-styleable>

接下来创建SpreadView继承view,初始化构造方法

public SpreadView(Context context) {
  this(context,null,0);
}
 
public SpreadView(Context context, @Nullable AttributeSet attrs) {
  this(context, attrs,0);
}
 
public SpreadView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  super(context, attrs, defStyleAttr);
  TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.SpreadView, defStyleAttr, 0);
  radius = a.getInt(R.styleable.SpreadView_spread_radius, radius);
  maxRadius = a.getInt(R.styleable.SpreadView_spread_max_radius, maxRadius);
  int centerColor = a.getColor(R.styleable.SpreadView_spread_center_color, ContextCompat.getColor(context, R.color.colorAccent));
  int spreadColor = a.getColor(R.styleable.SpreadView_spread_spread_color, ContextCompat.getColor(context, R.color.colorAccent));
  distance = a.getInt(R.styleable.SpreadView_spread_distance, distance);
  a.recycle();
  centerPaint = new Paint();
  centerPaint.setColor(centerColor);
  centerPaint.setAntiAlias(true);
  //最开始不透明且扩散距离为0
  alphas.add(255);
  spreadRadius.add(0);
  spreadPaint = new Paint();
  spreadPaint.setAntiAlias(true);
  spreadPaint.setAlpha(255);
  spreadPaint.setColor(spreadColor);
}

自定义View的绘制:

@Override
protected void onDraw(Canvas canvas) {
  super.onDraw(canvas);
  for (int i = 0; i < spreadRadius.size(); i++) {
    int alpha = alphas.get(i);
    spreadPaint.setAlpha(alpha);
    int width = spreadRadius.get(i);
    //绘制扩散的圆
    canvas.drawCircle(centerX, centerY, radius + width, spreadPaint);
    //每次扩散圆半径递增,圆透明度递减
    if (alpha > 0 && width < 300) {
      alpha = alpha - distance > 0 ? alpha - distance : 1;
      alphas.set(i, alpha);
      spreadRadius.set(i, width + distance);
    }
  }
  //当最外层扩散圆半径达到最大半径时添加新扩散圆
  if (spreadRadius.get(spreadRadius.size() - 1) > maxRadius) {
    spreadRadius.add(0);
    alphas.add(255);
  }
  //超过8个扩散圆,删除最先绘制的圆,即最外层的圆
  if (spreadRadius.size() >= 8) {
    alphas.remove(0);
    spreadRadius.remove(0);
  }
  //中间的圆
  canvas.drawCircle(centerX, centerY, radius, centerPaint);
  //延迟更新,达到扩散视觉差效果
  postInvalidateDelayed(delayMilliseconds);
}

最后在activity的布局文件中引用自定义属性:

<com.example.louliang.spread.SpreadView
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  app:spread_center_color="@color/colorAccent"
  app:spread_delay_milliseconds="35"
  app:spread_distance="5"
  app:spread_max_radius="90"
  app:spread_radius="150"
  app:spread_spread_color="@color/colorAccent" />

以上两种方法就实现了水波纹的效果,下载完整的demo请点击链接,希望对大家有所帮助。

源码下载:Android实现水波纹特效

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持呐喊html" target="_blank">教程。

 类似资料:
  • 本文向大家介绍Android特效之水波纹的实现,包括了Android特效之水波纹的实现的使用技巧和注意事项,需要的朋友参考一下 前言 水波纹特效,想必大家或多或少见过,在我的印象中,大致有如下几种:      支付宝 "咻咻咻" 式      流量球 "荡漾" 式      真实的水波纹效果,基于Bitmap处理式 话不多说,先来看看效果: 填充式水波纹,间距相等 非填充式水波纹,间距相等 非填充

  • 本文向大家介绍Android实现水波纹效果,包括了Android实现水波纹效果的使用技巧和注意事项,需要的朋友参考一下 一、效果   点击开始:   点击停止: 二、在MainActivity中 三、在activity_main中 四、在WaveView中: 五、在CircleImageView中: 六、在attrs中 以上所述是小编给大家介绍的Android实现水波纹效果,希望对大家有所帮助,如

  • 本文向大家介绍Android实现水波纹扩散效果,包括了Android实现水波纹扩散效果的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了Android实现水波纹扩散效果的具体代码,供大家参考,具体内容如下 先上图 囧!没有图片所以就拿了小安代替了。 先看一下如何使用这个View。 是的,没有别的代码了,就这么简单 实现思路 自定义ViewGroup,创建一个用显示图片的view,在创建

  • 本文向大家介绍Android实现兼容的水波纹效果,包括了Android实现兼容的水波纹效果的使用技巧和注意事项,需要的朋友参考一下 先看看效果图 其实,要实现这一效果很简单,只要分drawable和drawablev21两个文件夹就好了。 普通情况下的selector: v21中的selector: 这里ripple中的color就是按下的水波纹颜色,在里面加入一个item,这个item就会变成背

  • 本文向大家介绍Android自定义View实现水波纹效果,包括了Android自定义View实现水波纹效果的使用技巧和注意事项,需要的朋友参考一下 介绍:水波纹散开效果的控件在 App 里面还是比较常见的,例如 网易云音乐歌曲识别,附近搜索场景。 看下实现的效果: 实现思路: 先将最大圆半径与最小圆半径间距分成几等份,从内到外,Paint 透明度依次递减,绘制出同心圆,然后不断的改变这些同心圆的半

  • 本文向大家介绍Android实现点击Button产生水波纹效果,包括了Android实现点击Button产生水波纹效果的使用技巧和注意事项,需要的朋友参考一下 先上图,看看接下来我要向大家介绍的是个什么东西,如下图: 接下来要介绍的就是如何实现上述图中的波纹效果,这种效果如果大家没有体验过的话,可以看看百度手机卫士或者360手机卫士,里面的按钮点击效果都是这样的,另外Android 5.0以上的版