成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Android游戲開發之六:自定義View詳解

移動開發 Android 游戲開發
在Android游戲開發中,有時Android控件不能滿足我們的要求,就有必要使用Android自定義View。自定義View實現起來也不難,就是先繼承View類,然后重寫構造函數、onDraw、onMeasure等函數。

View需處理的三個問題

對于常規的游戲,我們在View中需要處理以下幾種問題: 1.控制事件;2.刷新View;3. 繪制View。

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

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

3. 繪制View主要是onDraw()中通過形參canvas來處理,相關的繪制主要有drawRect、drawLine、drawPath等等。 view方法內部還重寫了很多接口,其回調方法可以幫助我們判斷出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獲取當view變化時每個形參的變動。

自定義View框架

下面cwjView是我們為今后游戲設計的一個簡單自定義View框架,我們可以看到在Android平臺自定義View還是很簡單的,同時Java支持多繼承可以幫助我們不斷的完善復雜的問題。

  1. public class cwjView extends View {    
  2.     public cwjView(Context context) {    
  3.       super(context);     
  4.       setFocusable(true); //允許獲得焦點    
  5.       setFocusableInTouchMode(true); //獲取焦點時允許觸控    
  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); //如果不讓父類處理記住調用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) { //處理按鍵事件,響應的軌跡球事件為 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其實是直接用的父類的方法。而如果我們要修改自定義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);   //這里面是原始的大小,需要重新計算可以修改本行    
  7.   //dosomething    
  8. }  
責任編輯:閆佳明 來源: jizhuomi
相關推薦

2011-08-02 11:17:13

iOS開發 View

2013-05-20 17:48:20

2016-12-26 15:25:59

Android自定義View

2016-11-16 21:55:55

源碼分析自定義view androi

2016-04-12 10:07:55

AndroidViewList

2012-05-18 10:52:20

TitaniumAndroid模塊自定義View模塊

2021-10-26 10:07:02

鴻蒙HarmonyOS應用

2017-03-14 15:09:18

AndroidView圓形進度條

2011-08-18 09:44:33

iPhone SDK儀表控件UIDialView

2017-03-02 13:33:19

Android自定義View

2023-08-10 17:14:52

鴻蒙自定義彈窗

2013-05-20 17:07:26

2013-01-06 10:43:54

Android開發View特效

2015-02-11 17:49:35

Android源碼自定義控件

2013-05-02 14:08:18

2021-11-01 17:31:21

Camera2 相機開發

2011-04-19 10:33:16

ASP.NET自定義控

2011-08-18 17:32:55

iPhone開發Table Cell

2009-06-08 20:13:36

Eclipse自定義控

2024-10-14 17:18:27

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美1区| 成人在线视频网站 | 99热播精品| 欧美激情在线一区二区三区 | 波多野结衣一区二区三区 | 91原创视频 | 中文字幕久久精品 | 国产欧美一区二区三区久久人妖 | 国产一区二区三区久久久久久久久 | 少妇无套高潮一二三区 | 亚洲综合视频一区 | 亚洲欧洲成人av每日更新 | 亚洲免费精品 | 久久综合久久久 | 国产乱码精品一区二区三区五月婷 | 日韩免费网站 | 美国一级黄色片 | 成人美女免费网站视频 | 丁香一区二区 | 亚洲成人免费观看 | 黑人巨大精品欧美一区二区免费 | 国产成人精品综合 | 丝袜 亚洲 另类 欧美 综合 | 99reav| 国产乱一区二区三区视频 | 久久综合久 | 秋霞电影一区二区 | 亚洲激情视频在线 | 欧美美女爱爱 | 日韩精品一二三区 | 综合网在线 | 国产精选一区 | www.奇米| 97国产一区二区 | 另类视频区 | 亚洲天堂影院 | 一区二区三区欧美大片 | 麻豆久久 | 欧美日韩综合精品 | 亚洲成人免费在线 | 中文字字幕一区二区三区四区五区 |