Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中常用的幾種動畫 -- Android學習之路

Android中常用的幾種動畫 -- Android學習之路

編輯:關於Android編程

動畫

幀動畫補間動畫屬性動畫 Interpolator

幀動畫 FrameAnimation

其實就是一個Drawable ,將一系列的圖片聯合起來順序的播放。形成動畫效果。
幀動畫本質就是一些圖片的集合,要播放這個動畫就必須將一系列的圖片全部加載進內存中,所以幀動畫的圖片不易過大。

創建drawable文件

oneshot :是否只播放一次, drawable :一幀的圖片 duration :一幀播放的時間 毫秒單位


    


    
    
    

使用剛才的drawable文件做背景

    

播放動畫

//FrameAnimation  幀動畫
((AnimationDrawable)image.getBackground()).start();

image

補間動畫 tweenAnimation

主要是對view的內容完成一系列的圖形變換(縮放,透明,旋轉,平移)來實現動畫效果。
具體來說就是 預先定義一些指令 ,這些指令指定了圖形變換的類型,觸發時間,持續時間。指令可以預先定義在xml文件中也可以源代碼的方式定義。程序沿著時間線執行這些指令就可以實現動畫效果。
Android中提供了 Animation,Interpolator,Transformation 等類具體實現Tween動畫,
Animation類及其子類是動畫的核心模塊,它實現了 各種動畫效果如 平移 旋轉 縮放 改變透明度等等。
Tween動畫的每一幀都根據Interpolator對view的內容做一次圖像變換,因此Animation的核心工作是做變換(transformation);
Animation是基類 ,它記錄了動畫的通用屬性和方法。主要的屬性包括動畫持續時間、重復次數、Interpolator等。

常用屬性

duration :動畫時間 毫秒 infinite :無限次 fillAfter 是否停頓在最後一針 repeatMode 重復模式 值:restart 重新開始 reserve 反復 repeatCount :重復次數 startOffset :開始延遲時間

常用Animation子類:

AlphaAnimation 改變Alpha值 TranslationAnimation 平移動畫 RotateAnimation 旋轉動畫 ScaleAnimation 縮放動畫 AnimationSet 動畫集合

實例

補間動畫 既可以使用 xml文件預先定義 也可以使用代碼動態創建;
使用xml文件定義必須在 res/anim/目錄下創建 文件;
可以使用 AnimationUtils的靜態方法 loadAnimation()將動畫文件加載

AlphaAnimation 透明度改變動畫

定義 AlphaAnimation 文件


加載 動畫文件並播放
//AlphaAnimation xml定義
AlphaAnimation alphaAnimation = (AlphaAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_alpha);
view.startAnimation(alphaAnimation);
代碼創建
    //AlphaAnimation 代碼創建
    AlphaAnimation alphaAnimation1 = new AlphaAnimation(0.1f,0.8f);
    alphaAnimation1.setDuration(2000);
    alphaAnimation1.setStartOffset(100);
    alphaAnimation1.setFillAfter(true);
    alphaAnimation1.setRepeatCount(2);
    alphaAnimation1.setRepeatMode(Animation.REVERSE);
    view.startAnimation(alphaAnimation1);

TranslationAnimation 平移動畫

fromXDelta X軸開始坐標 toXDelta X軸結束坐標 fromYDelta Y 軸開始坐標 toYDelta Y軸結束坐標
定義動畫文件

加載動畫並播放
TranslateAnimation translateAnimation = (TranslateAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_translation);
view.startAnimation(translateAnimation);
代碼創建動畫
TranslateAnimation translateAnimation1 = new TranslateAnimation(-10,100,0,0);
translateAnimation1.setInterpolator(new BounceInterpolator());
translateAnimation1.setDuration(2000);
view.startAnimation(translateAnimation1);

RotateAnimation 旋轉動畫

fromDegrees:起始角度 toDegrees:到達角度 pivotX:X軸中心點 pivotY:Y軸中心點

中心點取值模式:

固定像素 50 相對於自身 50% 相對於父容器 50%p
定義動畫文件

加載動畫並播放
RotateAnimation rotate = (RotateAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_rotate);
view.startAnimation(rotate);
代碼創建動畫
//在右上角中心,0-180度
RotateAnimation rotate = new RotateAnimation(0, 180);
//(100,100)像素位中心
RotateAnimation rotate = new RotateAnimation(0, 180, 100, 100);
//相對於自身一半為中心
RotateAnimation rotate = new RotateAnimation(0, 180,Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);

沿中心旋轉 45°

