日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【Android动画】之Tween动画 (渐变、缩放、位移、旋转)

發布時間:2023/11/27 生活经验 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android动画】之Tween动画 (渐变、缩放、位移、旋转) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android 平臺提供了兩類動畫。 一類是Tween動畫,就是對場景里的對象不斷的進行圖像變化來產生動畫效果(旋轉、平移、放縮和漸變)。

第二類就是 Frame動畫,即順序的播放事先做好的圖像,與gif圖片原理類似。

?

下面就講一下Tweene Animations。

?

主要類:

?

Animation ? 動畫

AlphaAnimation 漸變透明度

RotateAnimation 畫面旋轉

ScaleAnimation 漸變尺寸縮放

TranslateAnimation 位置移動

AnimationSet? 動畫集

?

?

有了這些類,那么我們如何來實現動畫效果呢??

?

以自定義View為例,該View很簡單,畫面上只有一個圖片。 現在我們要對整個View分別實現各種Tween動畫效果。

?

AlphaAnimation

?

通過代碼實現?AlphaAnimation,如下:

?

[java]?view plaincopyprint?
  1. //初始化??
  2. Animation?alphaAnimation?=?new?AlphaAnimation(0.1f,?1.0f);??
  3. //設置動畫時間????????????alphaAnimation.setDuration(3000);??
  4. ????????????????this.startAnimation(alphaAnimation);??

?

?

其中AlphaAnimation類第一個參數fromAlpha表示動畫起始時的透明度, 第二個參數toAlpha表示動畫結束時的透明度。?

setDuration用來設置動畫持續時間。

?

RotateAnimation

?

代碼:

?

[java]?view plaincopyprint?
  1. Animation?rotateAnimation?=?new?RotateAnimation(0f,?360f);??
  2. ????????????????rotateAnimation.setDuration(1000);??
  3. ????????????????this.startAnimation(rotateAnimation);??

?

?

其中RotateAnimation類第一個參數fromDegrees表示動畫起始時的角度, 第二個參數toDegrees表示動畫結束時的角度。?

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。

?

ScaleAnimation

代碼:

?

[java]?view plaincopyprint?
  1. //初始化??
  2. Animation?scaleAnimation?=?new?ScaleAnimation(0.1f,?1.0f,0.1f,1.0f);??
  3. //設置動畫時間??
  4. scaleAnimation.setDuration(500);??
  5. ????????????????this.startAnimation(scaleAnimation);??

?

?

ScaleAnimation類中

第一個參數fromX ,第二個參數toX:分別是動畫起始、結束時X坐標上的伸縮尺寸。

第三個參數fromY ,第四個參數toY:分別是動畫起始、結束時Y坐標上的伸縮尺寸。

另外還可以設置伸縮模式pivotXType、pivotYType, 伸縮動畫相對于x,y 坐標的開始位置pivotXValue、pivotYValue等。

?

TranslateAnimation

代碼:

?

[java]?view plaincopyprint?
  1. //初始化??
  2. Animation?translateAnimation?=?new?TranslateAnimation(0.1f,?100.0f,0.1f,100.0f);??
  3. //設置動畫時間????????????????translateAnimation.setDuration(1000);??
  4. ????????????????????????????this.startAnimation(translateAnimation);??

?

?

TranslateAnimation類

?

第一個參數fromXDelta ,第二個參數toXDelta:分別是動畫起始、結束時X坐標。

第三個參數fromYDelta?,第四個參數toYDelta:分別是動畫起始、結束時Y坐標。

?

參數詳細說明:

?

表二

XML節點功能說明
alpha漸變透明度動畫效果
<alpha
android:fromAlpha=”0.1″
android:toAlpha=”1.0″
android:duration=”3000″ />
fromAlpha

屬性為動畫起始時透明度

0.0表示完全透明
1.0表示完全不透明
以上值取0.0-1.0之間的float數據類型的數字
toAlpha屬性為動畫結束時透明度

表三

