【Android】View類詳解 (遊戲開發必備)

來源:互聯網
上載者:User

Android遊戲開發中比較重要和複雜的就是顯示和遊戲邏輯的處理。

這裡我們說下android.view.Viewandroid.view.SurfaceView

SurfaceView是從View基類中派生出來的顯示類,直接子類有GLSurfaceView和VideoView,可以看出GL和視頻播放以及Camera網路攝影機一般均使用SurfaceView,到底有哪些優勢呢? 

SurfaceView可以控製表面的格式,比如大小,顯示在螢幕中的位置,最關鍵是的提供了SurfaceHolder類,使用getHolder方法擷取,相關的有Canvas  lockCanvas()  

Canvas  lockCanvas(Rect dirty)  、void  removeCallback(SurfaceHolder.Callback callback)、void  unlockCanvasAndPost(Canvas canvas) 控製圖形以及繪製,

而在SurfaceHolder.Callback 介面回調中可以通過下面三個抽象類別可以自己定義具體的實現,比如第一個更改格式和顯示畫面。

abstract void  surfaceChanged(SurfaceHolder holder, int format, int width, int height) abstract void  surfaceCreated(SurfaceHolder holder) abstract void  surfaceDestroyed(SurfaceHolder holder) 

對於Surface相關的,Android底層還提供了GPU加速功能,所以一般即時性很強的應用中主要使用SurfaceView而不是直接從View構建,同時Android123未來後面說到的OpenGL中的GLSurfaceView也是從該類實現。 

下面著重介紹View類:

 自訂View的常用方法: onFinishInflate() 當View中所有的子控制項均被映射成xml後觸發onMeasure(int, int) 確定所有子項目的大小onLayout(boolean, int, int, int, int) 當View分配所有的子項目的大小和位置時觸發onSizeChanged(int, int, int, int) 當view的大小發生變化時觸發onDraw(Canvas) view渲染內容的細節onKeyDown(int, KeyEvent) 有按鍵按下後觸發onKeyUp(int, KeyEvent) 有按鍵按下後彈起時觸發onTrackballEvent(MotionEvent) 軌跡球事件onTouchEvent(MotionEvent) 觸屏事件onFocusChanged(boolean, int, Rect) 當View擷取或失去焦點時觸發 onWindowFocusChanged(boolean) 當視窗包含的view擷取或失去焦點時觸發onAttachedToWindow() 當view被附著到一個視窗時觸發onDetachedFromWindow() 當view離開附著的視窗時觸發,Android123提示該方法和  onAttachedToWindow() 是相反的。onWindowVisibilityChanged(int) 當視窗中包含的可見的view發生變化時觸發

 以上是View實現的一些基本介面的回調方法,一般我們需要處理畫布的顯示時,重寫onDraw(Canvas)用的的是最多的:

 @Override   protected void onDraw(Canvas canvas) {    //這裡我們直接使用canvas對象處理當前的畫布,比如說使用Paint來選擇要填充的顏色   Paint paintBackground = new Paint();   paintBackground.setColor(getResources().getColor(R.color.xxx));  //從Res中找到名為xxx的color顏色定義   canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //設定當前畫布的背景顏色為paintBackground中定義的顏色,以0,0作為為起點,以當前畫布的寬度和高度為重點即整塊畫布來填充,具體的請查看Android123未來講到的Canvas和Paint,在Canvas中我們可以實現畫路徑,圖形,地區,線。而Paint作為繪畫方式的對象可以設定顏色,大小,甚至字型的類型等等。 }

 當然還有就是處理視窗還原狀態問題(一般用於橫豎屏切換),除了在Activity中可以調用外,開發遊戲時我們盡量在View中使用類似。

 @Override   protected Parcelable onSaveInstanceState() {       Parcelable p = super.onSaveInstanceState();      Bundle bundle = new Bundle();      bundle.putInt("x", pX);      bundle.putInt("y", pY);      bundle.putParcelable("android123_state", p);      return bundle;   }   @Override   protected void onRestoreInstanceState(Parcelable state) {       Bundle bundle = (Bundle) state;      dosomething(bundle.getInt("x"), bundle.getInt("y")); //擷取剛才儲存的x和y資訊      super.onRestoreInstanceState(bundle.getParcelable("android123_state"));      return;   }

在View中如果需要強制調用繪製方法onDraw,可以使用invalidate()方法,它有很多重載版本,同時線上程中的postInvailidate()方法將在Android遊戲開發之旅六中的 自訂View完整篇講到。

轉載自:  http://www.android123.com.cn/androidkaifa/541.html

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.