1. 程式人生 > >自定義View-Point類和PointF類

自定義View-Point類和PointF類

Point 類和 PointF 類:
Point 類是一種最簡單的結構,代表一個“點”,實現了 Parcelable 介面,支援序列化與反序列化。Point 類定義了兩個 int 成員 x 和 y,代表點的 x 座標和 y 座標,圖形座標系與數學中的平面座標系有所不同,x 方向向左為負,向右為正,y 方向向上向負,向下為正,圖形座標系的原點在左上角,這一點要特別注意,所以,預設情況下,當 x、y 為正數時該點會顯示在螢幕之內(取決於螢幕大小),如果為負數就顯示在螢幕之外。在 Android 中,通過相應的 API 是可以對圖形座標系進行平移和旋轉的。

Point 類作為一種最簡單的資料結構,提供的也只有簡單的功能,大概如下:
初始化點的 x、y 座標:
public Point() {
            
}
public Point(int x,int y){
     this.x = x;
     this.y = y;
}
public Point(Point src) {
     this.x = src.x;
     this.y = src.y;
}

可以為 Point 提供一個(x,y)座標值,也可以將一個 Point 的座標值複製給另一個 Point。改變 x、y 的座標值:Point 類 提供了三個方法用於改變 Point 物件的 x、y 值,分別是:
public void set( int x, int y){
     this.x = x;
     this.y = y;
}
public final void negate () {
     x = -x;
     y = -y;
}
public final void offset ( int dx, int dy){
     x += dx;
     y += dy;
}

其中,set()方法簡單粗暴地為 x、y 重新賦值,negate()方法將 x、y 取反,offset()方法則改變x、y 的偏移量,正負符號決定座標偏移的方向。


序列化與反序列化:重寫了 Parcelable 介面的 writeToParcel()、readFromParcel()等相關方法,雖然 Java 中也有序列化介面 Serializable,但是 Parcelable 的效率更高、效能更好。


PointF 類和 Point 類的定義是完全一樣的,最大的不同就是成員變數 x、y 的型別不是 int 而是 float,這也是加了字尾“F”的原因。不過,PointF ᨀ供了一個很貼心的功能,定義了 length()方法計算座標原點(0,0)到(x,y)之間的距離,而且有兩個版本:靜態的 length()和非靜態的length(),程式碼如下:
public final float length() {
   return length(x, y);
}

public static float length(float x,float y) {
  return FloatMath.sqrt(x * x + y * y);
}