微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束。

现在简单来实现这样的一个动画功能:

思路: 主要用到了下面的蓝色的图片,定义三个ImageView,background都设置为蓝色的图片,然后定义一个包括缩放和透明度变化的动画集,然后每隔一段时间,让3个ImageView依次启动这个动画集,看起来就像蓝色的圆圈像水波纹向外扩散一样。

    

相关实现逻辑如下:

activity_main.xml

[html] view plaincopy
  1. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent" >
  4. <ImageView
  5. android:id="@+id/wave1"
  6. android:layout_width="150dp"
  7. android:layout_height="150dp"
  8. android:layout_centerInParent="true"
  9. android:background="@drawable/wave"
  10. />
  11. <ImageView
  12. android:id="@+id/wave2"
  13. android:layout_width="150dp"
  14. android:layout_height="150dp"
  15. android:layout_centerInParent="true"
  16. android:background="@drawable/wave"/>
  17. <ImageView
  18. android:id="@+id/wave3"
  19. android:layout_width="150dp"
  20. android:layout_height="150dp"
  21. android:layout_centerInParent="true"
  22. android:background="@drawable/wave" />
  23. <ImageView
  24. android:id="@+id/normal"
  25. android:layout_width="166dp"
  26. android:layout_height="166dp"
  27. android:layout_centerInParent="true"
  28. android:background="@drawable/normal" />
  29. </RelativeLayout>

MainActivity.java

[java] view plaincopy
  1. package com.jackie.waveanimation;
  2. import android.app.Activity;
  3. import android.os.Bundle;
  4. import android.os.Handler;
  5. import android.os.Message;
  6. import android.view.MotionEvent;
  7. import android.view.View;
  8. import android.view.animation.AlphaAnimation;
  9. import android.view.animation.AnimationSet;
  10. import android.view.animation.ScaleAnimation;
  11. import android.widget.ImageView;
  12. public class MainActivity extends Activity {
  13. private ImageView mNormal, mWave1, mWave2, mWave3;
  14. private AnimationSet mAnimationSet1, mAnimationSet2, mAnimationSet3;
  15. private static final int OFFSET = 600;  //每个动画的播放时间间隔
  16. private static final int MSG_WAVE2_ANIMATION = 2;
  17. private static final int MSG_WAVE3_ANIMATION = 3;
  18. private Handler mHandler = new Handler() {
  19. @Override
  20. public void handleMessage(Message msg) {
  21. switch (msg.what) {
  22. case MSG_WAVE2_ANIMATION:
  23. mWave2.startAnimation(mAnimationSet2);
  24. break;
  25. case MSG_WAVE3_ANIMATION:
  26. mWave3.startAnimation(mAnimationSet3);
  27. break;
  28. }
  29. }
  30. };
  31. @Override
  32. protected void onCreate(Bundle savedInstanceState) {
  33. super.onCreate(savedInstanceState);
  34. setContentView(R.layout.activity_main);
  35. mNormal = (ImageView) findViewById(R.id.normal);
  36. mWave1 = (ImageView) findViewById(R.id.wave1);
  37. mWave2 = (ImageView) findViewById(R.id.wave2);
  38. mWave3 = (ImageView) findViewById(R.id.wave3);
  39. mAnimationSet1 = initAnimationSet();
  40. mAnimationSet2 = initAnimationSet();
  41. mAnimationSet3 = initAnimationSet();
  42. mNormal.setOnTouchListener(new View.OnTouchListener() {
  43. @Override
  44. public boolean onTouch(View v, MotionEvent event) {
  45. switch (event.getAction()) {
  46. case MotionEvent.ACTION_DOWN:
  47. showWaveAnimation();
  48. break;
  49. case MotionEvent.ACTION_UP:
  50. clearWaveAnimation();
  51. break;
  52. case MotionEvent.ACTION_CANCEL:
  53. clearWaveAnimation();
  54. }
  55. return true;
  56. }
  57. });
  58. }
  59. private AnimationSet initAnimationSet() {
  60. AnimationSet as = new AnimationSet(true);
  61. ScaleAnimation sa = new ScaleAnimation(1f, 2.3f, 1f, 2.3f,
  62. ScaleAnimation.RELATIVE_TO_SELF, 0.5f,
  63. ScaleAnimation.RELATIVE_TO_SELF, 0.5f);
  64. sa.setDuration(OFFSET * 3);
  65. sa.setRepeatCount(Animation.INFINITE);// 设置循环
  66. AlphaAnimation aa = new AlphaAnimation(1, 0.1f);
  67. aa.setDuration(OFFSET * 3);
  68. aa.setRepeatCount(Animation.INFINITE);//设置循环
  69. as.addAnimation(sa);
  70. as.addAnimation(aa);
  71. return as;
  72. }
  73. private void showWaveAnimation() {
  74. mWave1.startAnimation(mAnimationSet1);
  75. mHandler.sendEmptyMessageDelayed(MSG_WAVE2_ANIMATION, OFFSET);
  76. mHandler.sendEmptyMessageDelayed(MSG_WAVE3_ANIMATION, OFFSET * 2);
  77. }
  78. private void clearWaveAnimation() {
  79. mWave1.clearAnimation();
  80. mWave2.clearAnimation();
  81. mWave3.clearAnimation();
  82. }
  83. }

