Android游戲開發(fā)之三:View類用法詳解
View類常用方法
自定義View的常用方法:
onFinishInflate() 當(dāng)View中所有的子控件均被映射成xml后觸發(fā)
onMeasure(int, int) 確定所有子元素的大小
onLayout(boolean, int, int, int, int) 當(dāng)View分配所有的子元素的大小和位置時觸發(fā)
onSizeChanged(int, int, int, int) 當(dāng)view的大小發(fā)生變化時觸發(fā)
onDraw(Canvas) view渲染內(nèi)容的細(xì)節(jié)
onKeyDown(int, KeyEvent) 有按鍵按下后觸發(fā)
onKeyUp(int, KeyEvent) 有按鍵按下后彈起時觸發(fā)
onTrackballEvent(MotionEvent) 軌跡球事件
onTouchEvent(MotionEvent) 觸屏事件
onFocusChanged(boolean, int, Rect) 當(dāng)View獲取或失去焦點時觸發(fā)
onWindowFocusChanged(boolean) 當(dāng)窗口包含的view獲取或失去焦點時觸發(fā)
onAttachedToWindow() 當(dāng)view被附著到一個窗口時觸發(fā)
onDetachedFromWindow() 當(dāng)view離開附著的窗口時觸發(fā),Android123提示該方法和 onAttachedToWindow() 是相反的。
onWindowVisibilityChanged(int) 當(dāng)窗口中包含的可見的view發(fā)生變化時觸發(fā)
以上是View實現(xiàn)的一些基本接口的回調(diào)方法。
View類方法的重載
一般我們需要處理畫布的顯示時,重寫onDraw(Canvas)用的的是最多的:
- @Override
- protected void onDraw(Canvas canvas) {
- //這里我們直接使用canvas對象處理當(dāng)前的畫布,比如說使用Paint來選擇要填充的顏色
- Paint paintBackground = new Paint();
- paintBackground.setColor(getResources().getColor(R.color.xxx)); //從Res中找到名為xxx的color顏色定義
- canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //設(shè)置當(dāng)前畫布的背景顏色為paintBackground中定義的顏色,以0,0作為為起點,以當(dāng)前畫布的寬度和高度為重點即整塊畫布來填充。 具體的后面會講,在Canvas中我們可以實現(xiàn)畫路徑,圖形,區(qū)域,線。而Paint作為繪畫方式的對象可以設(shè)置顏色,大小,甚至字體的類型等等。
- }
當(dāng)然還有就是處理窗口還原狀態(tài)問題(一般用于橫豎屏切換),除了在Activity中可以調(diào)用外,開發(fā)游戲時我們盡量在View中使用如下代碼:
- @Override
- protected Parcelable onSaveInstanceState() {
- Parcelable p = super.onSaveInstanceState();
- Bundle bundle = new Bundle();
- bundle.putInt("x", pX);
- bundle.putInt("y", pY);
- bundle.putParcelable("android_state", p);
- return bundle;
- }
- @Override
- protected void onRestoreInstanceState(Parcelable state) {
- Bundle bundle = (Bundle) state;
- dosomething(bundle.getInt("x"), bundle.getInt("y")); //獲取剛才存儲的x和y信息
- r.onRestoreInstanceState(bundle.getParcelable("android_state"));
- return;
- }
在View中如果需要強制調(diào)用繪制方法onDraw,可以使用invalidate()方法,它有很多重載版本,同時在線程中的postInvailidate()方法在后面的教程中會講到。

















