一、xml定义
通过xml文件资源定义好,然后用工具函数加载,并给对应的view设置该动画,调用startAnimation方法开启动画效果
androidStudio新建xml动画资源
二、java实现动画
使用java对象来new一个动画对象,然后设置相关属性,调用该对象实例的startAnimation方法来开启动画效果
三、两种方式的对比
Xml文件定义View动画属性
通过xml来定义View动画涉及到一些公有的属性(在AndroidStudio上不能提示):
android:duration 动画持续时间
android:fillAfter 为true动画结束时,View将保持动画结束时的状态
android:fillBefore 为true动画结束时,View将还原到开始开始时的状态
android:repeatCount 动画重复执行的次数,默认为0,必须是int,可以为-1表示不停止
android:repeatMode 动画重复模式 ,重复播放时restart重头开始,reverse重复播放时倒叙回放,该属性需要和android:repeatCount一起使用
android:interpolator 插值器,相当于变速器,改变动画的不同阶段的执行速度
这些属性是从Animation中继承下来的,在alpha、rotate、scale、translate标签中都可以直接使用。
java定义view动画属性
RotateAnimation rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
LinearInterpolator lin = new LinearInterpolator();
rotate.setInterpolator(lin);
rotate.setDuration(1500);//设置动画持续时间
rotate.setRepeatCount(-1);//设置重复次数
rotate.setFillAfter(true);//动画执行完后是否停留在执行完的状态
rotate.setStartOffset(10);//执行前的等待时间
Java还有很多set属性的方法,跟XML中的属性一一对应,有兴趣的可以自己去尝试一下
代码片段
下面的xml属性和java代码的属性设置不一定一致,请细心对比查看
渐变xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromAlpha="1.0"
android:toAlpha="0">
</alpha>
渐变java:
public void clickToAlpha(View view) {
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(2000);
mTargetView.startAnimation(alphaAnimation);
}
旋转xml:
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fillAfter="true"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360">
</rotate>
旋转java:
public void clickToRotate(View view) {
RotateAnimation rotateAnimation = new RotateAnimation(
0, 360,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(2000);
mTargetView.startAnimation(rotateAnimation);
}
缩放xml
<?xml version="1.0" encoding="utf-8"?>
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXScale="1.0"
android:fromYScale="1.0"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0.5"
android:toYScale="0.5">
</scale>
缩放java:
public void clickToScale(View view) {
ScaleAnimation scaleAnimation = new ScaleAnimation(
1, 0.5f,
1, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(2000);
mTargetView.startAnimation(scaleAnimation);
}
平移xml:
<?xml version="1.0" encoding="utf-8"?>
<translate xmlns:android="http://schemas.android.com/apk/res/android"
android:duration="2000"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="100%"
android:toYDelta="100%">
</translate>
平移java:
public void clickToTranslate(View view) {
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1);
translateAnimation.setDuration(2000);
mTargetView.startAnimation(translateAnimation);
}
xml动画使用
Xml定义后,其实还是需要在java代码里面使用的,例如上面的xml时候时候的代码如下:
public void clickToAlpha(View view) {
Animation alphaAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.view_anim_alpha);
mTargetView.startAnimation(alphaAnim);
}
public void clickToRotate(View view) {
Animation rotateAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.view_anim_rotate);
mTargetView.startAnimation(rotateAnim);
}
public void clickToScale(View view) {
Animation scaleAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.view_anim_scale);
mTargetView.startAnimation(scaleAnim);
}
public void clickToTranslate(View view) {
Animation translateAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.view_anim_translate);
mTargetView.startAnimation(translateAnim);
}
public void clickToSet(View view) {
Animation setAnim = AnimationUtils.loadAnimation(getApplicationContext(), R.anim.view_anim_set);
mTargetView.startAnimation(setAnim);
}
监听动画事件
不管xml还是java定义动画都可以使用动画监听
animation.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
// 动画开始
}
@Override
public void onAnimationEnd(Animation animation) {
// 动画结束
}
@Override
public void onAnimationRepeat(Animation animation) {
//动画重复
}
});
Java代码时候动画的构造函数属性
例如RotateAnimation的构造函数有非常多的属性他们分别代表什么呢,我们去查阅文档
https://developer.android.com/reference/android/view/animation/RotateAnimation#RotateAnimation(float,%20float,%20int,%20float,%20int,%20float)
发现这个对象有四个构造函数
- public RotateAnimation (Context context, AttributeSet attrs)
- public RotateAnimation (float fromDegrees, float toDegrees)
- public RotateAnimation (float fromDegrees, float toDegrees, float pivotX, float pivotY)
- public RotateAnimation (float fromDegrees, float toDegrees, int pivotXType, float pivotXValue, int pivotYType, float pivotYValue)
根据形参,可以发现是可以xml的属性几乎是一一对应的,只是java构造函数提供多种可选配置
对应的参数也有说明,其实xml这些属性也是一样如此
这里面大部分参数已经在上面介绍过了
重点说下pivotXType与pivotYType
pivotXValue
int pivotXType, 动画在X轴相对于物件位置类型,与下面的pivotXValue结合,确定X轴上旋转中心。
可能值为:Animation.ABSOLUTE,Animation.RELATIVE_TO_SELF, Animation.RELATIVE_TO_PARENT
如果pivotXType=Animation.ABSOLUTE,则此参数为旋转中心在屏幕上X轴的值;
如果pivotXType=Animation.RELATIVE_TO_PARENT,则参数pivotXValue为旋转中心在父控件水平位置百分比,如0.5表示在父控件水平方向中间位置;
如果pivotXType=Animation.RELATIVE_TO_SELF,则参数pivotXValue为旋转中心在控件自身水平位置百分比,如果X和Y的Value都设置为0.5,则该控件以自身中心旋转。文章来源:https://www.toymoban.com/news/detail-409045.html
四、组合动画
1、java
public void clickToSet(View view) {
AlphaAnimation alphaAnimation = new AlphaAnimation(1, 0);
alphaAnimation.setDuration(2000);
RotateAnimation rotateAnimation = new RotateAnimation(
0, 360,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setDuration(2000);
ScaleAnimation scaleAnimation = new ScaleAnimation(
1, 0.5f,
1, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f,
Animation.RELATIVE_TO_SELF, 0.5f);
scaleAnimation.setDuration(2000);
TranslateAnimation translateAnimation = new TranslateAnimation(
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1,
Animation.RELATIVE_TO_SELF, 0,
Animation.RELATIVE_TO_SELF, 1);
translateAnimation.setDuration(2000);
AnimationSet animationSet = new AnimationSet(true);
animationSet.addAnimation(alphaAnimation);
animationSet.addAnimation(rotateAnimation);
animationSet.addAnimation(scaleAnimation);
animationSet.addAnimation(translateAnimation);
mTargetView.startAnimation(animationSet);
}
2.xml
<?xml version="1.0" encoding="utf-8"?>
<set
android:fillAfter="true"
android:duration="3000"
android:shareInterpolator="@android:anim/accelerate_decelerate_interpolator"
xmlns:android="http://schemas.android.com/apk/res/android">
<!--透明度从无到有-->
<alpha android:fromAlpha="0"
android:toAlpha="1"/>
<!--旋转两圈-->
<rotate
android:pivotY="50%"
android:pivotX="50%"
android:fromDegrees="0"
android:toDegrees="720"/>
<!--放大三倍-->
<scale android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0.1"
android:fromYScale="0.1"
android:toXScale="3"
android:toYScale="3"/>
<!--平移至中间位置-->
<translate
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="35%p"
android:toYDelta="42.5%p"/>
</set>
文章来源地址https://www.toymoban.com/news/detail-409045.html
//1.通过xml方式引入动画
Animation animationSet = AnimationUtils.loadAnimation(this,R.anim.anim_set_pic);
//设置动画时长为3秒
animationSet.setDuration(3000);
//设置插值器为先加速再减速
animationSet.setInterpolator(new AccelerateDecelerateInterpolator());
//动画完成后保持位置
animationSet.setFillAfter(true);
//开始动画
ibSagiri.startAnimation(animationSet);
到了这里,关于android视图动画(ViewAnimation动画)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!