Android SpringAnimation弹性动画解析
程序员文章站
2022-06-20 22:50:22
也许你想在android上实现这种反弹的动画效果。android support library 25.3.0引入了dynamic-animation增强动画,里面提供了几...
也许你想在android上实现这种反弹的动画效果。android support library 25.3.0引入了dynamic-animation增强动画,里面提供了几个类用于使动画呈现实现真实的物理效果。
你会想,自己的动画里加上 bounceinterpolator或overshootinterpolator 插值器也能达到这种效果,然而实际上达不到。当然你也可以自己写插值器,如果你不嫌麻烦的话。
springanimation弹性动画实现方法
gradle引入,最低支持api16
dependencies { compile 'com.android.support:support-dynamic-animation:25.3.0' }
定义springforce,定义弹性特质
springforce spring = new springforce(finalposition); spring.setstiffness(stiffness); spring.setdampingratio(dampingratio);
定义springanimation,并关联springforce对象
springanimation animation = new springanimation(view, property); animation.setspring(spring);
代码如下
positionactivity.java
public class positionactivity extends appcompatactivity { float stiffness = springforce.stiffness_medium;//硬度 float damping_ratio = springforce.damping_ratio_high_bouncy;//阻尼 springanimation xanimation;//x方向 springanimation yanimation;//y方向 view movingview;//图片 float dx = 0f; float dy = 0f; @override public void oncreate(@nullable bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_position); movingview = findviewbyid(r.id.movingview); // 以图片的初始位置创建动画对象 movingview.getviewtreeobserver().addongloballayoutlistener(new viewtreeobserver.ongloballayoutlistener() { @override public void ongloballayout() { xanimation = createspringanimation( movingview, springanimation.x, movingview.getx(), stiffness, damping_ratio); yanimation = createspringanimation( movingview, springanimation.y, movingview.gety(), stiffness, damping_ratio); //初始位置确定,移除监听 movingview.getviewtreeobserver().removeongloballayoutlistener(this); } }); movingview.setontouchlistener(new view.ontouchlistener() { @override public boolean ontouch(view view, motionevent event) { switch (event.getactionmasked()) { case motionevent.action_down: // 计算到左上角的距离 dx = view.getx() - event.getrawx(); dy = view.gety() - event.getrawy(); // 取消动画以便按住图片 xanimation.cancel(); yanimation.cancel(); break; case motionevent.action_move: // 另一种改变view的layoutparams(位置)的方式 movingview.animate() .x(event.getrawx() + dx) .y(event.getrawy() + dy) .setduration(0) .start(); break; case motionevent.action_up: xanimation.start(); yanimation.start(); break; } return true; } }); } /** * 创建弹性动画 * @param view 动画关联的控件 * @param property 动画作用的属性 * @param finalposition 动画结束的位置 * @param stiffness 硬度 * @param dampingratio 阻尼 * @return */ springanimation createspringanimation(view view, dynamicanimation.viewproperty property, float finalposition, @floatrange(from = 0.0) float stiffness, @floatrange(from = 0.0) float dampingratio) { //创建弹性动画类springanimation springanimation animation = new springanimation(view, property); //springforce类,定义弹性特质 springforce spring = new springforce(finalposition); spring.setstiffness(stiffness); spring.setdampingratio(dampingratio); //关联弹性特质 animation.setspring(spring); return animation; } }
activity_position.xml
<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".positionactivity"> <imageview android:id="@+id/movingview" android:layout_width="128dp" android:layout_height="128dp" android:layout_gravity="center" android:src="@drawable/android" android:tint="@color/colorprimary" tools:ignore="contentdescription"/> </framelayout>
触摸改变图片的位置,松开手启动动画。
翻译自,原作者使用kotlin语言实现的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。