編輯:關於Android編程
Android animation
動畫的意思就是一連串畫面動起來了,根據這一連串畫面的產生原理可分為兩類:補間動畫(Tween animation)和幀動畫(frame animation)。補間動畫只需要指定關鍵幀,剩下的所有畫面由軟件算法產生,不同的設備受性能影響運行效果也會不一樣,適合用來實現一些簡單規律的視圖變換效果。幀動畫就是逐幀顯示播放UI制作好的資源畫面,缺點是UI工作量大但能實現一些很逼真的復雜動畫。
在android系統中用View Animation實現補間動畫,Android 3.0加入Property Animation用來拓展和增強補間動畫效果表現,Drawable Animation則是用來實現幀動畫,利用android系統提供的接口和組件我們可以實現任何創意師所構思出的動畫效果。
動畫分類
在xml裡面定義一連串圖片和圖片的持續時間,然後依次顯示出來。原理和膠片電影是一樣的。frameanimation .xml定義如下:
代碼中使用該動畫:
imageview2.setBackgroundResource(R.anim.frameanimation); mAnimationDrawable = (AnimationDrawable) imageview2.getBackground(); mAnimationDrawable.start();
tips:1.這種動畫的原理是利用人眼的視覺殘留效應,理論上每秒24幀就能達到流暢體驗,很適合於展現表演細膩的動畫。例如:人物或動物急劇轉身、頭發及衣服的飄動、走路、說話以及精致的3D效果等。電影,以及一些早期制作精良的動畫都是這麼制作出來的。缺點也很明顯,動畫的原素材極大,播放這種動畫系統資源開銷也大。在手機中代表性的應用場景就是開關機動畫。
2.TransitionDrawable用來實現兩種圖片之間互相漸變的效果。它不屬於動畫分類,但用法和效果都很類似。
最早出現的動畫形式,可以對view進行旋轉,位移,拉伸,透明度等動畫,一般會在xml裡定義,然後代碼引用。Xml定義如下:
...
代碼中引用該動畫:
View mView = findViewById(R.id.view); Animation hyperspaceJump = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump); mView.startAnimation(hyperspaceJump);
tips:這應該是小伙伴們最早接觸的動畫方式了,沒有之一。它結構優雅,使用方便,還能重用,在android3.0以前的應用絕大部分的動畫都是使用該方式實現。但事物總有它的局限性,一個view限定詞已經說明了他的適用范圍。
Android3.0引入的一種新的動畫方式,功能強大,使用簡單,功能上可以完全取代view animation。它作用的對象是object,通過改變對象的屬性最終產生動畫或其他效果,該對象可以是看得見的view,也可以是看不見的view或者其他非view組件。
我們看下它的xml定義(property_animator.xml):
代碼中引用該動畫:
AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,R.anim.property_animator); set.setTarget(myObject); set.start();
通過閱讀源代碼和實際使用來看property animation 在代碼中直接定義更常見:
/* * ---------------------for propertyanimation------------------ */ /* * alpha animation */ // mAnimator1= ObjectAnimator.ofFloat(bt2, "alpha", 0f,1f); /* * motion animation */ // mAnimator1= ObjectAnimator.ofFloat(bt2, "X", 0f,400f,80f); /* * scale animation */ // mAnimator1= ObjectAnimator.ofFloat(bt2, "scaleX", 0f,10f,1); /* * rotation animation */ // mAnimator1= ObjectAnimator.ofFloat(bt2, "rotationX", 0f,360f,60f); // mAnimator1.setDuration(500); // mAnimator3= ObjectAnimator.ofFloat(bt2, "rotationY", 0f,360f,60f); // mAnimator3.setDuration(500); // mAnimator1= ObjectAnimator.ofFloat(bt2, "rotation", 0f,360f,60f); // mAnimator1.setDuration(500); /* * color animation */ mAnimator4 = ObjectAnimator.ofInt(imageview1, "backgroundColor",0xFFFF7F00,0xFFFFFAFA); mAnimator4.setDuration(500); mAnimator1 = ObjectAnimator.ofFloat(textview1, "rotation",0f,3600f); mAnimator1.setDuration(500); mAnimator3 = ObjectAnimator.ofFloat(textview1, "Y", 0f,360f,60f); mAnimator3.setDuration(500); mAnimator2 = ObjectAnimator.ofFloat(bt2, "alpha",0f,1f,0.2f); mAnimator2.setDuration(500); mAnimatorSet1 = new AnimatorSet(); mAnimatorSet1.play(mAnimator1).with(mAnimator2); mAnimatorSet1.play(mAnimator1).with(mAnimator3); // start property animation. mAnimatorSet1.start();
1.view animation只能作用在view對象上面,而property animation沒有這種限制,只要是對象都可以。
2.property animation可以改變背景(color),而view animation只能改變形狀和位置。
3.view animation只是改變了view的位置,而不會改變view的響應區域。
4.對於有多個動畫同時運行的情況property animation的效率會高於view animation。原因是兩種動畫的刷新機制不同,屬性動畫通過減少刷新的區域和次數來提高效率。
5.配合android 3.0開放的Hardware Acceleration,屬性動畫可以大有所為。
一般叫它插值器,通過它我們可以讓動畫成非線性變得更生動,如加速,減速,回彈等效果,在PropertyAnimation中是TimeInterplator,在ViewAnimation中是Interplator,這兩個是一樣的,在3.0之前只有Interplator,3.0之後實現代碼轉移至了TimeInterplator。Interplator繼承自TimeInterplator,內部沒有任何其他代碼。系統有以下幾種默認效果:
Animator.AnimatorListener
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
//當動畫被取消時調用,同時會調用onAnimationEnd().
onAnimationCancel()
ValueAnimator.AnimatorUpdateListener
onAnimationUpdate()//通過監聽這個事件在屬性的值更新時執行相應的操作,對於ValueAnimator一般要監聽此事件執行相應的動作,不然Animation沒意義,在ObjectAnimator(繼承自ValueAnimator)中會自動更新屬性,如無必要不必監聽。在函數中會傳遞一個ValueAnimator參數,通過此參數的getAnimatedValue()取得當前動畫屬性值。
可以繼承AnimatorListenerAdapter而不是實現AnimatorListener接口來簡化操作,這個類對AnimatorListener中的函數都定義了一個空函數體,這樣我們就只用定義想監聽的事件而不用實現每個函數卻只定義一空函數體。
ObjectAnimatoroa=ObjectAnimator.ofFloat(tv, "alpha", 0f, 1f); oa.setDuration(3000); oa.addListener(new AnimatorListenerAdapter(){ public void on AnimationEnd(Animator animation){ Log.i("Animation","end"); } }); oa.start();
1.有alpha變化時盡量開啟硬件加速
當使用 setAlpha(), AlphaAnimation,
or ObjectAnimator對
view
進行變化時,系統需要兩倍的填充速率來完成離屏緩沖
buffer
。開啟硬件加速能很大程度優化該過程。
2.
復雜動畫建議開啟硬件加速。
當系統的drawing operations太多,這時動畫並不能保證有每秒60幀。開啟硬件加速後,會生成一個硬件紋理用來作用於view的動畫,而且只在view的屬性發生改變時或強制invalidate()才會重繪。減少了view的無效刷新,所以會更流暢。
Tips:當你的動畫沒有達到預期效果,而且還是property animation時,可以開啟硬件加速試試(意想不到的效果哦)。
3.在使用一些android.graphics.*api時,如果沒有效果,或某些機子效果不到位,這時開啟硬件加速或許就好了。在做一個類似於ios鎖屏滑動解鎖效果時就遇到該問題和編譯系統的策略有關(是否默認開啟硬件加速):
//開啟硬件加速後,下面的代碼才能同時在4.2和4.0上有效果。
setLayerType(LAYER_TYPE_HARDWARE, null); mPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
在Android中listview是最常用的控件之一,但是有時候我們會覺得千篇一律的listview看起來過於單調,於是就產生了listView動畫,listview加載
之前使用asp.net開發軟件的過程中也使用GridView,發現android裡面也有這麼一個控件,使用方法有點相似,都是使用適配器將數據綁定到這個控件,
一、 JNI基礎介紹JNI is the Java Native Interface. It defines a way for managed code (writte
才沒有完結呢o( ̄︶ ̄)n 。大家好,這裡是番外篇。拜讀了愛哥的博客,又學到不少東西。愛哥曾經說過: 要站在巨人的丁丁上。 那麼今天,我們就站在愛哥的丁丁上來學習制作一款