效果如下:

Android实现水波纹外扩效果相关推荐

  1. android动画水波纹外扩,Android实现水波纹外扩效果的实例代码

    微信曾经推出了一个查找附近好友的功能,大致功能是这样的:屏幕上有一个按钮,长按按钮的时候,会有一圈圈水波纹的动画向外扩散,松手后,动画结束. 现在简单来实现这样的一个动画功能: 思路: 主要用到了下面 ...

  2. android 自定义水波纹点击效果Button

    welcome 效果 ; 技术基础思路 自定义 Button 自定义 Drawable 项目源码 点击查看详情 自定义button 其实这只是一些说法 自定义button,我们只需要将子类继承 but ...

  3. android自定义控件几种,Android 自定义View一个控件搞定多种水波纹涟漪扩散效果 - CSDN博客...

    效果图 实现思路 这个效果实现起来并不难,重要的是思路 此View满足了多种水波纹涟漪扩散效果,这要求它能满足很多的变化 根据上面的样式,可以看出此View需要满足以下变化 圆圈从中心可循环向外扩散 ...

  4. android水平波浪扩散动画,Android实现水波纹扩散效果

    本文实例为大家分享了Android实现水波纹扩散效果的具体代码,供大家参考,具体内容如下 先上图 ?澹∶挥型计??跃湍昧诵"泊?媪恕?/p> 先看一下如何使用这个View. andro ...

  5. Android自定义水波纹动画Layout

    Android自定义水波纹动画Layout 源码是双11的时候就写好了,但是我觉得当天发不太好,所以推迟了几天,没想到过了双11女友就变成了前女友,桑心.唉不说了,来看看代码吧. 展示效果 Hi前辈 ...

  6. android曲线水波纹录音动画,Android-贝塞尔曲线实现水波纹动画

    Android 系统api提供了quadTo和rQuadTo实现二阶贝塞尔曲线,三阶贝塞尔曲线在这不做阐述,只不过是两个控制点. 效果图 首先看张二阶贝赛尔的曲线 Path path = new Pa ...

  7. 震惊!原来Android OpenGL ES可以这样用,实现 (水波纹)涟漪效果超惊艳!

    用几行代码实现惊艳的特效. 作者:字节流动 链接:https://juejin.im/post/5ed9c9445188254344768bd6 水波纹效果原理 最近一个做视频滤镜的朋友,让我给他做一 ...

  8. android自定义水波纹,Android自定义View——实现水波纹效果类似剩余流量球(示例代码)...

    最近突然手痒就想搞个贝塞尔曲线做个水波纹效果玩玩,终于功夫不负有心人最后实现了想要的效果,一起来看下吧: 效果图镇楼 一:先一步一步来分解一下实现的过程 需要绘制一个正弦曲线(sin)或者余弦曲线(c ...

  9. Android 水波纹点击效果(Ripple Effect)

    本文介绍的是Android5.0中其中一个炫酷的效果,点击水波纹扩散效果(Ripple Effect). 以下介绍的实现方式都是调用Android5.0的新API,并非自定义实现,所以只支持在Andr ...

最新文章

  1. 窗函数-减少傅里叶变换泄漏
  2. Git很简单--图解攻略
  3. java将属性练成字符串,Java中通过属性字符串名取属性内容
  4. 特斯拉Model S续航里程提高至409英里 刷新纪录
  5. 解码(一):AVCodecContext解码上下文初始化讲解
  6. flash player 10 音频新API使用:调节音高(pitch)
  7. VS2017更改设置目录一劳永逸的方法
  8. 小白学爬虫:Scrapy入门(四)
  9. Mapreduce概念及流程介绍
  10. H3C 帧中继地址映射
  11. 使用Junit对Android应用进行单元测试
  12. 基于SSM框架的学生学籍管理系统(源码及具体讲解)
  13. Nginx实现会话保持
  14. jedis 源码阅读二——jedisPool
  15. html5播放器的示例代码
  16. ARM系列之ARM 平台安全架构PSA和Trustzone区别 浅析
  17. LDCT图像重建论文——Eformer: Edge Enhancement based Transformer for Medical Image Denoising
  18. Android系统的JNI原理分析(二)- 数据类型转换和方法签名
  19. VC6.0打开崩溃,filetool解决办法[超详细]
  20. Linux Shell中单引号、双引号、反引号的解释

热门文章

  1. 多台无线路由器如何桥接上网
  2. Java绘制海螺_3DMAX制作海螺工艺品教程 - 纳金网
  3. BZOJ2423/HAOI2010 最长公共子序列
  4. ROC曲线面积AUC详解 --转载
  5. 203计算机毕业设计
  6. 电脑桌面待办事项提醒怎么样设置?
  7. wms仓储管理的特点与难点是什么?
  8. 流程圣经:流程绩效管理
  9. 玩猫和老鼠手游总是被车队虐?最强的单排玩猫上分攻略来啦
  10. 镇江首批35名援湖北医疗队员平安归来