Android遍歷API (1) 動畫篇——克隆動畫AnimationCloning


  從我學Android開始,一直就想做一件事。就是好好把APIDemo看一遍。今天開始會抽時間把Android官方的APIDemo程序全部過一遍。主要是為了兩個目的:第一,復習以前學習的API用法。第二,掌握Android整體可以使用的API。方便以后做某些功能,知道有哪些API可以直接使用。

  這個系列先從動畫開始,因為動畫是最常用的,而且我對Android的動畫也不是很熟悉,只是會用一些簡單動畫。因此打算從動畫API開始看。個人覺得APIDemo這個程序是一個很好的教材,很適合初學和當資料查詢。

 

(PS:新建的QQ群,有興趣可以加入一起討論:Android群:322599434)

 

1、文件路徑

\ApiDemo\src\com\example\android\apis\animation\AnimationCloning.java

 

2、LinearLayout動態添加View

  今天的動畫類里面有一個知識點,就是動態給LinearLayout添加一個View,這個在平時開發的過程中是很有用的技巧,特別是在需要自定義View的界面。

 
         
//Edited by mythou
//http://www.cnblogs.com/mythou/

//查找XML里面的LinearLayout

LinearLayout container = (LinearLayout) findViewById(R.id.container);
//創建自定義View對象 final MyAnimationView animView
= new MyAnimationView(this);
//把自定義View添加到LinearLayout container.addView(animView);

 

2、創建球形

        
//Edited by mythou
//http://www.cnblogs.com/mythou/
    private ShapeHolder addBall(float x, float y)
        {
            //繪制一個橢圓
            OvalShape circle = new OvalShape();
            //設置橢圓高寬
            circle.resize(50f * mDensity, 50f * mDensity);
            //初始化圓形
            ShapeDrawable drawable = new ShapeDrawable(circle);
            ShapeHolder shapeHolder = new ShapeHolder(drawable);
            shapeHolder.setX(x - 25f);
            shapeHolder.setY(y - 25f);
            //產生隨機顏色
            int red = (int) (100 + Math.random() * 155);
            int green = (int) (100 + Math.random() * 155);
            int blue = (int) (100 + Math.random() * 155);
            int color = 0xff000000 | red << 16 | green << 8 | blue;
            Paint paint = drawable.getPaint(); // new
                                                // Paint(Paint.ANTI_ALIAS_FLAG);
            int darkColor = 0xff000000 | red / 4 << 16 | green / 4 << 8 | blue / 4;
            //鏡像漸變 參數一為漸變起初點坐標x位置,參數二為y軸位置, //參數三半徑范圍,參數4、5是代表中心顏色和邊緣顏色,最后參數為平鋪方式 //Shader.TileMode.CLAMP:使用Shader的邊界顏色來填充剩余的空間
            RadialGradient gradient = new RadialGradient(37.5f, 12.5f, 50f,
                    color, darkColor, Shader.TileMode.CLAMP);
            paint.setShader(gradient);
            shapeHolder.setPaint(paint);
            balls.add(shapeHolder);
            return shapeHolder;
        }

  上面是創建一個球形的過程,里面用到一個ApiDemo里面自己編寫的管理圖形的類ShapeHolder,這個以后再說。主要是看看上面如何創建一個球形,這里使用了OvalShape創建一個橢圓形,不過下面設置了相同的的長寬,最后出來的是一個圓形。上面隨機生成一種RGB顏色,所以你每次啟動這個程序,得到的球形顏色都不一樣。

  另外,RadialGradient是一個比較有趣的類,它實現了圖形填充的效果,而且可以自定義光影填充,它的參數如下含義

  • 參數一為漸變起初點坐標x位置
  • 參數二為y軸位置
  • 參數三半徑范圍
  • 參數4、5是代表中心顏色和邊緣顏色
  • 最后參數為平鋪方式Shader.TileMode.CLAMP:使用Shader的邊界顏色來填充剩余的空間

 你可以對比上面的效果圖,效果圖的右上角是顏色比較淺,而且有一個向外擴散的光影效果。就是由這個類實現的效果。你可以修改代碼,調試一下。熟悉這個類的用法。

 

3、動畫效果

        
//Edited by mythou
//http://www.cnblogs.com/mythou/
     private void createAnimation()
        {
            if (animation == null)
            {
                //初始化屬性動畫
                ObjectAnimator anim1 = ObjectAnimator.ofFloat(balls.get(0),
                        "y", 0f, getHeight() - balls.get(0).getHeight())
                        .setDuration(500);
                ObjectAnimator anim2 = anim1.clone();
                anim2.setTarget(balls.get(1));
                //添加刷新監聽器
                anim1.addUpdateListener(this);
                
                //第三個球體動畫
                ShapeHolder ball2 = balls.get(2);
                ObjectAnimator animDown = ObjectAnimator.ofFloat(ball2, "y",
                        0f, getHeight() - ball2.getHeight()).setDuration(500);
                //AccelerateInterpolator:在動畫開始的地方速率改變比較慢,然后開始加速
                animDown.setInterpolator(new AccelerateInterpolator());
                ObjectAnimator animUp = ObjectAnimator.ofFloat(ball2, "y",
                        getHeight() - ball2.getHeight(), 0f).setDuration(500);
                //DecelerateInterpolator在動畫開始的地方速率改變比較慢,然后開始減速
                animUp.setInterpolator(new DecelerateInterpolator());
                AnimatorSet s1 = new AnimatorSet();
                //連續執行兩種動畫
                s1.playSequentially(animDown, animUp);
                animDown.addUpdateListener(this);
                animUp.addUpdateListener(this);
                
                AnimatorSet s2 = (AnimatorSet) s1.clone();
                s2.setTarget(balls.get(3));

                animation = new AnimatorSet();
                //同時播放前面3個球的動畫
                animation.playTogether(anim1, anim2, s1);
                //順序播放后面兩個球動畫
                animation.playSequentially(s1, s2);
            }
        }

  上面就是動畫設置的過程。注意,這里只是設置了動畫的規則,跑完這些代碼,並不會有任何動畫,因為動畫啟動是另外的接口,這里只是設置了動畫執行過程的屬性。這里使用了屬性動畫,是Android3.0以后才新增加的動畫方式。這里不詳細說動畫屬性概念,只是為了會使用。

  這里主要是使用ObjectAnimator來設置動畫過程,屬性動畫會修改對象的屬性,而且這種動畫也有限制。ofFloat是設置動畫流程的接口,這里是設置了沿着Y坐標從0到View的高度移動。后面幾個就是設置動畫流程,可以參考上面代碼注釋。

  playTogether和playSequentially是兩種設置連續動畫的接口,只是一個是全部動畫同時運行,另外一個是一個接着一個運行。

  最后強調一點,這里只是設置動畫流程,下面的接口調用了,才會啟動動畫。

 

5、動畫運行

//開始執行動畫
animation.start();

 

6、動畫監聽接口

  在動畫執行過程中,我們可以重寫ValueAnimator.AnimatorUpdateListener接口,來監聽運行過程,例如這里我們重寫了ValueAnimator.AnimatorUpdateListener來刷新自定義的View界面。

 
         
//Edited by mythou
//http://www.cnblogs.com/mythou/
public void onAnimationUpdate(ValueAnimator animation)
{
    invalidate();
}

 

 

2013-8-16

Edited by 泡泡糖

Edited by mythou

原創博文,轉載請標明出處:http://www.cnblogs.com/mythou/p/3260959.html 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM