View动画通过对场景里的对象不断做图像变换(平移、缩放、旋转、透明度)从而产生动画效果,View动画支持自定义
帧动画通过顺序播放一系列图像从而产生动画效果。
属性动画通过动态改变对象的属性从而达到动画效果。
属性动画是3.0之后新加入的,它和view动画的最大区别就是view是移动了,但没改变原view的位置,而
objiectAnimator改变了组件的位置.
下面附一些代码:
view动画
package com.example.view_animation; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.AlphaAnimation; import android.view.animation.Animation; import android.view.animation.RotateAnimation; import android.view.animation.ScaleAnimation; import android.view.animation.TranslateAnimation; import android.widget.ImageView; public class Main3Activity extends AppCompatActivity implements View.OnClickListener { private ImageView ima_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main3); initView(); } private void initView() { ima_view = (ImageView) findViewById(R.id.ima_view); ima_view.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.tras_btn: tras_btn();//平移 break; case R.id.roat_btn: roat_btn();//旋转 break; case R.id.sca_btn: sca_btn();//缩放 break; case R.id.alph_btn: alph_btn(); break; } } //透明 private void alph_btn() { AlphaAnimation alph=new AlphaAnimation(1,0); alph.setDuration(2000); //还原 alph.setFillBefore(true); ima_view.startAnimation(alph); } //缩放 private void sca_btn() { //缩放的本身比例的起始宽度到缩放后本身比例的宽度 ScaleAnimation scale=new ScaleAnimation(0.5f,1f,0,1,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); scale.setDuration(2000); //还原 scale.setFillBefore(true); ima_view.startAnimation(scale); } //旋转 private void roat_btn() { //初始角度到旋转的角度 绕的位置的点 RotateAnimation roate=new RotateAnimation(0,360,Animation.RELATIVE_TO_SELF,0.5f,Animation.RELATIVE_TO_SELF,0.5f); //持续 roate.setDuration(5000); //还原 roate.setFillBefore(true); ima_view.startAnimation(roate); } //平移 private void tras_btn() { //初始位置到移动后位置 TranslateAnimation translate = new TranslateAnimation(Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_SELF, 1, Animation.ABSOLUTE, 0, Animation.RELATIVE_TO_SELF, 1); //持续 translate.setDuration(2000); //还原 translate.setFillBefore(true); ima_view.startAnimation(translate); } }
帧动画 就是我们所看到的动图的样式
package com.example.view_animation; import android.graphics.drawable.AnimationDrawable; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.Button; import android.widget.ImageView; public class Main4Activity extends AppCompatActivity implements View.OnClickListener { private Button start_btn; private Button stop_btn; private AnimationDrawable animationDrawable; private ImageView ima_btn; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main4); initView(); } private void initView() { start_btn = (Button) findViewById(R.id.start_btn); stop_btn = (Button) findViewById(R.id.stop_btn); start_btn.setOnClickListener(this); stop_btn.setOnClickListener(this); ima_btn = (ImageView) findViewById(R.id.ima_btn); ima_btn.setOnClickListener(this); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.start_btn: if (animationDrawable == null) { animationDrawable = (AnimationDrawable) ima_btn.getBackground(); animationDrawable.start(); } break; case R.id.stop_btn: if (animationDrawable != null) { animationDrawable = new AnimationDrawable(); animationDrawable.stop(); } break; } } } 注意一下,这里的图片的背景设置的是一个animation-list 图片也必须按顺序放置,以防顺序播放错乱 接下来就是熟悉动画
package com.example.view_animation; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.animation.PropertyValuesHolder; import android.animation.ValueAnimator; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.view.animation.LayoutAnimationController; import android.view.animation.ScaleAnimation; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private LinearLayout activity_main; private ImageView image_main; private View include_main; private TextView text_view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text_view= (TextView) findViewById(R.id.text_view); initView(); } private void initView() { activity_main = (LinearLayout) findViewById(R.id.activity_main); image_main= (ImageView) findViewById(R.id.image_main); include_main=findViewById(R.id.include_main); activity_main= (LinearLayout) findViewById(R.id.activity_main); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.translate_btn: translate_btn(); break; case R.id.scale_btn: scale_btn(); break; case R.id.rotate_btn: rotate_btn(); break; case R.id.alpha_btn: alpha_btn(); break; case R.id.protranslate_btn: protranslate_btn(); break; } } private void protranslate_btn() { PropertyValuesHolder propertyValuesHolder=PropertyValuesHolder.ofFloat("translationX",360f); ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(image_main, propertyValuesHolder); objectAnimator.setDuration(2000); objectAnimator.setRepeatCount(1); objectAnimator.setRepeatMode(ValueAnimator.REVERSE); objectAnimator.start(); } //透明度 private void alpha_btn() { ObjectAnimator alphax=ObjectAnimator.ofFloat(image_main,"alpha",new float[]{0.1f,0.5f,0.8f,1f}); alphax.setDuration(1000); alphax.setRepeatCount(-1); alphax.setRepeatMode(ObjectAnimator.REVERSE); alphax.start(); } //旋转 private void rotate_btn() { //Y轴的上下旋转 ObjectAnimator rotatey=ObjectAnimator.ofFloat(include_main,"rotation",new float[]{-90,0,90}); include_main.setPivotX(include_main.getWidth()/2); include_main.setPivotY(0); rotatey.setDuration(2000); rotatey.setRepeatCount(-1); rotatey.setRepeatMode(ObjectAnimator.REVERSE); // //X轴左右旋转 // ObjectAnimator rotatex=ObjectAnimator.ofFloat(image_main,"rotationX",new float[]{0f,45f,90,90f,135f,180f}); // rotatex.setDuration(2000); // rotatex.setRepeatCount(-1); // rotatex.setRepeatMode(ObjectAnimator.REVERSE); // rotatex.start(); rotatey.start(); } //缩放 private void scale_btn() { //Y轴缩放 ObjectAnimator scaley=ObjectAnimator.ofFloat(image_main,"scaleY",new float[]{0.2f,0.5f,0.8f,1f,1.2f}); //持续 scaley.setDuration(2000); //执行几次 -1是无限 scaley.setRepeatCount(-1); //倒着再来一次 scaley.setRepeatMode(ObjectAnimator.REVERSE); //X轴缩放 ObjectAnimator scalex=ObjectAnimator.ofFloat(image_main,"scaleX",new float[]{0.2f,0.5f,0.8f,1f,1.2f}); scalex.setDuration(2000); scalex.setRepeatCount(-1); scalex.setRepeatMode(ObjectAnimator.REVERSE); // scalex.start(); // scaley.start(); AnimatorSet animatorSet=new AnimatorSet(); animatorSet.playTogether(scalex,scaley); } //平移 private void translate_btn() { ObjectAnimator translatex=ObjectAnimator.ofFloat(image_main,"translationX",new float[]{10f,20f,30f,50f,80f,100f}); ObjectAnimator translatey=ObjectAnimator.ofFloat(image_main,"translationY",new float[]{10f,20f,30f,50f,80f,100f}); translatex.setDuration(3000); translatey.setDuration(3000); translatex.setRepeatCount(-1); translatey.setRepeatCount(-1); translatex.setRepeatMode(ObjectAnimator.REVERSE); translatey.setRepeatMode(ObjectAnimator.REVERSE); translatex.start(); translatey.start(); } }