本文主要介紹Android中如何使用rotate實現圖片不停旋轉的效果。Android 平臺提供了兩類動畫,一類是 Tween 動畫,即通過對場景裏的對象不斷做圖像變換(平移、縮放、旋轉)產生動畫效果;第二類是 Frame 動畫,即順序播放事先做好的圖像,跟電影類似。
1、定義一個ImageView
定義一個ImageView是爲了裝載圖片,其中的圖片將被rotate用來進行旋轉,其他View亦可。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img"
android:layout_centerInParent="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/air_condition"/>
</RelativeLayout>
其中的android:src
爲圖片內容,可使用附件中的圖片。
2、定義rotate旋轉效果
在res/anim文件夾下新建rotate_anim.xml文件,內容如下
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android">
<rotate
android:fromDegrees="0"
android:toDegrees="359"
android:pivotX="50%"
android:pivotY="50%"
android:duration="2000"
android:repeatCount="-1">
</rotate>
</rotate>
含義表示從0到359度開始循環旋轉,0-359(若設置成360在停止時會出現停頓現象)度旋轉所用時間爲500ms,旋轉中心距離view的左頂點爲50%距離,距離view的上邊緣爲50%距離,即正中心,具體每個含義見下面的具體屬性介紹。
Animation rotateAnimation = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
LinearInterpolator lin = new LinearInterpolator();
rotateAnimation.setInterpolator(lin);
m_imgSnow.startAnimation(rotateAnimation);
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"表示不間斷
3、開始和停止旋轉
在操作開始之前調用
Animation rotate = AnimationUtils.loadAnimation(this, R.anim.rotate_anim);
if (rotate != null) {
img.startAnimation(rotate);
} else {
img.setAnimation(rotate);
img.startAnimation(rotate);
}
在操作完成時調用
img.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);
}
}
4用Java codes同樣也能實現相同的效果
RotateAnimation rotate = new RotateAnimation(0f, 360f, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
LinearInterpolator lin = new LinearInterpolator();
rotate.setInterpolator(lin);
rotate.setDuration(2000);//設置動畫持續週期
rotate.setRepeatCount(-1);//設置重複次數
rotate.setFillAfter(true);//動畫執行完後是否停留在執行完的狀態
rotate.setStartOffset(10);//執行前的等待時間
img.setAnimation(rotate);
完!!!
轉自:https://www.jianshu.com/p/7b5ad585baf0