編輯:關於Android編程
根據人眼視覺殘留現象,連續播放一些列的圖像,形成動畫效果。
Android中的動畫:
游戲:利用自定義View的繪制方法,開啟線程頻繁的刷新界面,形成動畫; Android 視圖動畫:針對 View 以及View的子類。 Android 屬性動畫:針對定義的屬性,大部分可以操作ViewAndroid根據起始狀態和結束狀態,進行控件的移動、旋轉、縮放等顯示效果的變化,形成一個動畫
代碼實現動畫(可擴展性差)
補間動畫,就是指定開始狀態,並且指定結束狀態,Android系統自動的在這兩個狀態之間進行填充,形成連續的動畫,就被稱為補間動畫
代碼從XML中加載 動畫對象; 給需要處理的控件,設置動畫就可以播放了;動畫播放的時候是有狀態了,例如 開始動畫、動畫結束
AnimationListener 包含動畫三種狀態的回調:
xml文件
res/anim/
旋轉:
移動:
縮放:
set集合
java 代碼文件
public void btnRotateClick(View view) { //圖片旋轉 Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_rotate); animation.setRepeatMode(Animation.INFINITE); //設置插值器 平滑旋轉 animation.setInterpolator(new LinearInterpolator()); view.startAnimation(animation); } public void btMoveInterpolator(View view) { //帶有插值器的移動 Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_move); animation.setDuration(1000); // animation.setInterpolator(new OvershootInterpolator(20)); animation.setInterpolator(new SimpleInterpolator()); view.startAnimation(animation); } public void btnScale(View view) { ImageView imageView = (ImageView) findViewById(R.id.image_view); if (imageView != null) { Animation animation = AnimationUtils.loadAnimation(this, R.anim.anim_heartbeat); animation.setDuration(1000); AnimationSet animationSet = (AnimationSet) animation; List animations = animationSet.getAnimations(); Animation anim = animations.get(0); //設置第一次執行完成之後, 循環播放的次數 anim.setRepeatMode(Animation.REVERSE); anim.setRepeatCount(Animation.INFINITE); imageView.startAnimation(animation); } }
設置動畫監聽: 當動畫開始, 完成, 重復時, 進行回調 animation.setAnimationListener(this); //////////////Animaition監聽/////start///////////// @Override public void onAnimationStart(Animation animation) { } @Override public void onAnimationEnd(Animation animation) { tvInc.setVisibility(View.INVISIBLE); tvZan.setText("贊" + zanCount); } @Override public void onAnimationRepeat(Animation animation) { } //////////////Animaition監聽///////end/////////////
- .....
public void btnPlayFrame(View view) { //TODO: 播放動畫 //1. 因為逐幀動畫是圖片, 所以要從ImageView中取出來, 才能進行控制 ImageView imageGift = (ImageView) findViewById(R.id.image_gift); //獲取src屬性 Drawable drawable = imageGift.getDrawable(); //shape -> ShapeDrawable //animation-list -> AnimationDrawable if (drawable != null && drawable instanceof AnimationDrawable) { //2. 播放動畫 AnimationDrawable animationDrawable = (AnimationDrawable) drawable; animationDrawable.start(); } // imageGift.setImageDrawable(); } public void btnStopFrame(View view) { //TODO: 停止動畫 //1. 獲取圖像 逐幀動畫 ImageView imageGift = (ImageView) findViewById(R.id.image_gift); Drawable drawable = imageGift.getDrawable(); if (drawable != null && drawable instanceof AnimationDrawable) { AnimationDrawable animationDrawable = (AnimationDrawable) drawable; //Stop會將動畫暫停, 但是下一次, start的時候, 會從頭開始播放 animationDrawable.stop(); //Gif 如何顯示: GifDrawable庫 WebView } }
執行原理<喎?/kf/ware/vc/" target="_blank" class="keylink">vcD4NCkFuaW1hdG9yIM2ouf0geG1sIMC0vNPU2KOsu/HIodDo0qrQ3rjEtcTK9NDUtcTD+7PGoaLA4NDNoaLK/da1o7sgQW5pbWF0b3JJbmZsYXRvciDAtLzT1Nh4bWwsINauuvPJ6NbDwcsgc2V0VGFyZ2V0KE9iamVjdCkgo6zWuLao0OjSqtDeuMTK9NDUtcTE2sjdtcS21M/zo7sgzai5/b2ryvTQ1LXEw/uzxteqzqogSmF2YUJlYW4gyvTQ1Le9t6jJ6NbDw/zD+7nm1PKjusr00NTD+8rX19bEuLTz0LSjrMeww+bM7bzTIHNldKOswP3I5yBsZWZ0yvTQ1KOsxMfDtL7Nu+HJ+rPJIHNldExlZnQoyv3WtcDg0M0pIL340NC3tMnko6yy6dXS1ri2qLbUz/PW0MrHt/Gw/Lqs1eK49re9t6ijrMjnufuw/Lqso6y+zb/J0tSwtNXV1ri2qLXEyrG85ChkdXJhdGlvbikgvfjQ0CB2YWx1ZUZyb20gtb0gdmFsdWVUbyDV4sG91rXWrrzktcS9+NDQtq/MrLXEyejWw6GjDQo8aDMgaWQ9"實現步驟">實現步驟 准備屬性動畫的XML動畫資源; 准備需要播放動畫的對象; 加載屬性動畫的 XML 設置動畫要修改的對象 修改的屬性名稱,一定是 Java類文件中的 public void setXxxxx(… xxx) 的方法的 xxxx 這個屬性,首字母小寫
set 標簽可以 通過 ordering屬性進行設置,內部的動畫是否在一起執行
sequentially 串行執行,一個執行完,在執行另外的一個,不要有無限重復的,因為後邊的沒法執行了
together 並行一起執行
ViewCompat 支持 設置View的狀態,例如 ViewCompat.setScaleX(View, float) 就是縮放控件水平方向的尺寸;
ViewPropertyAnimatorCompat 支持 實現低版本手機的屬性動畫功能,
ViewCompat.animate(View) 為View創建一個屬性動畫對象
ScrollView 的 onTouch 中的 MOVE 事件可以和控件的隱藏顯示配合
ListView OnScrollListener 可以檢測ListView的滾動,滾動的過程中可以實現圖片,標題的縮放
res/animator/
java
public void btnPropertyMove(View view) { //屬性動畫的加載 //1. 加載器 加載xml文件 Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_move); //2. 將需要修改的對象傳遞給屬性動畫 animator.setTarget(mTextView); //3. 動畫的播放 animator.start(); } public void btnPropertyColor(View view) { Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_color); animator.setTarget(mTextView); animator.start(); } public void btnPropertyTextSize(View view) { Animator animator = AnimatorInflater.loadAnimator(this, R.animator.animator_textsize); animator.setTarget(mTextView); animator.start(); } public void btnPropertyCustom(View view) { //自定義對象的屬性修改 //1. 自定義類對象: 確認屬性名 TextShower shower = new TextShower(mTextView); //2. 加載xml或者寫代碼 Animator animator = AnimatorInflater.loadAnimator(this, R.animator.anmiator_text_show); //3. 設置目標 animator.setTarget(shower); animator.start(); } public void btnPropertyCode(View view) { //代碼形式的屬性動畫 //所有的屬性的數值,如果是位置那麼以像素為單位 // ObjectAnimator.ofFloat(mTextView, "translationX", 0, 200).setDuration(2000).start(); //利用set 可以實現多個屬性同時修改 AnimatorSet set = new AnimatorSet(); ObjectAnimator animator1 = ObjectAnimator.ofFloat(mTextView, "translationX", 0, 400).setDuration(2000); ObjectAnimator animator2 = ObjectAnimator.ofFloat(mTextView, "rotation", 0, 360).setDuration(200); set.playTogether(animator1, animator2); set.start(); }
在了解系統的activity,service,broadcastReceiver的啟動過程後,今天將分析下360 DroidPlugin是如何預注冊占坑的?本篇文章主要分
本篇博客主要是記錄一下Android內存洩露相關的問題。網上有很多介紹內存洩露的文章,自己摘取了一些比較有價值的內容,同時增加了一些自己的理解。在分析內存洩露前,我們必須
Fragment必須總是被嵌入到一個Activity中,並且它的生命周期直接受宿主Activity生命周期的影響。本文內容可以分為下面的幾部分:使用支持庫創建
Android 6.0(Marshmallow) API Level: 23Android 7.0(Nougat) API Level: 24雖然Android一直處於持