1.四個(gè)方法
- onMeasure()
- onLayout()
- onDraw()
- onTouch()
2.三個(gè)構(gòu)造函數(shù)使用場(chǎng)景
- 一個(gè)參數(shù):new Button(context);
- 兩個(gè)參數(shù):xml文件中使用
- 三個(gè)參數(shù):在控件有style屬性時(shí)使用
3.三種測(cè)量模式
MeasureSpec
為了減小分配對(duì)象的內(nèi)存開銷烙肺,MeasureSpec是一個(gè)整型值(30位表示大小+2位表示模式)渠啤。它表示父類view傳遞給子類view的一種測(cè)量規(guī)范(子view的測(cè)量由父類的MeasureSpec和自身的layoutParam時(shí)共同決定)
- MeasureSpec.AT_MOST:在布局中指定了wrap_content
- MeasureSpec.EXACTLY:在布局中指定了確定的值 100dp或者match_content
- MeasureSpec.UNSPECIFIED:盡可能的大蝇狼,很少能用到,ListView,ScrollView
4.自定義屬性
<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="test">
<attr name="text" format="string" />
<attr name="testAttr" format="integer" />
</declare-styleable>
</resources>
public MyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.test);
String text = ta.getString(R.styleable.test_testAttr);
int textAttr = ta.getInteger(R.styleable.test_text, -1);
ta.recycle();
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:woochen="http://schemas.android.com/apk/res/com.example.test"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<com.example.test.MyTextView
android:layout_width="100dp"
android:layout_height="200dp"
woochen:testAttr="520"
woochen:text="helloworld" />
</RelativeLayout>
//自定義命名空間xmlns->xml name space com.example.test->包名
xmlns:woochen="http://schemas.android.com/apk/res/com.example.test"
//常用
xmlns:app="http://schemas.android.com/apk/res-auto"
4.其他
- 系統(tǒng)有的自定義屬性,我們不能重新定義
- 繼承ViewGroup的控件默認(rèn)不會(huì)執(zhí)行onDraw()方法?
解決方案(改變flag的值):1.給控件設(shè)置一個(gè)background 2. setWillNotDraw(false); 3.重寫 dispatchDraw(canvas);
- 在activity初始化之前需要使用view的寬高?
- onFoucusChange
- view.post
- view.getViewTreeObserver
- view.measure
- getWidth()和getMeasuredWidth()的區(qū)別?
賦值時(shí)間不同,一個(gè)在measure階段辐烂,一個(gè)在layout階段