本文主要介紹Android中如何使用rotate實現圖片不停旋轉的效果。Android 平臺提供了兩類動畫,一類是 Tween 動畫,即經過對場景裏的對象不斷作圖像變換(平移、縮放、旋轉)產生動畫效果;第二類是 Frame 動畫,即順序播放事先作好的圖像,跟電影相似。本文分析 Tween動畫的rotate實現旋轉效果。html
在新浪微博客戶端中各個操做進行中時activity的右上角都會有個不停旋轉的圖標,相似刷新的效果,給用戶以操做中的提示。這種非模態的提示方式推薦使用,那麼下面就分享下如何實現這種效果吧 java
一、定義一個ImageView linux
定義一個ImageView是爲了裝載圖片,其中的圖片將被rotate用來進行旋轉,其餘View亦可。android
資源文件爲ide
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <ImageView android:id="@+id/infoOperating" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/operating" android:scaleType="center"> </ImageView> </LinearLayout>
其中的android:src爲圖片內容,可以使用附件中的圖片。函數
java代碼爲動畫
ImageView infoOperatingIV = (ImageView)findViewById(R.id.infoOperating);
二、定義rotate旋轉效果 ui
在res/anim文件夾下新建tip.xml文件,內容以下this
<?xml version="1.0" encoding="utf-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <rotate android:fromDegrees="0" android:toDegrees="359" android:duration="500" android:repeatCount="-1" android:pivotX="50%" android:pivotY="50%" /> </set>
含義表示從0到359度開始循環旋轉,0-359(若設置成360在中止時會出現停頓現象)度旋轉所用時間爲500ms,旋轉中心距離view的左頂點爲50%距離,距離view的上邊緣爲50%距離,即正中心,具體每一個含義見下面的具體屬性介紹。spa
java代碼爲
Animation operatingAnim = AnimationUtils.loadAnimation(this, R.anim.tip);
LinearInterpolator lin = new LinearInterpolator();
operatingAnim.setInterpolator(lin);
setInterpolator表示設置旋轉速率。LinearInterpolator爲勻速效果,Accelerateinterpolator爲加速效果、DecelerateInterpolator爲減速效果,具體可見下面android:interpolator的介紹。
a. 關於其中的屬性意義以下(紅色部分加以注意):
android:fromDegrees 起始的角度度數
android:toDegrees 結束的角度度數,負數表示逆時針,正數表示順時針。如10圈則比android:fromDegrees大3600便可
android:pivotX 旋轉中心的X座標
浮點數或是百分比。浮點數表示相對於Object的左邊緣,如5; 百分比表示相對於Object的左邊緣,如5%; 另外一種百分比表示相對於父容器的左邊緣,如5%p; 通常設置爲50%表示在Object中心
android:pivotY 旋轉中心的Y座標
浮點數或是百分比。浮點數表示相對於Object的上邊緣,如5; 百分比表示相對於Object的上邊緣,如5%; 另外一種百分比表示相對於父容器的上邊緣,如5%p; 通常設置爲50%表示在Object中心
android:duration 表示從android:fromDegrees轉動到android:toDegrees所花費的時間,單位爲毫秒。能夠用來計算速度。
android:interpolator表示變化率,但不是運行速度。一個插補屬性,能夠將動畫效果設置爲加速,減速,反覆,反彈等。默認爲開始和結束慢中間快,
android:startOffset 在調用start函數以後等待開始運行的時間,單位爲毫秒,若爲10,表示10ms後開始運行
android:repeatCount 重複的次數,默認爲0,必須是int,能夠爲-1表示不中止
android:repeatMode 重複的模式,默認爲restart,即重頭開始從新運行,能夠爲reverse即從結束開始向前從新運行。在android:repeatCount大於0或爲infinite時生效
android:detachWallpaper 表示是否在壁紙上運行
android:zAdjustment 表示被animated的內容在運行時在z軸上的位置,默認爲normal。
normal保持內容當前的z軸順序
top運行時在最頂層顯示
bottom運行時在最底層顯示
b. 運行速度
運行速度爲運行時間(android:duration)除以運行角度差(android:toDegrees-android:fromDegrees),好比android:duration爲1000,android:toDegrees爲360,android:fromDegrees爲0就表示1秒轉1圈。
c. 循環運行
android:fromDegrees="0" android:toDegrees="360" android:repeatCount="-1"
android:repeatCount="-1"即表示循環運行,配合上android:fromDegrees="0" android:toDegrees="360"表示不間斷
三、開始和中止旋轉
在操做開始以前調用
if (operatingAnim != null) { infoOperatingIV.startAnimation(operatingAnim); }
在操做完成時調用
infoOperatingIV.clearAnimation();
許多朋友不知道如何中止旋轉animation,因此強制設置rotate轉動多少圈表示操做,但卻沒法與操做實際的進度匹配上,實際上只要如上代碼所示清除animation便可。
其餘:
對於上面的轉動在橫屏(被設置爲了避免重繪activity)時會出現問題,即旋轉中心偏移,致使動畫旋轉偏離原旋轉中心。解決以下
@Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (operatingAnim != null && infoOperatingIV != null && operatingAnim.hasStarted()) { infoOperatingIV.clearAnimation(); infoOperatingIV.startAnimation(operatingAnim); } }
屬性能夠參考:
http://developer.android.com/guide/topics/resources/animation-resource.html#rotate-element
http://developer.android.com/reference/android/view/animation/Animation.html#lattrs
關於動畫更多能夠參考
http://www.linuxgraphics.cn/animation/android_tween_animation.html