本文实例为大家分享了Android实现水波纹扩散效果的具体代码,供大家参考,具体内容如下

先上图

囧!没有图片所以就拿了小安代替了。

先看一下如何使用这个View。

android:layout_width="200dp"

android:layout_height="200dp"

app:btn_img_res="@drawable/rd"

app:ripple_img_res="@drawable/rd">

是的,没有别的代码了,就这么简单

实现思路

自定义ViewGroup,创建一个用显示图片的view,在创建几个,大小相同的ImageView。当按下时,对这几个ImageView进行放大和渐变。

代码

首先它肯定是一个正方形。

@Override

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

super.onMeasure(widthMeasureSpec, widthMeasureSpec);

if (!mInitDataSucceed){

initData();

}

}

显示图片的View的大小,该怎么给?这是个比较蛋疼的问题。给大了就看不到扩散效果了,给小,给多少的值合适呢?有没有正好的值,有的用父 view 的 size / 子 view 放大的倍数,这样肯定会达到理想的效果。

private static final int ANIMATION_EACH_OFFSET = 800; // 每个动画的播放时间间隔

private static final int RIPPLE_VIEW_COUNT = 3;//波纹view的个数

private static final float DEFAULT_SCALE = 1.6f;//波纹放大后的大小

//点击有扩散效果的view

private CircleImageView mBtnImg;

private int mBtnViewHeight;

private int mBtnViewWidth;

private float mScale = DEFAULT_SCALE;

//图片资源

private int mBtnImgRes;

private int mRippleRes;

//是否初始化完成

private boolean mInitDataSucceed = false;

private void initData(){

if (getMeasuredHeight() > 0 && getMeasuredWidth() > 0){

mInitDataSucceed = true;

int height = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();

int width = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();

mBtnViewHeight = (int) (height / mScale);

mBtnViewWidth = (int) (width / mScale);

mBtnImg = new CircleImageView(getContext());

mBtnImg.setImageResource(mBtnImgRes);

mBtnImg.setOnTouchListener(this);

addView(mBtnImg, getWaveLayoutParams());

for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){

//创建view

CircleImageView wave = createWave();

mWaves.add(wave);

//创建动画

mAnimas.add(getNewAnimationSet());

addView(wave, 0, getWaveLayoutParams());

}

}

}

private CircleImageView createWave(){

CircleImageView CircleImageView = new CircleImageView(getContext());

CircleImageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

CircleImageView.setImageResource(mRippleRes);

return CircleImageView;

}

private LayoutParams getWaveLayoutParams(){

LayoutParams lp = new LayoutParams(mBtnViewWidth, mBtnViewHeight);

return lp;

}

private AnimationSet getNewAnimationSet() {

AnimationSet as = new AnimationSet(true);

ScaleAnimation sa = new ScaleAnimation(1f, mScale, 1f, mScale,

ScaleAnimation.RELATIVE_TO_SELF, 0.5f,

ScaleAnimation.RELATIVE_TO_SELF, 0.5f);

sa.setDuration(ANIMATION_EACH_OFFSET * 3);

sa.setRepeatCount(-1);// 设置循环

AlphaAnimation aniAlp = new AlphaAnimation(1, 0.1f);

aniAlp.setRepeatCount(-1);// 设置循环

as.setDuration(ANIMATION_EACH_OFFSET * 3);

as.addAnimation(sa);

as.addAnimation(aniAlp);

return as;

}

View 都初始化完成了,好像还差一步,onLayout,只要把子 View 都显示到中先就可以了。

@Override

protected void onLayout(boolean changed, int left, int top, int right, int bottom) {

if (mInitDataSucceed) {

int childLeft = (getMeasuredWidth() - mBtnViewWidth) / 2;

int childTop = (getMeasuredHeight() - mBtnViewHeight) / 2;

for (int i = 0; i < RIPPLE_VIEW_COUNT; i++) {

CircleImageView wave = mWaves.get(i);

wave.layout(childLeft, childTop, mBtnViewWidth + childLeft, mBtnViewHeight + childTop);

}

mBtnImg.layout(childLeft, childTop, mBtnViewWidth + childLeft, mBtnViewHeight + childTop);

}else {

initData();

}

}

最后处理一下图片的onTouch事件。

@Override

public boolean onTouch(View v, MotionEvent event) {

switch (event.getAction()) {

case MotionEvent.ACTION_DOWN:

showWaveAnimation();

break;

case MotionEvent.ACTION_MOVE:

break;

case MotionEvent.ACTION_UP:

case MotionEvent.ACTION_CANCEL:

cancelWaveAnimation();

break;

default:

cancelWaveAnimation();

break;

}

return true;

}

private void showWaveAnimation() {

for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){

Message message = new Message();

message.obj = i;

handler.sendMessageDelayed(message, ANIMATION_EACH_OFFSET * i);

}

}

private void cancelWaveAnimation() {

for (int i = 0; i < RIPPLE_VIEW_COUNT; i++){

CircleImageView wave = mWaves.get(i);

wave.clearAnimation();

}

}

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

