### Component 大小
使用 XML 可以為 Layout 內的 Component 設定高度大小等,用的單位可以自行選擇,只要鍵入在數字後便可以。
```xml
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center|center"
android:text="text"
android:textSize="20sp" />
```
### 使用 Programming 方法設定
我們也可以使用 Programming 的方法來生成一個 TextView。
```java
// layout params
ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
// create text view
TextView mTextView = new TextView(context);
mTextView.setLayoutParams(mLayoutParam);
mTextView.setGravity(Gravity.CENTER|Gravity.CENTER);
mTextView.setText("text");
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
```
上面的代碼應該也能生成一個和上面 XML 相同的 TextView。我們再修改一下上面的 XML :
```xml
<TextView
android:layout_width="match_parent"
android:layout_height="100dp"
android:gravity="center|center"
android:text="text"
android:textSize="20sp" />
```
這樣可以生成一個高度 100dp 的 TextView,於是我們又改一下 Java Program :
```java
// layout params
ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 100);
// create text view
TextView mTextView = new TextView(context);
mTextView.setLayoutParams(mLayoutParam);
mTextView.setGravity(Gravity.CENTER|Gravity.CENTER);
mTextView.setText("text");
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
```
這樣能生成一個 100dp 的 TextView 嗎? 答案是不行的,因為 LayoutParams 沒有像 setTextSize() 一樣能接受一個 Unit (單位) 的值傳入去,所以上面傳入去的 100 只是一個不知道什麽單位的數字,要達到使用 dp 單位的效果,需要加多一點計算才可以啊 !
### 算出 dp 值
通過下面的方法,我們可以計算出不同單位的數值 :
```java
// get resources
Resources r = getResources();
// target height in dp
int height = 100;
// calculate number
float heightInDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, r.getDisplayMetrics());
```
然後就可以把計算出來的值放入 LayoutParams 內,就可以設定出相應的單位。
```java
// get resources
Resources r = getResources();
// target height in dp
int height = 100;
// calculate number
float heightInDp = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, height, r.getDisplayMetrics());
// layout params
ViewGroup.LayoutParams mLayoutParam = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, heightInDp);
// create text view
TextView mTextView = new TextView(context);
mTextView.setLayoutParams(mLayoutParam);
mTextView.setGravity(Gravity.CENTER|Gravity.CENTER);
mTextView.setText("text");
mTextView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 20);
```
### TypedValue 的種類
TypedValue 有以下的類型 (不同的單位) :
|常數|說明|
|---|
|TypedValue.COMPLEX_UNIT_PX|Pixels|
|TypedValue.COMPLEX_UNIT_SP|Scaled Pixels|
|TypedValue.COMPLEX_UNIT_DIP|Device Independent Pixels|