一、补间动画的种类
分为四种:
1. 灰度动画 AlphaAnimation
2. 平移动画 TranslateAnimation
3 缩放动画 ScaleAnimation
4 旋转动画 RotateAnimation
四种动画都是源于共同的动画类Animation 。因此 用于Animation的属性与方法。常用的用法有:
1。 setFillAfter:设置是否维持结束画面,true表示动画结束后停留在结束画面,false表示动画结束后恢复到开始画面
2. setRepeatMode:设置重播模式。Animation.RESTATR表示从头开始,Animation.REVERSE表示倒过来开始。默认为Animation.RESTATR
3 setRepeateCount:设置重播次数。默认为0表示只播放一次
4 setDuration: 设置动画的停留时间,单位毫秒
5 setInterpolator:设置动画的插值器
6 setAnimationListener:设置动画事件的监听器,需实现接口AnimationListener的3个方法
onAnimationStart:在动画开始时触发
onAnimationEnd:在动画结束时触发
onAnimationRepeat:在动画重播时触发
与帧动画一样补间动画也需要一个宿主视图,对宿主视图施展动画效果,不同的是,帧动画的宿主视图是ImageView相关的图像视图,而补间动画的宿主视图可以是任意视图,只要派生自View类就行。给补间动画指定宿主视图的方法很简单,调用宿主对象的startAnimation方法即可命令宿主视图开始动画,调用宿主对象的clearAnimation方法即可要求宿主视图清除动画。
Animation类的坐标类型 | 说明 |
ABSOLUTE | 绝对位置 |
RELATIVE_TO_SELF | 相对自身位置 |
RELATIVE_TO_PARENT | 相对上级位置 |
ctivity_main.xml
<LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <TextView android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:gravity="right" android:text="补间动画类型:" android:textColor="@color/black" android:textSize="17sp" /> <Spinner android:id="@+id/sp_tween" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:spinnerMode="dialog" /></LinearLayout><RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_marginTop="0dp" android:layout_marginLeft="0dp" android:id="@+id/frameAnim" /> <ImageView android:id="@+id/iv_tween_anim" android:layout_width="match_parent" android:layout_height="300dp" android:scaleType="fitCenter" android:src="@drawable/oval" /></RelativeLayout>
MainActivity.java
public class MainActivity extends AppCompatActivity implements Animation.AnimationListener{ private Animation alphaAnim, translateAnim, scaleAnim, roateAnim; private ImageView iv_tween_anim; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); createMjAnimation(); } private void showFrameAnimation() { ImageView frameAnim = findViewById(R.id.frameAnim); frameAnim.setImageResource(R.drawable.frame_anim); AnimationDrawable ad_frame = (AnimationDrawable) frameAnim.getDrawable(); ad_frame.start(); } private void showGifAnimation() { ImageView iv_gif = findViewById(R.id.frameAnim); InputStream is = getResources().openRawResource(R.raw.loading); GifImage gifImage = new GifImage(); int code = gifImage.read(is); if (code == GifImage.STATUS_OK) { GifImage.GifFrame[] frameList = gifImage.getFrames(); AnimationDrawable ad_gif = new AnimationDrawable(); for (int i = 0; i < frameList.length; i++) { //BitmapDrawable用于把Bitmap格式转换为Drawable格式 BitmapDrawable bitmapDrawable = new BitmapDrawable(getResources(), frameList[i].image); ad_gif.addFrame(bitmapDrawable, frameList[i].delay); } ad_gif.setOneShot(false); iv_gif.setImageDrawable(ad_gif); ad_gif.start(); } else if (code == GifImage.STATUS_FORMAT_ERROR) { Toast.makeText(this, "该图片不是gif格式", Toast.LENGTH_LONG).show(); } else { Toast.makeText(this, "gif图片读取失败:" + code, Toast.LENGTH_LONG).show(); } } private void showFadeAnimation() { Drawable[] drawableArray = { getResources().getDrawable(R.drawable.fade_begin), getResources().getDrawable(R.drawable.fade_end), }; TransitionDrawable td_fade = new TransitionDrawable(drawableArray); ImageView image = findViewById(R.id.frameAnim); image.setImageDrawable(td_fade); td_fade.startTransition(3300); } private void createMjAnimation() { iv_tween_anim = (ImageView) findViewById(R.id.iv_tween_anim); initanim(); initTweenSpinner(); } private void initanim() { //从完全透明变为即将不透明 alphaAnim = new AlphaAnimation(1.0f, 0.1f); alphaAnim.setDuration(3000); alphaAnim.setFillAfter(true); //向左平移200 translateAnim = new TranslateAnimation(1.0f, -200f, 1.0f, 1.0f); translateAnim.setDuration(3000); translateAnim.setFillAfter(true); //宽度不变,高度变为原来的二分之一 scaleAnim = new ScaleAnimation(1.0f, 1.0f, 1.0f, 0.5f); scaleAnim.setDuration(3000); scaleAnim.setFillAfter(true); //围绕着圆心顺时针旋转360度 roateAnim = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); roateAnim.setDuration(3000); roateAnim.setFillAfter(true); } private void initTweenSpinner() { ArrayAdapter<String> tweenAdapter = new ArrayAdapter<String>(this, R.layout.item_select, tweenArray); Spinner sp_tween = (Spinner) findViewById(R.id.sp_tween); sp_tween.setPrompt("请选择补间动画类型"); sp_tween.setAdapter(tweenAdapter); sp_tween.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, long arg3) { if (arg2 == 0) { iv_tween_anim.startAnimation(alphaAnim); alphaAnim.setAnimationListener(MainActivity.this); } else if (arg2 == 1) { iv_tween_anim.startAnimation(translateAnim); translateAnim.setAnimationListener(MainActivity.this); } else if (arg2 == 2) { iv_tween_anim.startAnimation(scaleAnim); scaleAnim.setAnimationListener(MainActivity.this); } else if (arg2 == 3) { iv_tween_anim.startAnimation(roateAnim); roateAnim.setAnimationListener(MainActivity.this); } } @Override public void onNothingSelected(AdapterView<?> parent) { // Another interface callback } }); sp_tween.setSelection(0); } private String[] tweenArray={"灰度动画", "平移动画", "缩放动画", "旋转动画"}; @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { if (animation.equals(alphaAnim)) { Animation alphaAnim2 = new AlphaAnimation(0.1f, 1.0f); alphaAnim2.setDuration(3000); alphaAnim2.setFillAfter(true); iv_tween_anim.startAnimation(alphaAnim2); } else if (animation.equals(translateAnim)) { Animation translateAnim2 = new TranslateAnimation(-200f, 1.0f, 1.0f, 1.0f); translateAnim2.setDuration(3000); translateAnim2.setFillAfter(true); iv_tween_anim.startAnimation(translateAnim2); } else if (animation.equals(scaleAnim)) { Animation scaleAnim2 = new ScaleAnimation(1.0f, 1.0f, 0.5f, 1.0f); scaleAnim2.setDuration(3000); scaleAnim2.setFillAfter(true); iv_tween_anim.startAnimation(scaleAnim2); } else if (animation.equals(roateAnim)) { Animation rotateAnim2 = new RotateAnimation(0f, -360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); rotateAnim2.setDuration(3000); rotateAnim2.setFillAfter(true); iv_tween_anim.startAnimation(rotateAnim2); } } @Override public void onAnimationRepeat(Animation animation) { } }