【Android開發】View的平移、縮放、旋轉以及位置、座標系


Android開發中,經常會接觸到自定義View,而與View繪製相關的一組組方法很容易讓人混淆……

現在個人簡單整理,希望能夠讓大家有個清晰的認識


1、移動View內容的相關變量和方法 (注意:是移動View所包含的內容,而非View本身


View相關成員變量

//View的內容相對於View在水平方向上的偏移量,以像素爲單位
//當mScrollX爲正數時,內容相對於View從右向左移動,反之則向從左向右移動
protected int mScrollX;

//View的內容相對於View在垂直方向上的偏移量,以像素爲單位
//當mScrollY爲負數時,內容相對於View從下向上移動,反之則向從上向下移動
protected int mScrollY;



View相關成員方法


//獲取內容偏移量mScrollX的值
int android.view.View.getScrollX()

//獲取內容偏移量mScrollY的值
int android.view.View.getScrollY()

//設置內容偏移量mScrollX的值,此方法引發View重新調整內容的位置並重繪
//相當於調用scrollTo(value,mScrollY)
void android.view.View.setScrollX(int value)

//設置內容偏移量mScrollY的值,此方法引發View重新調整內容的位置並重繪
//相當於調用scrollTo(mScrollX,value)
void android.view.View.setScrollY(int value)

//將View的內容移動到參數所指定的位置中,此時mScrollX=x,mScrollY=y。
//此方法引發View重新調整內容的位置並重繪
void android.view.View.scrollTo(int x, int y)

//設置View內容移動的增量,相當於調用scrollTo(mScroll+x, mScroll+y);
//此方法引發View重新調整內容的位置並重繪
void android.view.View.scrollBy(int x, int y)


關於ScrollTo方法的使用效果如下圖所示:


如上圖所示,黃色View(一個LinearLayout)在調用了scrollTo(100,0)方法之後,View裏面的按鈕全部向左偏移了100像素。而黃色View本身並沒有發生位置上的變化。


再看下面圖,黃色View調用了scrollTo(0,100)方法之後,View裏面的按鈕全部向上偏移了100像素,而黃色區域本身沒有發生位置上的變化。



從上面的例子中,不管你調用多少次scrollTo(100,0),其最終效果都只是讓mScrollX=100,mScrollY=0。也就是說,該方法重複調用,只有一次效果。


而scrollBy(int,int)方法而不同,scrollBy方法被調用一次之後,mScrollX和mScrollY就會增加相應的值,下圖是重複調用三次scrollBy(100,0)的效果:




2、移動View的相關變量和方法 (注意:是移動整個View


View相關成員變量


//此成員變量包含了View的平移、縮放、旋轉、錨點等屬性
//平移相關的是mTransformationInfo.mTranslationX和mTransformationInfo.mTranslationY
TransformationInfo mTransformationInfo;

View相關成員方法


//此方法用於獲取View在水平方向的偏移量,以像素爲單位
public float android.view.View.getTranslationX()

//此方法用於獲取View在垂直方向的偏移量,以像素爲單位
public float android.view.View.getTranslationY()

//此方法用於設置View在水平方向的偏移量,以像素爲單位。會引發View重繪
//偏移量爲正數時,表示View從左向右平移。反之則從右向左平移
public void android.view.View.setTranslationX(float translationX)

//此方法用於設置View在水平方向的偏移量,以像素爲單位。會引發View重繪
//偏移量爲正數時,表示View從上向下平移。反之則從下向上平移
public void android.view.View.setTranslationY(float translationY)



View的平移、縮放、旋轉、錨點信息都存放在View的成員變量mTransformationInfo中,

而mTransformationInfo還包含了一個矩陣變量mMatrix(可以通過View.getMatrix()獲取),

這個矩陣作用很大,因爲平移、綻放、旋轉操作,都可以轉化爲對矩陣的數學運算……

不熟悉的話,可以參考這篇文章(http://blog.csdn.net/webrobot/article/details/7359626



上面代碼塊中的四個方法,都是平移操作相關的方法。

下圖是簡單的示意圖:



上面右邊的紅色線框表示View的實際大小!

黃色View調用了setTranslationX(100)之後,水平偏移量爲100,整個黃色View從左往右移動了100像素。

如果調用的是setTranslationX(-100)的話,整個黃色View就會從右往左移動100像素。

注意:這個移動方向和scrollTo恰恰相反



黃色View調用了translationY(100)之後,效果如下所示:


如上圖所示,當垂直偏移量爲正數時,黃色View從上往下移動了100像素;反之,當垂直偏移量爲負數時,黃色View從下往上移動。



3、縮放View的相關變量和方法 (注意:針對整個View


View相關成員變量


//此成員變量包含了View的平移、縮放、旋轉、錨點等屬性
//縮放相關的是mTransformationInfo.mScaleX和mTransformationInfo.mScaleY
TransformationInfo mTransformationInfo;

View相關成員方法


//此方法用於獲取View在水平方向的縮放比例。
public float android.view.View.getScaleX()


//此方法用於獲取View在垂直方向的縮放比例。
public float android.view.View.getScaleY()


//設置View在水平方向的縮放比例
//scaleX=1,表示是原來的大小
//scaleX<1,表示縮小,如scale=0.5f,表示寬度是原來的0.5倍
//scaleX>1,表示放大,如scale=2.0f,表示寬度是原來的2.0倍
public void android.view.View.setScaleX(float scaleX)


//設置View在垂直方向的縮放比例
//scaleY=1,表示是原來的大小
//scaleY<1,表示縮小,如scale=0.5f,表示高度是原來的0.5倍
//scaleY>1,表示放大,如scale=2.0f,表示高度是原來的2.0倍
public void android.view.View.setScaleY(float scaleY)


//設置錨點的X座標值,以像素爲單位。默認是View的中心。
public void android.view.View.setPivotX(float pivotX)


//設置錨點的Y座標值,以像素爲單位。默認是View的中心。
public void android.view.View.setPivotX(float pivotX)


通過調用setScaleX()和setScaleY()方法,可以實現View的縮放,其效果圖如下所示




上面還提到了兩個方法,分別是setPivotX()和setPivotY(),其他是用來設置縮放操作的錨點座標的。以像素爲單位,它的默認值是View的中心座標。

如上圖,黃色View的大小爲width=984、height=1461,

而getPivotX()爲492.0 、getPivotY()爲730.5,

這正好表明了,View的錨點座標默認就是View的中心座標。


錨點的位置,將決定View縮放後所在的位置。

因爲默認是中心座標,所以上面兩次綻放操作,其結果都是在水平中心位置或垂直中心位置。


但是,如果錨點的位置變了,那麼View縮放後的位置也將發生變化,如下圖所示




4、旋轉View的相關變量和方法 (注意:針對整個View


View相關成員變量


//此成員變量包含了View的平移、縮放、旋轉、錨點等屬性
//縮放相關是mTransformationInfo的mRotation、mRotationX、mRotationY
TransformationInfo mTransformationInfo;


View相關成員方法


//此方法用於獲取View在Z軸上的旋轉角度
public float android.view.View.getRotation()

//此方法用於獲取View在X軸上的旋轉角度
public float android.view.View.getRotationX()

//此方法用於獲取View在Y軸上的旋轉角度
public float android.view.View.getRotationY()



//設置View在Z軸上的旋轉角度
public void android.view.View.setRotation(float rotation)

//設置View在X軸上的旋轉角度
public void android.view.View.setRotationX(float rotationX)

//設置View在Y軸上的旋轉角度
public void android.view.View.setRotationY(float rotationY)



//設置View旋轉中心點的X座標。
public void android.view.View.setPivotX(float pivotX)

//設置View旋轉中心點的Y座標。
public void android.view.View.setPivotX(float pivotX)


//設置攝像機的與旋轉目標在Z軸上距離
void android.view.View.setCameraDistance(float distance)




旋轉包括了三種方式,分別是圍繞着X、Y、Z軸進行旋轉,旋轉角度以度數爲單位,當該值爲正數表示順時針旋轉,當該值爲負數時表示逆時針旋轉,
比如setRotation(90)表示圍繞Z軸順時針旋轉90度。

這裏的座標系,與數學上的空間座標系有點區別,如下圖所示 :

X軸、Y軸的方向與我們平時編程所接觸的方向一致,而Z軸方向是由屏幕內與屏幕外延伸。

所謂順時針旋轉與逆時針旋轉,與座標軸的方向相關,
一般是從正方向往負方向看。


下圖是圍繞Z軸順時針旋轉90度的的效果


下圖是圍繞X軸順時針旋轉45度的效果

下圖是圍繞Y軸順時針旋轉45度的效果



這些方法可以連在一起使用,如下圖所示,猜猜用如何實現這種效果



上圖是setRotation(90)和setRotationX的綜合效果。



在以上的旋轉操作,默認都是View的中心座標爲旋轉中心的,可能通過setPivotX()和setPivotY()來修改該旋轉中心的座標。這裏就不再舉例了。


另外,上面還提到一個方法是setCameraDistance(float),該方法用於設置攝像機與View的距離,用於改善3D旋轉的效果,
該方法只能用於setRotationX和setRoationY,對setRotation無影響。

getCameraDistance()方法用於獲取當前攝像機到View的距離。

這兩個方法是Android3.1才提供的,用得比較少,不再詳述。





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章