自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Android游戲開發(fā)之六:自定義View詳解

移動(dòng)開發(fā) Android 游戲開發(fā)
在Android游戲開發(fā)中,有時(shí)Android控件不能滿足我們的要求,就有必要使用Android自定義View。自定義View實(shí)現(xiàn)起來(lái)也不難,就是先繼承View類,然后重寫構(gòu)造函數(shù)、onDraw、onMeasure等函數(shù)。

View需處理的三個(gè)問題

對(duì)于常規(guī)的游戲,我們?cè)赩iew中需要處理以下幾種問題: 1.控制事件;2.刷新View;3. 繪制View。

1. 對(duì)于控制事件今天我們只處理按鍵事件onKeyDown,以后的文章中將會(huì)講到屏幕觸控的具體處理onTouchEvent以及Sensor重力感應(yīng)等方法。

2. 刷新view的方法這里主要有invalidate(int l, int t, int r, int b) 刷新局部,四個(gè)參數(shù)分別為左、上、右、下。整個(gè)view刷新invalidate(),刷新一個(gè)矩形區(qū)域invalidate(Rect dirty) ,刷新一個(gè)特性Drawable, invalidateDrawable(Drawable drawable) ,執(zhí)行invalidate類的方法將會(huì)設(shè)置view為無(wú)效,最終導(dǎo)致onDraw方法被重新調(diào)用。由于今天的view比較簡(jiǎn)單,提示大家如果在線程中刷 新,除了使用handler方式外,可以在Thread中直接使用postInvalidate方法來(lái)實(shí)現(xiàn)。

3. 繪制View主要是onDraw()中通過(guò)形參canvas來(lái)處理,相關(guān)的繪制主要有drawRect、drawLine、drawPath等等。 view方法內(nèi)部還重寫了很多接口,其回調(diào)方法可以幫助我們判斷出view的位置和大小,比如onMeasure(int, int) Called to determine the size requirements for this view and all of its children.  、onLayout(boolean, int, int, int, int) Called when this view should assign a size and position to all of its children 和onSizeChanged(int, int, int, int) Called when the size of this view has changed. 具體的作用,大家可以用Logcat獲取當(dāng)view變化時(shí)每個(gè)形參的變動(dòng)。

自定義View框架

下面cwjView是我們?yōu)榻窈笥螒蛟O(shè)計(jì)的一個(gè)簡(jiǎn)單自定義View框架,我們可以看到在Android平臺(tái)自定義View還是很簡(jiǎn)單的,同時(shí)Java支持多繼承可以幫助我們不斷的完善復(fù)雜的問題。

  1. public class cwjView extends View {    
  2.     public cwjView(Context context) {    
  3.       super(context);     
  4.       setFocusable(true); //允許獲得焦點(diǎn)    
  5.       setFocusableInTouchMode(true); //獲取焦點(diǎn)時(shí)允許觸控    
  6.    }    
  7.    @Override   
  8.    protected Parcelable onSaveInstanceState() {  //處理窗口保存事件    
  9.       Parcelable pSaved = super.onSaveInstanceState();    
  10.       Bundle bundle = new Bundle();    
  11.      //dosomething    
  12.       return bundle;    
  13.    }    
  14.    @Override   
  15.    protected void onRestoreInstanceState(Parcelable state) {  //處理窗口還原事件    
  16.       Bundle bundle = (Bundle) state;    
  17.      //dosomething   super.onRestoreInstanceState(bundle.getParcelable("cwj"));    
  18.       return;    
  19.    }    
  20.        @Override   
  21.    protected void onSizeChanged(int w, int h, int oldw, int oldh) //處理窗口大小變化事件    
  22.    {    
  23.       super.onSizeChanged(w, h, oldw, oldh);    
  24.    }    
  25.    @Override   
  26.    protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)      
  27.    {    
  28.       super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不讓父類處理記住調(diào)用setMeasuredDimension    
  29.    }    
  30.    @Override   
  31.    protected void onLayout (boolean changed, int left, int top, int right, int bottom)     
  32.    {    
  33.     super.onLayout (changed,left,top, ight,bottom) ;    
  34.    }    
  35.    @Override   
  36.    protected void onDraw(Canvas canvas) {    
  37.       Paint bg = new Paint();    
  38.       bg.setColor(Color.Red);    
  39.       canvas.drawRect(00, getWidth()/2, getHeight()/2, bg); //將view的左上角四分之一填充為紅色      
  40.    }    
  41.    @Override   
  42.    public boolean onTouchEvent(MotionEvent event) {    
  43.          return super.onTouchEvent(event); //讓父類處理屏幕觸控事件    
  44.    }    
  45.    @Override   
  46.    public boolean onKeyDown(int keyCode, KeyEvent event) { //處理按鍵事件,響應(yīng)的軌跡球事件為 public boolean onTrackballEvent (MotionEvent event)     
  47.       switch (keyCode) {    
  48.       case KeyEvent.KEYCODE_DPAD_UP:    
  49.          break;    
  50.       case KeyEvent.KEYCODE_DPAD_DOWN:    
  51.          break;    
  52.       case KeyEvent.KEYCODE_DPAD_LEFT:    
  53.          break;    
  54.       case KeyEvent.KEYCODE_DPAD_RIGHT:    
  55.          break;    
  56.       case KeyEvent.KEYCODE_DPAD_CENTER: //處理中鍵按下    
  57.          break;    
  58.       default:    
  59.          return super.onKeyDown(keyCode, event);    
  60.       }    
  61.       return true;    
  62.    }    
  63.  }   

以上的代碼中,onMeasure其實(shí)是直接用的父類的方法。而如果我們要修改自定義View的尺寸大小,可以參考下面的代碼。

  1. @Override   
  2. protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)      
  3. {    
  4.    height = View.MeasureSpec.getSize(heightMeasureSpec);      
  5.    width = View.MeasureSpec.getSize(widthMeasureSpec);      
  6.    setMeasuredDimension(width,height);   //這里面是原始的大小,需要重新計(jì)算可以修改本行    
  7.   //dosomething    
  8. }  
責(zé)任編輯:閆佳明 來(lái)源: jizhuomi
相關(guān)推薦

2011-08-02 11:17:13

iOS開發(fā) View

2013-05-20 17:48:20

2016-11-16 21:55:55

源碼分析自定義view androi

2016-12-26 15:25:59

Android自定義View

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2016-04-12 10:07:55

AndroidViewList

2021-10-26 10:07:02

鴻蒙HarmonyOS應(yīng)用

2017-03-14 15:09:18

AndroidView圓形進(jìn)度條

2011-08-18 09:44:33

iPhone SDK儀表控件UIDialView

2017-03-02 13:33:19

Android自定義View

2013-01-06 10:43:54

Android開發(fā)View特效

2023-08-10 17:14:52

鴻蒙自定義彈窗

2013-05-20 17:07:26

2015-02-11 17:49:35

Android源碼自定義控件

2013-05-02 14:08:18

2011-08-18 17:32:55

iPhone開發(fā)Table Cell

2011-04-19 10:33:16

ASP.NET自定義控

2024-10-14 17:18:27

2021-11-01 17:31:21

Camera2 相機(jī)開發(fā)

2011-05-05 13:30:17

GridViewListView布局
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)