3月 25, 2020 Android
### 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|
過去文章
2025 (9)
4 (5)
3 (1)
2 (3)
2024 (25)
11 (3)
10 (3)
9 (1)
3 (18)
2022 (6)
10 (1)
6 (2)
5 (1)
3 (1)
1 (1)
2021 (21)
11 (7)
7 (1)
6 (2)
5 (2)
4 (6)
3 (2)
2 (1)
2020 (92)
12 (1)
11 (2)
10 (4)
9 (10)
8 (5)
7 (1)
6 (3)
5 (1)
4 (4)
3 (25)
2 (7)
1 (29)
2019 (57)
12 (25)
11 (7)
9 (25)