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軸進行旋轉,旋轉角度以度數爲單位,當該值爲正數表示順時針旋轉,當該值爲負數時表示逆時針旋轉,