從我學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