scale漸變尺寸伸縮動畫效果
<scale
android:interpolator= “@android:anim/accelerate_decelerate_interpolator”
android:fromXScale=”0.0″
android:toXScale=”1.4″
android:fromYScale=”0.0″
android:toYScale=”1.4″
android:pivotX=”50%”
android:pivotY=”50%”
android:fillAfter=”false”
android:startOffset=“700”
android:duration=”700″
android:repeatCount=”10″ />
fromXScale[float] fromYScale[float]為動畫起始時,X、Y坐標上的伸縮尺寸0.0表示收縮到沒有
1.0表示正常無伸縮
值小于1.0表示收縮
值大于1.0表示放大
toXScale [float]
toYScale[float]
為動畫結束時,X、Y坐標上的伸縮尺寸
pivotX[float]
pivotY[float]
為動畫相對于物件的X、Y坐標的開始位置屬性值說明:從0%-100%中取值,50%為物件的X或Y方向坐標上的中點位置
????

表四

translate畫面轉換位置移動動畫效果
<translate
android:fromXDelta=”30″
android:toXDelta=”-80″
android:fromYDelta=”30″
android:toYDelta=”300″
android:duration=”2000″ />
fromXDelta
toXDelta
為動畫、結束起始時 X坐標上的位置?
fromYDelta
toYDelta
為動畫、結束起始時 Y坐標上的位置?
????

表五

rotate畫面轉移旋轉動畫效果
<rotate
android:interpolator=”@android:anim/accelerate_decelerate_interpolator”
android:fromDegrees=”0″
android:toDegrees=”+350″
android:pivotX=”50%”
android:pivotY=”50%”
android:duration=”3000″ />
fromDegrees為動畫起始時物件的角度說明
當角度為負數——表示逆時針旋轉
當角度為正數——表示順時針旋轉
(負數from——to正數:順時針旋轉)
(負數from——to負數:逆時針旋轉)
(正數from——to正數:順時針旋轉)
(正數from——to負數:逆時針旋轉)
toDegrees屬性為動畫結束時物件旋轉的角度 可以大于360度
pivotX
pivotY
為動畫相對于物件的X、Y坐標的開始位說明:以上兩個屬性值 從0%-100%中取值
50%為物件的X或Y方向坐標上的中點位置
????

?

?

以上都是單獨的使用某個動畫,那么如何讓多個動畫同時生效呢?

?

答案是?AnimationSet。 ?

初看整個類名,還以為只是用來存放 Animation的一個Set, 細看才發現,該類也是繼承自 Animation的。

?

下面我們實現一個動畫,該動畫會讓圖片移動的同時,圖片透明度漸變,直接看代碼吧。

?

[java]?view plaincopyprint?
  1. //初始化?Translate動畫??
  2. translateAnimation?=?new?TranslateAnimation(0.1f,?100.0f,0.1f,100.0f);??
  3. //初始化?Alpha動畫??
  4. alphaAnimation?=?new?AlphaAnimation(0.1f,?1.0f);??
  5. ??
  6. //動畫集??
  7. AnimationSet?set?=?new?AnimationSet(true);??
  8. set.addAnimation(translateAnimation);??
  9. set.addAnimation(alphaAnimation);??
  10. ??
  11. //設置動畫時間?(作用到每個動畫)??
  12. set.setDuration(1000);??
  13. this.startAnimation(set);??

?

?

?

是不是覺得很簡單呢?

?

?

附上整個View類的代碼吧。

?

