์ปค์คํ ๋ทฐ CustomView
์ปค์คํ ๋ทฐ๋
์๋๋ก์ด๋ Android์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณตํ๋ ์์ ฏ๋ค(TextView, Button, EditText, ListView ๋ฑ)์ด ์๋๋ผ ๋ด ํ์์ ๋ง์ถฐ์ ๋ง๋ View๋ฅผ ๋งํ๋ค.
์ปค์คํ ๋ทฐ๋ฅผ ๋ง๋๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ
- ์๋๋ก์ด๋ ์ ๊ณต UI๋ฅผ ํ์ฅํ๋ค.
class TaggableTextView extends TextView {
...
}
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ View ๋๋ ViewGroup์์๋ถํฐ ํ์ฅํด์ ์ง์ ๊ตฌํํ๋ค.
class TaggableTextView extends View {
...
}
1๋ฒ์ ๋์จํ ์๋ฏธ์์์ ์ปค์คํ
๋ทฐ์ด๊ณ 2๋ฒ์ด ํ์ดํธํ ์๋ฏธ์์์ ์ปค์คํ
๋ทฐ๋ผ๊ณ ํ ์ ์๊ฒ ๋ค.
์ด์ฐ๋ณด๋ฉด ๋น์ฐํ์ง๋ง 2๋ฒ์ ์ฑ๋ฅ์ ์ผ๋ก ์๋นํ ์ด๋์ ๋ณผ ์ ์๋ค. ํ์ํ ๊ธฐ๋ฅ๋ง ์ปดํฉํธํ๊ฒ ์ง์ ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ฃผ ๋จ์ํด ๋ณด์ด๋ TextView๋ ๋ด๋ถ์ ์ผ๋ก ๋ณด๋ฉด ์๋นํ ๋ง์ ๊ฒ๋ค์ด ์ฐจ๋ ค์ ธ ์๋ค.
์์ฆ ๋๋ฐ์ด์ค ํ๋์จ์ด๊ฐ ์๋ ์ข์์ ์ฒด๊ฐํ๊ธฐ ์ด๋ ค์ธ ์ ์์ผ๋ ๋ ์ต๊ทผ์ ๋ง์๋ฉ๋ก ๊ธฐ๊ธฐ์์ ์์ฒญ๋ ์ฑ๋ฅ ์์น์ ๊ฒฝํํ๋ค!
์ฌ๋ฌ Child View๊ฐ ๋์ ์ผ๋ก ๋ถ์ UI๋ฅผ ํ๋์ View๋ก ์ปค์คํ
ํ์ฌ ๊ตฌํํ๋๋ ๋๋ ์ด๊ฐ 4๋ถ์ 1์ด ๋์๋ค. ๋ ์ด ์ดํ๋ก ์ปค์คํ
๋ทฐ๋ฅผ ์ฐฌ์ํ๊ธฐ๋ก ํ๊ณ ์์ผ๋ก View๋ฅผ ๊ตฌํํ ๋ ์ฌ๋งํ๋ฉด onDraw์์ ๊ทธ๋ฆด ์๊ฐ์ด๋ค.(๊ธ์ฌ๋น )
์ด์ ๋ถํฐ ์ด ๊ธ์ '์ปค์คํ ๋ทฐ'๋ 2๋ฒ์ ์ปค์คํ ๋ทฐ๋ฅผ ์ง์นญํ๋ค.
View์ LifeCycle
๊ฐ๋ฐ์๊ฐ override์์ ์ฐ๋ ๊ฑด on์ด ๋ถ์ด ์๋ ๊ฒ๋ค์ด๋ผ๊ณ ๋ณด๋ฉด ๋๋ค.
- onAttachedToWindow() : View๊ฐ Window์ ์ฐ๊ฒฐ๋๋ฉด ํธ์ถ.
- onMeasure() : View์ ํฌ๊ธฐ๋ฅผ ์ธก์ ํ๋ ๋จ๊ณ
- onLayout() : View์ ์์น์ ํฌ๊ธฐ๋ฅผ ํ ๋นํ๋ ๋จ๊ณ
- onDraw() : View๋ฅผ ๊ทธ๋ฆฌ๋ ๋จ๊ณ
๋ฌด์กฐ๊ฑด ์ฐ๋ ํ
drawText()
๋ฅผ ์ธ ๋Paint
์ antiAlias๋ฅผ ์ ์ฉํ์ง ์์ผ๋ฉด ๊ธ์๊ฐ ๊ณ๋จํ์์ ๊ฐ๊ณ ๊ทธ๋ ค์ง๋ค.
paintText = new Paint(Paint.LINEAR_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
- ๊ธ์๋ฅผ ๊ฐ๋ก ๊ธธ์ด๋ฅผ ์๊ณ ์ถ์ ๋
paintText.measureText(text);
Paint
๋Rect
๋ constructor์์ initializeํ์.
Avoid object allocations during draw/layout operations (preallocate and reuse instead)
Paint๋ฅผ ์ฐ๋ onDraw์์ ๋ฌด์ฌ์ฝ new Paint
๋ฅผ ์๋ํ์๋๋ ์ด๋ ๊ฒ ๊ฒฝ๊ณ ๊ฐ ๋์จ๋ค.
๋ง ๊ทธ๋๋ก onDraw๋ onLayout์์ ๊ฐ์ฒด๋ฅผ ํ ๋นํ์ง ๋ง๋ผ๋ ๊ฒฝ๊ณ .
constructor์์ initํด์ฃผ๋ฉด ๋๋ค.
public TaggableTextView(Context context, String text) {
super(context);
paintText = new Paint(Paint.LINEAR_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);
rect = new Rect();
}
- WRAP_CONTENT๊ฐ ์ ๋จนํ๋ค?
์ด๋ ๊ฒ ๋ง๋ View์ LayoutParams์ setํ๋ ค๊ณ ํ ๋ wrap_content๊ฐ ์ ๋จน์ ์๊ฐ ์๋ค.
View์ LifeCycle์ ๋ ์ฌ๋ฆฌ๋ฉด layout์ด draw๋ณด๋ค ์์ธ ๊ฒ์ ์ ์ ์๋ค. ๋ด๊ฐ draw์ ๋ญ ์ผ๋ง๋ ๊ทธ๋ ธ๋์ง๋ Layout๋จ๊ณ์์๋ ๋ชจ๋ฅด๋ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ Layout ์ ๋จ๊ณ(Measure)์์ ์ง์ ์ ์ผ๋ก Param์ ์ก์์ค์ผ ํ๋ค.
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(widthMeasureSpec, dpToPx(56));
}
์๋๋ฉด setLayoutParams() ํ์ requestLayout()๋ก ์๋ก๊ณ ์นจํ๋ ๋ฐฉ๋ฒ๋ ์๊ฒ ๋ค.
(requestLayout์ผ๋ก wrap_content๊ฐ ๋จนํ๋์ง ์ค์ ๋ก ํด๋ณด์ง ์์์ง๋ง View๋ฅผ ์ฌ๋ฆด ๋๋ง๋ค onDraw๋ฅผ ๋ ๋ฒ ํ๊ฒ ๋๋ฏ๋ก ํผํ ์ ์์ผ๋ฉด ํผํ๋ ๊ฒ ๋ง๋ค๊ณ ์๊ฐํ๋ค.)
#์๋๋ก์ด๋