int position = (int) msg.obj;

CircleImageView wave = mWaves.get(position);

wave.startAnimation(mAnimas.get(position));

super.handleMessage(msg);

}

};

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持找一找教程网。

android动画水波纹外扩,Android实现水波纹扩散效果相关推荐

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

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

  2. Android动画(图片闪烁、左右摇摆、上下晃动等效果)

    Android动画(图片闪烁.左右摇摆.上下晃动等效果) 通常我们需要一个item连续的播放某一段动画或者循环的执行某个动画,这里我们就可以用到一下技巧. 一.续播 (不知道取什么名字好,就是先播放动 ...

  3. android 动画 最顶层_【Android编程实战】StrandHogg漏洞复现及原理分析_Android系统上的维京海盗...

    0x00 StrandHogg漏洞详情 StrandHogg漏洞 CVE编号:暂无 [漏洞危害] 近日,Android平台上发现了一个高危漏洞 该漏洞允许攻击者冒充任意合法应用,诱导受害者授予恶意应用 ...

  4. Android动画学习记录一(Android动画种类、补间动画和帧动画)

    Android动画学习记录一(动画种类.补间动画和帧动画) 动画种类.补间动画和帧动画 Android动画学习记录一(动画种类.补间动画和帧动画) 一.动画种类 二.View动画 2.1 补间动画 补 ...

  5. android 动画_深入了解一些Android动画

    一.PropertyValuesHolder 阅读本文需要上一文Android属性动画的基础,这样才可以明白接下来要讲什么. 1.理解和使用 PropertyValuesHolder 是ObjectA ...

  6. android 图片闪光动画_剖析Android动画(图片闪烁、左右摇摆、上下晃动等效果) | 学步园...

    图片闪烁,类似这样. 2011-11-22 16:18 上传 左右摇摆: 2011-11-22 17:07 上传 一.续播  (不知道取什么名字好,就是先播放动画A, 接着播放动画B) 有两种方式. ...

  7. android 8.0名字,外媒:Android 8.0可能命名为燕麦饼干

    每当一代全新的Android系统推出时,我们都热衷于给它起一个好吃的甜品名字,这也是谷歌一向的传统.据外媒报道,虽然谷歌还没有为Android 8.0起好代号,但oatmeal cookie(燕麦饼干 ...

  8. android图片晃动动画,剖析Android动画(图片闪烁、左右摇摆、上下晃动等效果)

    通常我们需要一个item连续的播放某一段动画或者循环的执行某个动画,这里我们就可以用到一下技巧. 一.续播(不知道取什么名字好,就是先播放动画A, 接着播放动画B) 有两种方式: 第一种: 分别定义两 ...

  9. Android实现水波纹外扩效果

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

  10. android动画框架,GitHub - azhengyongqin/CustomAnimationFramework: Android自定义曲线路径动画框架...

    Android自定义曲线路径动画框架 最近在一个项目中需要一个像QQ打开个人爱好那样的动画效果如下图: 可以看出每个小球都是以顺时针旋转出来的,说明像这样的曲线动画用Android中自带的平移动画是很 ...

最新文章

  1. 利用gulp处理简单的前端问题
  2. C++高斯赛德迭代法,求线性方程组的解(version1.0)
  3. 项目管理基础培训分享
  4. 对Windows桌面应用程序进行UI自动化测试
  5. what's the difference between atime, ctime and mtime
  6. matlab中关于程序运行的快捷键
  7. XML Schema语法规则
  8. linux性能监控命令
  9. Deformable-DETR的学习笔记
  10. 语音识别芯片的经典应用案例
  11. 运筹优化(十六)--排队论基础及其最优化求解
  12. 敏捷开发免费管理工具——火星人预览(四)
  13. php中中文字符串的截取和获取长度 mb_substr() mb_strlen()
  14. 【指数编制系列六】景气指数编制方法
  15. 科海思除镍树脂CH-90Na
  16. 17个机器学习的常用算法
  17. 移动硬盘弹出文件或目录损坏且无法读取解决办法
  18. Java小例子—薪水计算器(含具体的代码思路)
  19. 软题库 - 软考题库,云题库,智能测试
  20. 软件测试的类型有那些?都有什么不同?

热门文章

  1. EXT.NET 使用总结(2) ---TreePanel(带右键菜单,节点自定义属性)
  2. 利用Exchange 2003实现移动办公新体验
  3. Way back into love
  4. eBay把平台更新为Kubernetes、Envoy和Kafka:计划开源硬件和软件
  5. mysql配置my.cnf文件,以及参数优化提升性能
  6. 使用cookie,点击关闭一天后显示的弹窗
  7. Android中如何使用Intent在Activity之间传递对象[使用Serializable或者Parcelable]
  8. Java中的ReentrantLock和synchronized两种锁机制的对比
  9. emysql: ping VS without ping
  10. Linux Netfilter conntrack对zone的支持