[java]?view plaincopyprint?
  1. package?com.yfz.view;??
  2. import?com.yfz.R;??
  3. import?android.content.Context;??
  4. import?android.graphics.Canvas;??
  5. import?android.graphics.drawable.BitmapDrawable;??
  6. import?android.util.Log;??
  7. import?android.view.KeyEvent;??
  8. import?android.view.View;??
  9. import?android.view.animation.AlphaAnimation;??
  10. import?android.view.animation.Animation;??
  11. import?android.view.animation.AnimationSet;??
  12. import?android.view.animation.RotateAnimation;??
  13. import?android.view.animation.ScaleAnimation;??
  14. import?android.view.animation.TranslateAnimation;??
  15. public?class?TweenAnim?extends?View?{??
  16. ??????
  17. ????//Alpha動畫?-?漸變透明度??
  18. ????private?Animation?alphaAnimation?=?null;??
  19. ??????
  20. ????//Sacle動畫?-?漸變尺寸縮放??
  21. ????private?Animation?scaleAnimation?=?null;??
  22. ??????
  23. ????//Translate動畫?-?位置移動??
  24. ????private?Animation?translateAnimation?=?null;??
  25. ??????
  26. ????//Rotate動畫?-?畫面旋轉??
  27. ????private?Animation?rotateAnimation?=?null;??
  28. ??????
  29. ????public?TweenAnim(Context?context)?{??
  30. ????????super(context);??
  31. ????}??
  32. ????@Override??
  33. ????protected?void?onDraw(Canvas?canvas)?{??
  34. ????????super.onDraw(canvas);??
  35. ????????Log.e("Tween",?"onDraw");??
  36. ????????//加載一個圖片??
  37. ????????canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(),?0,?0,?null);??
  38. ????}??
  39. ????@Override??
  40. ????public?boolean?onKeyDown(int?keyCode,?KeyEvent?event)?{??
  41. ????????Log.e("Tween",?"onKeyDown");??
  42. ????????return?true;??
  43. ????}??
  44. ????@Override??
  45. ????public?boolean?onKeyUp(int?keyCode,?KeyEvent?event)?{??
  46. ????????Log.e("Tween",?"onKeyDown");??
  47. ????????switch?(keyCode)?{??
  48. ????????????case?KeyEvent.KEYCODE_DPAD_UP:??
  49. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_UP");??
  50. ????????????????alphaAnimation?=?new?AlphaAnimation(0.1f,?1.0f);??
  51. ????????????????//設置動畫時間??
  52. ????????????????alphaAnimation.setDuration(3000);??
  53. ????????????????this.startAnimation(alphaAnimation);??
  54. ????????????????break;??
  55. ????????????case?KeyEvent.KEYCODE_DPAD_DOWN:??
  56. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_DOWN");??
  57. ????????????????rotateAnimation?=?new?RotateAnimation(0f,?360f);??
  58. ????????????????rotateAnimation.setDuration(1000);??
  59. ????????????????this.startAnimation(rotateAnimation);??
  60. ????????????????break;??
  61. ????????????case?KeyEvent.KEYCODE_DPAD_LEFT:??
  62. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_LEFT");??
  63. ????????????????//初始化??
  64. ????????????????scaleAnimation?=?new?ScaleAnimation(0.1f,?1.0f,0.1f,1.0f);??
  65. ????????????????//設置動畫時間??
  66. ????????????????scaleAnimation.setDuration(500);??
  67. ????????????????this.startAnimation(scaleAnimation);??
  68. ????????????????break;??
  69. ????????????case?KeyEvent.KEYCODE_DPAD_RIGHT:??
  70. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_RIGHT");??
  71. ????????????????//初始化??
  72. ????????????????translateAnimation?=?new?TranslateAnimation(0.1f,?100.0f,0.1f,100.0f);??
  73. ????????????????//設置動畫時間??
  74. ????????????????translateAnimation.setDuration(1000);??
  75. ??????????????????
  76. ????????????????this.startAnimation(translateAnimation);??
  77. ????????????????break;??
  78. ????????????case?KeyEvent.KEYCODE_DPAD_CENTER:??
  79. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_CENTER");??
  80. ????????????????//初始化?Translate動畫??
  81. ????????????????translateAnimation?=?new?TranslateAnimation(0.1f,?100.0f,0.1f,100.0f);??
  82. ????????????????//初始化?Alpha動畫??
  83. ????????????????alphaAnimation?=?new?AlphaAnimation(0.1f,?1.0f);??
  84. ??????????????????
  85. ????????????????//動畫集??
  86. ????????????????AnimationSet?set?=?new?AnimationSet(true);??
  87. ????????????????set.addAnimation(translateAnimation);??
  88. ????????????????set.addAnimation(alphaAnimation);??
  89. ??????????????????
  90. ????????????????//設置動畫時間?(作用到每個動畫)??
  91. ????????????????set.setDuration(1000);??
  92. ????????????????this.startAnimation(set);??
  93. ????????????????break;??
  94. ????????????default:??
  95. ????????????????break;??
  96. ????????}??
  97. ????????return?true;??
  98. ????}??
  99. ??????
  100. }??

