帧动画
首先是创建了一个开关 和一个imageview 用来完成帧动画切换
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<androidx.appcompat.widget.SwitchCompat
android:id="@+id/sw_frame"
android:layout_gravity="center"
android:text="帧动画开关"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
<ImageView
android:layout_gravity="center"
android:id="@+id/image_frame"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@drawable/wifi_animation"
/>
</LinearLayout>
然后是在drawable文件下下创建帧动画的 animation-list用来放帧动画的图片 oneshot =false 循环执行 oneshot=true 执行一次 开关设置需要创建两个drawable 正序和倒序duration为每张图片的毫秒
<animation-list xmlns:android="http://schemas.android.com/apk/res/android" android:oneshot="true">
<item android:drawable="@drawable/draw1" android:duration="100"/>
<item android:drawable="@drawable/draw2" android:duration="100"/>
<item android:drawable="@drawable/draw3" android:duration="100"/>
<item android:drawable="@drawable/draw4" android:duration="100"/>
<item android:drawable="@drawable/draw5" android:duration="100"/>
<item android:drawable="@drawable/draw6" android:duration="100"/>
</animation-list>
然后在Mainactivity 做开启动画操作 根据开关做正序 或倒序的帧动画
mImage_frame = findViewById(R.id.image_frame);
mSwitch_frame = findViewById(R.id.sw_frame);
//帧动画
mSwitch_frame.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if (isChecked) {
mImage_frame.setBackgroundResource(R.drawable.wifi_animation);
} else {
mImage_frame.setBackgroundResource(R.drawable.wifi_animation_un);
}
AnimationDrawable animationDrawable = (AnimationDrawable) mImage_frame.getBackground();
animationDrawable.start();
}
});
属性动画
首先写了几个平移 旋转 渐变 Animator 添加了一个差值器
/**
* @param propertyName 动画名称
* @param values 值
* @param time 响应时间
* @return
*/
private ObjectAnimator objectAnimator(String propertyName, int values, long time) {
ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mImage, propertyName, values);
objectAnimator.setInterpolator(new LinearOutSlowInInterpolator());
objectAnimator.setDuration(time);
return objectAnimator;
}
/**
* @param fromX
* @param toX
* @param fromY
* @param toY
* @param pivotX
* @param pivotY
* @param time 动画事件
* @param pivotBoolean 标识
* @return
*/
private ScaleAnimation scaleAnimation(float fromX, float toX, float fromY, float toY, float pivotX, float pivotY, long time, boolean pivotBoolean) {
if (pivotBoolean) {
ScaleAnimation scaleAnimation = new ScaleAnimation(fromX, toY, fromY, toY, pivotX, pivotY);
// 设置动画播放的时间
scaleAnimation.setInterpolator(new LinearOutSlowInInterpolator());
scaleAnimation.setDuration(time);
return scaleAnimation;
} else {
// 创建缩放的动画对象
ScaleAnimation scaleAnimation = new ScaleAnimation(fromX, toX, fromY, toY);
scaleAnimation.setInterpolator(new LinearOutSlowInInterpolator());
// 设置动画播放的时间
scaleAnimation.setDuration(time);
return scaleAnimation;
}
}
/**
* @param fromAlpha 开始
* @param toAlpha 结束
* @param time 响应时间
* @return
*/
private AlphaAnimation alphaAnimation(float fromAlpha, float toAlpha, long time) {
AlphaAnimation alphaAlphaAnimation = new AlphaAnimation(fromAlpha, toAlpha);
alphaAlphaAnimation.setInterpolator(new LinearOutSlowInInterpolator());
alphaAlphaAnimation.setDuration(time);
return alphaAlphaAnimation;
}
/**
* @param value1
* @param value2
* @param time
* @return
*/
private ValueAnimator valueAnimator(float value1, float value2, long time) {
ValueAnimator animator = ValueAnimator.ofFloat(value1, value2);
animator.setInterpolator(new LinearInterpolator());
animator.setDuration(time);
return animator;
}
平移动画
//向右移动
objectAnimator("translationX", mImage.getWidth(), 2000).start();
//向下移动
objectAnimator("translationY", mImage.getWidth(), 2000).start();
//向左移动
objectAnimator("translationX", -mImage.getWidth() + mImage.getWidth(), 2000).start();
//向上移动
objectAnimator("translationX", -mImage.getWidth() + mImage.getWidth(), 2000).start();
旋转动画
//向右旋转
objectAnimator("rotation", mImage.getWidth(), 2000).start();
//向左旋转
objectAnimator("rotation", -mImage.getWidth(), 2000).start();
//上下向后旋转
objectAnimator("rotationX", mImage.getWidth(), 2000).start();
//上下向前旋转
objectAnimator("rotationX", -mImage.getWidth(), 2000).start();
//左右向右旋转
objectAnimator("rotationY", mImage.getWidth(), 2000).start();
//左右向左旋转
objectAnimator("rotationY", -mImage.getWidth(), 2000).start();
缩放动画
//从左上角开始缩放
ScaleAnimation scaleAnimation = scaleAnimation(0f, 1.0f, 0f, 1.0f, 0f, 0f, 2000, false);
mImage.startAnimation(scaleAnimation);
//从中心开始缩放 这里还设置了动画的执行次数和动画模式
ScaleAnimation scaleAnimation = scaleAnimation(0f, 1.0f, 0f, 1.0f, mImage.getWidth() / 2, mImage.getHeight() / 2, 2000, true);
// 开始播放动画
mImage.startAnimation(scaleAnimation);
//设置动画执行次数
scaleAnimation.setRepeatCount(3);
//设置动画模式
scaleAnimation.setRepeatMode(ScaleAnimation.REVERSE);
渐变动画
//开启渐变 1-0.5 然后 0.5-1
AlphaAnimation alphaAnimation = alphaAnimation(1f, 0.5f, 2000);
mImage.startAnimation(alphaAnimation);
AlphaAnimation alphaAnimation1 = alphaAnimation(0.5f, 1f, 2000);
mImage.startAnimation(alphaAnimation1);
ValueAnimator
//ValueAnimator 提供产生一些规律的数字
final Button btn_ValueAnimator_value = findViewById(R.id.btn_ValueAnimator_value);
findViewById(R.id.btn_ValueAnimator).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ValueAnimator animator = valueAnimator(0, 10, 3000);
animator.start();
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
btn_ValueAnimator_value.setText(animatedValue + "");
}
});
//提供了对事件监听的方法
animator.addListener(new Animator.AnimatorListener() {
@Override
public void onAnimationStart(Animator animation) {
}
@Override
public void onAnimationEnd(Animator animation) {
//动画完成
}
@Override
public void onAnimationCancel(Animator animation) {
}
@Override
public void onAnimationRepeat(Animator animation) {
}
});
}
});
最后就是AnimatorSet 组合动画
//组合动画
findViewById(R.id.btn_AnimatorSet).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AnimatorSet animatorSet = new AnimatorSet();
ObjectAnimator translationX = objectAnimator("translationX", mImage.getWidth(), 2000);
ObjectAnimator rotationY = objectAnimator("rotationY", mImage.getWidth(), 2000);
ObjectAnimator rotation = objectAnimator("rotation", mImage.getWidth(), 2000);
animatorSet.setInterpolator(new LinearOutSlowInInterpolator());
//方式
// animatorSet.playTogether(translationX,rotationY,rotation);
//方式
/**
* 方式太多不一一列举
* after:现有的动画插入到传入的动画之后执行
* after:现有动画延迟指定毫秒后执行
* before:现有动画插入到传入的动画之前执行
* with :现有动画和传入的动画同时执行
*/
animatorSet.play(translationX).with(rotationY).after(rotation);
animatorSet.setDuration(3000);
animatorSet.start();
}
});