Android動畫RotateAnimation(fromDegrees, toDegrees, pivotX,pivotY)參數
博客撰寫人:It一zhai男
轉載請標明地址:http://blog.csdn.net/u013293125/article/details/52637189
本文內容知識點包括:
【1】ImageView的getHeight()和getWidth()為0的解決方法及原因
【2】RotateAnimation(fromDegrees, toDegrees, pivotX,pivotY)參數解析
先上截圖:
一、ImageView的getHeight()和getWidth()為0的解決方法及原因
原因:因為onCreate方法執行完了,我們定義的控件才會被度量(measure),所以我們在onCreate方法里面通過view.getHeight()獲取控件的高度或者寬度肯定是0,因為它自己還沒有被度量,也就是說他自己都不知道自己有多高,而你這時候去獲取它的尺寸,肯定是不行的.
網上有大神寫的很詳細:
http://www.cnblogs.com/kissazi2/p/4133927.html
http://blog.csdn.net/xiayu98020214/article/details/46714015
解決方法:將一個runnable添加到Layout隊列中:View.post()。簡單地說,只要用View.post()一個runnable就可以了。runnable對象中的方法會在View的measure、layout等事件后觸發,具體的參考Romain Guy:
UI事件隊列會按順序處理事件。在setContentView()被調用后,事件隊列中會包含一個要求重新layout的message,所以任何你post到隊列中的東西都會在Layout發生變化后執行。
1 final View view=//smth; 2 ... 3 view.post(new Runnable() { 4 @Override 5 public void run() { 6 view.getHeight(); //height is ready 7 } 8 });
二、RotateAnimation(fromDegrees, toDegrees, pivotX,pivotY)參數解析
fromDegrees:旋轉的起始角度
toDegrees:旋轉的終止角度
pivotX:該對象被旋轉的點的X坐標,指定為一個絕對數字,其中0個是左邊緣。
pivotY:對象被旋轉的點的Y坐標,指定為一個絕對數字,其中0個是頂部邊緣。
pivotX和pivotY怎么理解呢?其實就是你所要旋轉的View的左頂點為坐標原點,pivotX=0時是View的左邊緣,pivotY=0時是View的頂部邊緣。點(pivotX=0,pivotY=0)就是View的左頂點。
三、activity_imagerotate.xml文件:
1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent" 5 android:orientation="vertical" > 6 <ImageView 7 android:id="@+id/iv" 8 android:layout_gravity="center_vertical|center_horizontal" 9 android:layout_width="7dp" 10 android:layout_height="200dp" 11 android:background="@drawable/diaobi_green"/> 12 13 </LinearLayout>
四、ImageRotate.java文件
1 package com.example.progresstest; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 import android.text.style.LineHeightSpan.WithDensity; 6 import android.util.Log; 7 import android.view.animation.Animation; 8 import android.view.animation.RotateAnimation; 9 import android.widget.ImageView; 10 11 public class ImageRotate extends Activity{ 12 private ImageView iv; 13 private int width,height; 14 @Override 15 protected void onCreate(Bundle savedInstanceState) { 16 // TODO Auto-generated method stub 17 super.onCreate(savedInstanceState); 18 setContentView(R.layout.activity_imagerotate); 19 20 iv = (ImageView) findViewById(R.id.iv); 21 //這里用post是為了得到iv的高度和寬度,如果不用post, 22 //得到的高度和寬度的值為0,因為在iv被繪制之前就調用了getHeight和getWidth; 23 iv.post(new Runnable() { 24 25 @Override 26 public void run() { 27 // TODO Auto-generated method stub 28 /** 29 *RotateAnimation(fromDegrees, toDegrees, pivotX,pivotY) 30 *pivotX:該對象被旋轉的點的X坐標,指定為一個絕對數字,其中0個是左邊緣。 31 *pivotY:對象被旋轉的點的Y坐標,指定為一個絕對數字,其中0個是頂部邊緣。 32 */ 33 height = iv.getHeight(); 34 width = iv.getWidth()/2; 35 RotateAnimation animation = new RotateAnimation(0, 90, width,height); 36 animation.setDuration(10000);//設定轉一圈的時間 37 // animation.setRepeatCount(Animation.INFINITE);//設定無限循環 38 // animation.setRepeatMode(Animation.RESTART);//設定重復模式 39 iv.startAnimation(animation); 40 //ture表示動畫結束后停留在動畫的最后位置, 41 //false表示動畫結束后回到初始位置,默認為false。 42 animation.setFillAfter(true); 43 } 44 }); 45 } 46 47 }