?

?

?

在Activity中調用該類時,需要注意一定setFocusable(true), 否則焦點在Activity上的話,onKeyUp方法是不會生效的。

調用該View的代碼:

?

[java]?view plaincopyprint?
  1. TweenAnim?anim?=?new?TweenAnim(Lesson_11.this);??
  2. anim.setFocusable(true);??
  3. setContentView(anim);??

?

?

?

?

?


?

上面通過Java代碼,實現了4中不同的Tween動畫,其實在Android中完全可以通過 XML文件來實現動畫。這種方式可能更加簡潔、清晰,也更利于重用。?

下面我們分別對這幾種動畫改用xml來實現。

?

首先是AlphaAnimation。

alpha_anim.xml:

?

[xhtml]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <set?xmlns:android="http://schemas.android.com/apk/res/android">??
  3. ????<alpha??
  4. ????????android:fromAlpha="0.1"??
  5. ????????android:toAlpha="1.0"??
  6. ????????android:duration="2000"??
  7. ????/>??
  8. </set>??

?

?

?

不用解釋了吧。

?

RotateAnimation

rotate_anim.xml:

?

[xhtml]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <set?xmlns:android="http://schemas.android.com/apk/res/android">??
  3. ????<rotate??
  4. ????????android:interpolator="@android:anim/accelerate_decelerate_interpolator"??
  5. ????????android:fromDegrees="0"??
  6. ????????android:toDegrees="360"??
  7. ????????android:pivotX="50%"??
  8. ????????android:pivotY="50%"??
  9. ????????android:duration="500"??
  10. ????/>??
  11. </set>??

?

?

?

?

ScaleAnimation

scale_anim.xml:

?

[xhtml]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <set?xmlns:android="http://schemas.android.com/apk/res/android">??
  3. ????<scale??
  4. ????????android:interpolator="@android:anim/accelerate_decelerate_interpolator"??
  5. ????????android:fromXScale="0.0"??
  6. ????????android:toXScale="1.0"??
  7. ????????android:fromYScale="0.0"??
  8. ????????android:toYScale="1.0"??
  9. ????????android:pivotX="50%"??
  10. ????????android:pivotY="50%"??
  11. ????????android:fillAfter="false"??
  12. ????????android:duration="500"??
  13. ????/>?????
  14. </set>??

?

?

?

TranslateAnimation

translate_anim.xml:

?

?

[xhtml]?view plaincopyprint?
  1. <?xml?version="1.0"?encoding="utf-8"?>??
  2. <set?xmlns:android="http://schemas.android.com/apk/res/android">??
  3. ????<translate??
  4. ????????android:fromXDelta="10"??
  5. ????????android:toXDelta="100"??
  6. ????????android:fromYDelta="10"??
  7. ????????android:toYDelta="100"??
  8. ????/>??
  9. </set>??

?

?

?

布局文件都已經寫完,那么如何來使用這些文件呢?

?

其實也很簡單,此時需要用到AnimationUtils類。 通過該類中?loadAnimation 方法來加載這些布局文件。

如:

?

[java]?view plaincopyprint?
  1. rotateAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.rotate_anim);??

?

?

?

這次View類的代碼如下:

?