RotateAnimation rotateAnimation = new RotateAnimation(0,45,Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
rotateAnimation.setInterpolator(new DecelerateInterpolator());
rotateAnimation.setDuration(2000);
rotateAnimation.setFillAfter(true);
view.startAnimation(rotateAnimation);

ScaleAnimation 縮放動畫

fromXScale:X軸起始縮放值 fromYScale:Y軸起始縮放值 toXScale:X軸到達縮放值 toYScale:Y軸到達縮放值 縮放值可以是縮放倍數,也可以是縮放到具體尺寸
定義動畫文件


加載動畫並播放
ScaleAnimation scale = (ScaleAnimation) AnimationUtils.loadAnimation(this,R.anim.anim_scale);
view.startAnimation(scale);
代碼創建動畫
ScaleAnimation scale = new ScaleAnimation(0, 2, 0, 2);
ScaleAnimation scale = new ScaleAnimation(0, 2, 0, 2, 100, 100);
ScaleAnimation scale = new ScaleAnimation(0, 2, 0, 2,Animation.RELATIVE_TO_PARENT, 0.5f,Animation.RELATIVE_TO_PARENT, 0.5f);

AnimationSet 動畫集合

定義動畫文件


    

    

加載動畫並播放
Animation animation = AnimationUtils.loadAnimation(this,R.anim.anim_set);
view.startAnimation(animation);
代碼創建動畫
//子動畫是否共用差值器
AnimationSet set = new AnimationSet(true);
set.addAnimation(new RotateAnimation(-180,0));
set.addAnimation(new ScaleAnimation(0,1,0,1,Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF,0.5f));
set.setDuration(2000);
set.setFillAfter(true);
view.startAnimation(set);

Interpolator

Interpolator 被用來修飾動畫效果,定義動畫的變化率,可以使存在的動畫效果accelerated(加速),decelerated(減速),repeated(重復),bounced(彈跳)等。

常用的差值器
- LinearIntepolator 勻速效果
- DecelerateInterpolator 減速效果
- Accelerateinterpolator 加速效果
- CycleInterpolator 循環效果

- BouncedInterpolator 彈跳效果

Property Animation 屬性動畫

屬性動畫的用處有很多很多,我就列幾個常用的方式把;具體參考官網文檔:https://developer.android.com/guide/topics/graphics/prop-animation.html

補間動畫並不能改變view真實的位置,只是形式上的位置改變。而屬性動畫會將view的真實位置改變。

屬性動畫定義必須在 res/animator目錄下

ValueAnimation

valueType 常用三種取值:
- intType整數值、
- floatType浮點值、
- colorType顏色值、

定義動畫文件



加載動畫 並添加 動畫監聽

屬性動畫 就是在 監聽中去改變控件的屬性的值 ,讓控件 位置和形態的屬性都發生真正的變化

                ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_value);
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        //intType
                      int value= (int) animation.getAnimatedValue();
                        image.setTranslationY(value);
                      //  image.setTranslationX(value);

                        //floatType
//                        float alpha = (float) animation.getAnimatedValue();
//                        image.setAlpha(alpha);

                    }
                });

代碼創建

 
//   ValueAnimator valueAnimator = ValueAnimator.ofFloat(1f,0.5f,0f);
PropertyValuesHolder alphaHolder = PropertyValuesHolder.ofFloat("alpha",1f,0.5f);
PropertyValuesHolder widthHolder = PropertyValuesHolder.ofInt("width",1,200);
PropertyValuesHolder rotateHolder = PropertyValuesHolder.ofFloat("rotate",0,180);
ValueAnimator valueAnimator = ValueAnimator.ofPropertyValuesHolder(alphaHolder,widthHolder,rotateHolder);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
    @Override
    public void onAnimationUpdate(ValueAnimator animation) {
//                       float value= (float) animation.getAnimatedValue();
//                        image.setAlpha(value);

      float alpha= (float) animation.getAnimatedValue("alpha");
        int width = (int) animation.getAnimatedValue("width");
        float rotate = (float) animation.getAnimatedValue("rotate");
        Log.e("MainActivity","alpha:"+alpha);
        Log.e("MainActivity","width:"+width);

        image.setAlpha(alpha);
       image.setMaxWidth(width);
        image.setMinimumWidth(width);
        image.setRotation(rotate);
    }
});
valueAnimator.setDuration(2000);
valueAnimator.start();

ObjectAnimator

大部分屬性都和ValueAnimator相同,只多了對要控制改變的控件的屬性的聲明
propertyName:要控制的控件的屬性名;
動畫會直接修改制定屬性名的屬性

需要注意:設置了getter/setter方法的屬性才能生效

定義動畫文件


加載動畫並設置播放動畫的對象

ObjectAnimator object = (ObjectAnimator) AnimatorInflater.loadAnimator(this,R.animator.animator_object);
object.setTarget(image);
object.start();

代碼創建動畫

凡是 有get/set方法的屬性都可以設置值

//  ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(image,"alpha",1f,0.2f);
ObjectAnimator objectAnimator = ObjectAnimator.ofInt(view,"backgroundColor", Color.RED,Color.YELLOW,Color.BLUE,Color.GREEN);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(new BounceInterpolator());
objectAnimator.start();
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved