Android圆圈扩散水波动画实现
一、引言
在Android开发中,动画效果的添加不仅可以提升应用的视觉效果,还能增强用户的交互体验,本文将详细介绍如何在Android平台上实现一个常见的动画效果——圆圈扩散水波动画,这种动画效果通常用于按钮点击反馈、界面加载提示等场景。
二、自定义View实现
思路分析
通过Canvas绘制圆,每次改变圆的半径和透明度,当半径达到一定程度后,再次从中心开始绘制新的圆,达到不同层级的效果,通过不断绘制,实现View的扩散效果。
代码实现
(1)定义属性
在res/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>
(2)创建自定义View类
创建一个名为SpreadView
的自定义View类:
public class SpreadView extends View { private Paint centerPaint; // 中心圆paint private int radius = 100; // 中心圆半径 private Paint spreadPaint; // 扩散圆paint private float centerX; // 圆心x private float centerY; // 圆心y private int distance = 5; // 每次圆递增间距 private int maxRadius = 80; // 最大圆半径 private int delayMilliseconds = 33; // 扩散延迟间隔,越大扩散越慢 private List<Integer> spreadRadius = new ArrayList<>(); // 扩散圆层级数,元素为扩散的距离 private List<Integer> alphas = new ArrayList<>(); // 对应每层圆的透明度 public SpreadView(Context context) { this(context, null); } 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); alphas.add(255); spreadRadius.add(0); spreadPaint = new Paint(); spreadPaint.setAntiAlias(true); spreadPaint.setAlpha(255); spreadPaint.setColor(spreadColor); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); centerX = w / 2; centerY = h / 2; } @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 < maxRadius) { alpha = alpha distance > 0 ? alpha distance : 1; alphas.set(i, alpha); spreadRadius.set(i, width + distance); } else if (width >= maxRadius) { spreadRadius.remove(i); alphas.remove(i); i--; } } if (spreadRadius.size() < (maxRadius / distance)) { spreadRadius.add(0); alphas.add(255); } invalidate(); } }
(3)在布局文件中使用自定义View
在activity_main.xml
中添加自定义View:
<com.example.myapp.SpreadView android:layout_width="match_parent" android:layout_height="match_parent"/>
运行效果
通过上述代码,可以实现一个简单的圆圈扩散水波动画效果,当用户触发某个事件时,可以调用invalidate()
方法来重新绘制View,从而实现动画效果。
三、动画实现
思路分析
另一种实现方法是利用Android的动画框架,如ValueAnimator
或ObjectAnimator
,这种方式通常更简洁,但可能不如自定义View那样灵活控制细节,我们可以创建一个AnimatorSet
,组合多个ValueAnimator
来改变圆的半径和透明度,从而形成扩散效果,动画的执行可以通过监听Animator
的事件来控制,例如在动画结束时启动新的扩散动画。
代码实现
(1)创建动画资源文件
在res/anim
目录下创建动画资源文件ripple_animation.xml
:
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <scale android:duration="300" android:fromXScale="0.1" android:fromYScale="0.1" android:toXScale="1.2" android:toYScale="1.2" android:pivotX="50%" android:pivotY="50%"/> <alpha android:duration="300" android:fromAlpha="1.0" android:toAlpha="0"/> </set>
(2)在布局文件中引用动画
在activity_main.xml
中引用动画资源:
<Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Click Me"/>
(3)在Activity中启动动画
在MainActivity.java
中启动动画:
Button button = findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AnimationDrawable animationDrawable = (AnimationDrawable) v.getBackground(); animationDrawable.setVisible(true, true); } });
运行效果
通过上述代码,可以实现一个圆圈扩散水波动画效果,当用户点击按钮时,会触发动画播放,形成一个逐渐扩大并消失的圆圈。
四、归纳与展望
本文介绍了两种实现Android圆圈扩散水波动画的方法:自定义View和动画实现,这两种方法各有优缺点,开发者可以根据具体需求选择合适的实现方式,自定义View方式提供了更高的灵活性和可控性,而动画实现方式则更加简洁高效。
展望
随着Android技术的不断发展和完善,可能会有更多新的方法和工具来实现更加复杂和逼真的动画效果,开发者可以持续关注最新的技术动态,不断提升自己的技术水平和创新能力。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1266932.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复