[java]?view plaincopyprint?
  1. package?com.yfz.view;??
  2. import?com.yfz.R;??
  3. import?android.content.Context;??
  4. import?android.graphics.Canvas;??
  5. import?android.graphics.drawable.BitmapDrawable;??
  6. import?android.util.Log;??
  7. import?android.view.KeyEvent;??
  8. import?android.view.View;??
  9. import?android.view.animation.AlphaAnimation;??
  10. import?android.view.animation.Animation;??
  11. import?android.view.animation.AnimationSet;??
  12. import?android.view.animation.AnimationUtils;??
  13. import?android.view.animation.RotateAnimation;??
  14. import?android.view.animation.ScaleAnimation;??
  15. import?android.view.animation.TranslateAnimation;??
  16. public?class?TweenAnim2?extends?View?{??
  17. ??????
  18. ????//Alpha動畫?-?漸變透明度??
  19. ????private?Animation?alphaAnimation?=?null;??
  20. ??????
  21. ????//Sacle動畫?-?漸變尺寸縮放??
  22. ????private?Animation?scaleAnimation?=?null;??
  23. ??????
  24. ????//Translate動畫?-?位置移動??
  25. ????private?Animation?translateAnimation?=?null;??
  26. ??????
  27. ????//Rotate動畫?-?畫面旋轉??
  28. ????private?Animation?rotateAnimation?=?null;??
  29. ??????
  30. ????public?TweenAnim2(Context?context)?{??
  31. ????????super(context);??
  32. ????}??
  33. ????@Override??
  34. ????protected?void?onDraw(Canvas?canvas)?{??
  35. ????????super.onDraw(canvas);??
  36. ????????Log.e("Tween",?"onDraw");??
  37. ????????//加載一個圖片??
  38. ????????canvas.drawBitmap(((BitmapDrawable)getResources().getDrawable(R.drawable.gallery_photo_5)).getBitmap(),?0,?0,?null);??
  39. ????}??
  40. ????@Override??
  41. ????public?boolean?onKeyDown(int?keyCode,?KeyEvent?event)?{??
  42. ????????Log.e("Tween",?"onKeyDown");??
  43. ????????return?true;??
  44. ????}??
  45. ????@Override??
  46. ????public?boolean?onKeyUp(int?keyCode,?KeyEvent?event)?{??
  47. ????????Log.e("Tween",?"onKeyDown");??
  48. ????????switch?(keyCode)?{??
  49. ????????????case?KeyEvent.KEYCODE_DPAD_UP:??
  50. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_UP");??
  51. ??????????????????
  52. ????????????????alphaAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.alpha_anim);??
  53. ??????????????????
  54. ????????????????this.startAnimation(alphaAnimation);??
  55. ????????????????break;??
  56. ????????????case?KeyEvent.KEYCODE_DPAD_DOWN:??
  57. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_DOWN");??
  58. ??????????????????
  59. ????????????????rotateAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.rotate_anim);??
  60. ??????????????????
  61. ????????????????this.startAnimation(rotateAnimation);??
  62. ????????????????break;??
  63. ????????????case?KeyEvent.KEYCODE_DPAD_LEFT:??
  64. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_LEFT");??
  65. ??????????????????
  66. ????????????????scaleAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.scale_anim);??
  67. ??????????????????
  68. ????????????????this.startAnimation(scaleAnimation);??
  69. ????????????????break;??
  70. ????????????case?KeyEvent.KEYCODE_DPAD_RIGHT:??
  71. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_RIGHT");??
  72. ??????????????????
  73. ????????????????translateAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.translate_anim);??
  74. ??????????????????
  75. ????????????????this.startAnimation(translateAnimation);??
  76. ????????????????break;??
  77. ????????????case?KeyEvent.KEYCODE_DPAD_CENTER:??
  78. ????????????????Log.e("Tween",?"onKeyDown?-?KEYCODE_DPAD_CENTER");??
  79. ????????????????//初始化?Translate動畫??
  80. ????????????????translateAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.translate_anim);??
  81. ??????????????????
  82. ????????????????//初始化?Alpha動畫??
  83. ????????????????alphaAnimation?=?AnimationUtils.loadAnimation(this.getContext(),?R.anim.alpha_anim);??
  84. ??????????????????
  85. ????????????????//動畫集??
  86. ????????????????AnimationSet?set?=?new?AnimationSet(true);??
  87. ????????????????set.addAnimation(translateAnimation);??
  88. ????????????????set.addAnimation(alphaAnimation);??
  89. ??????????????????
  90. ????????????????//設置動畫時間?(作用到每個動畫)??
  91. ????????????????set.setDuration(1000);??
  92. ????????????????this.startAnimation(set);??
  93. ????????????????break;??
  94. ????????????default:??
  95. ????????????????break;??
  96. ????????}??
  97. ????????return?true;??
  98. ????}??
  99. ??????
  100. } ?

?

轉載于:https://www.cnblogs.com/Free-Thinker/p/4380002.html

總結

以上是生活随笔為你收集整理的【Android动画】之Tween动画 (渐变、缩放、位移、旋转)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。