本文共 31338 字,大约阅读时间需要 104 分钟。
补间动画只是改变了View的显示效果而已,并不会真正的改变View的属性。而属性动画可以改变View的显示效果和属性。举个例子:例如屏幕左上角有一个Button按钮,使用补间动画将其移动到右下角,此刻你去点击右下角的Button,它是绝对不会响应点击事件的,因此其作用区域依然还在左上角。只不过是补间动画将其绘制在右下角而已,而属性动画则不会。
帧动画是顺序播放一组预先定义好的图片,类似于电影播放,系统提供了一个类AnimationDrawable来使用帧动画,首先看一下效果演示:
1、首先在drawable里创建一个animation-list类型的xml文件,命名为frame_animation:其中oneshot是设置动画是否重复播放,设置false为确定重复播放。drawable设置不同的图片,duration设置图片的显示时间(即按每帧多少毫秒播放)。
2、设置布局文件activity_frame:定义开始播放和停止按钮和显示动画的布局。
3、在FrameActivity中实现以下代码:
/** * 帧动画 */ public class FrameActivity extends AppCompatActivity implements View.OnClickListener { private Button start; private Button stop; private ImageView view; private AnimationDrawable animationDrawable; //声明AnimationDrawable类 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_frame); initView(); } private void initView() { start = findViewById(R.id.start); stop = findViewById(R.id.stop); view = findViewById(R.id.view); start.setOnClickListener( this); stop.setOnClickListener( this); // 通过逐帧动画的资源文件获得AnimationDrawable示例 animationDrawable=(AnimationDrawable) getResources().getDrawable(R.drawable.frame_animation); // 把AnimationDrawable设置为ImageView的背景 view.setBackgroundDrawable(animationDrawable); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.start: start(); break; case R.id.stop: stop(); break; } } protected void start() { if (animationDrawable != null && !animationDrawable.isRunning()) { //判断 animationDrawable.start(); } } protected void stop() { if (animationDrawable != null && animationDrawable.isRunning()) { animationDrawable.stop(); } } }
4、这样便可实现帧动画了,但帧动画比较容易引起OOM,所以在使用帧动画时,应尽量避免使用尺寸较大的图片。
补间动画的四种变换效果对应Animation的四个子类:TranslateAnimation、ScaleAnimation、RotateAnimation、AlphaAnimation,这些动画可以通过XML来定义,也可以通过代码动态定义,以下示例通过XML定义的。
1、在res下创建一个anim文件夹,创建alpha类型xml文件用来实现动画透明度:
2、创建scal类型xml文件用来实现缩放动画:
3、 创建scal类型xml文件用来实现位移动画:
4、创建rotate类型xml文件用来实现旋转动画:
5、创建set类型xml文件用来实现组合动画:
6、创建布局文件
7、实现TweenActivityde中的代码
/** * Created by CXB on 2018/6/6. */ public class TweenActivity extends AppCompatActivity { private ImageView img; private Animation animation; //声明Animation类 @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_tween); img = findViewById(R.id.tween_img); } /** * 透明度渐变 * * @param view */ public void OnAlpha(View view) { animation = AnimationUtils.loadAnimation(TweenActivity. this, R.anim.tween_alpha); img.startAnimation(animation); } /** * 缩放渐变 * * @param view */ public void OnScale(View view) { animation = AnimationUtils.loadAnimation(TweenActivity. this, R.anim.tween_scale); img.startAnimation(animation); } /** * 位移动画 * * @param view */ public void OnTranslate(View view) { animation = AnimationUtils.loadAnimation(TweenActivity. this, R.anim.tween_translate); img.startAnimation(animation); } /** * 旋转动画 * * @param view */ public void OnRotate(View view) { animation = AnimationUtils.loadAnimation(TweenActivity. this, R.anim.tween_rotate); img.startAnimation(animation); } /** * 组合动画 * * @param view */ public void OnSet(View view) { animation = AnimationUtils.loadAnimation(TweenActivity. this, R.anim.tween_set); img.startAnimation(animation); } }
属性动画和View动画不同,它对作用对象进行了扩展,属性动画可以对任何对象做动画,动画的效果也也得到了加强,可以实现更加绚丽的动画效果。
1、设置布局文件
2、实现AttributeActivity中的代码:
/** * Created by CXB on 2018/6/7. */ public class AttributeActivity extends AppCompatActivity { private Button btn_show; private ObjectAnimator objectAnimator; //声明ObjectAimator类 private LinearLayout ll_root; private float rotateDu = 0; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_attribute); btn_show = findViewById(R.id.attri_show); ll_root = findViewById(R.id.attri_root); } /** * 透明度渐变 * * @param view */ public void OnAlpha(View view) { objectAnimator = ObjectAnimator.ofFloat(btn_show, "alpha", 1f, 0.8f, 0.7f, 0.2f, 0.1f); //布局,类型,渐变程度 objectAnimator.setDuration( 4000); objectAnimator.start(); } /** * 缩放 * * @param view */ public void OnScale(View view) { objectAnimator = ObjectAnimator.ofFloat(btn_show, "scaleY", 1f, 2f, 3f, 4f, 3f, 2f, 1f); objectAnimator.setDuration( 4000); objectAnimator.start(); } /** * 位移 * * @param view */ public void OnTranslate(View view) { float width = ll_root.getWidth(); //获取当前手机的的屏幕宽高 objectAnimator = ObjectAnimator.ofFloat(btn_show, "translationX", width / 10, width / 9, width / 4, width / 3, width / 2, width); objectAnimator.setDuration( 4000); objectAnimator.start(); } /** * 旋转 * * @param view */ public void OnRotate(View view) { objectAnimator = ObjectAnimator.ofFloat(btn_show, "rotation", rotateDu, 360); objectAnimator.setDuration( 2000); objectAnimator.setRepeatCount( 100); //设置动画重复次数 objectAnimator.setRepeatMode(ValueAnimator.RESTART); //动画重复模式 objectAnimator.start(); } /** * 组合动画 * * @param view */ public void OnSet(View view) { float height = ll_root.getHeight(); ObjectAnimator objectAnimatorRotate = ObjectAnimator.ofFloat(btn_show, "rotation", rotateDu, 360); ObjectAnimator objectAnimatorTr = ObjectAnimator.ofFloat(btn_show, "translationY", height, height / 2, height / 3, height / 4, height / 5, height / 6); AnimatorSet animatorSet = new AnimatorSet(); animatorSet.setDuration( 4000); animatorSet.play(objectAnimatorRotate).with(objectAnimatorTr); animatorSet.start(); } }
源码下载:https://download.csdn.net/download/weixin_39001306/10465643
转载自: