Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          Android游戲開發(fā)之旅(六)自定義View

          Posted on 2010-12-03 10:20 啥都寫點 閱讀(734) 評論(0)  編輯  收藏 所屬分類: Android

          有關Android的自定義 View 的框架今天我們一起討論下,對于常規(guī)的游戲 ,我們在View中需要處理以下幾種問題: 1.控制事件 2.刷新View 3. 繪制View。(文/Android開發(fā) 網(wǎng))

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

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

            3. 繪制View主要是onDraw()中通過形參canvas來處理,相關的繪制主要有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獲取 當view變化時每個形參的變動。

            下面cwjView是我們?yōu)榻窈笥螒蛟O計的一個簡單自定義View框架,我們可以看到在Android平臺 自定義view還是很簡單的,同時Java 支持多繼承可以幫助我們不斷的完善復雜的問題。

          view plaincopy to clipboardprint?
          public class cwjView extends View {  
              public cwjView(Context context) {  
                
                super(context);  
                
                setFocusable(true); //允許獲得焦點  
                setFocusableInTouchMode(true); //獲取焦點時允許觸控  
                  
            }  
            @Override 
            protected Parcelable onSaveInstanceState() {  //處理窗口保存事件  
                Parcelable pSaved = super.onSaveInstanceState();  
                
                Bundle bundle = new Bundle();  
              //dosomething  
                return bundle;  
            }  
            @Override 
            protected void onRestoreInstanceState(Parcelable state) {  //處理窗口還原事件  
                
                Bundle bundle = (Bundle) state;  
              //dosomething  
              super.onRestoreInstanceState(bundle.getParcelable("cwj"));  
                return;  
            }  
                @Override 
            protected void onSizeChanged(int w, int h, int oldw, int oldh) //處理窗口大小變化事件  
            {  
                super.onSizeChanged(w, h, oldw, oldh);  
            }  
            @Override 
            protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)    
            {  
                super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不讓父類處理記住調(diào)用setMeasuredDimension  
            }  
            @Override 
            protected void onLayout (boolean changed, int left, int top, int right, int bottom)  
            {  
              super.onLayout (changed,left,top, ight,bottom) ;  
            }  
            @Override 
            protected void onDraw(Canvas canvas) {  
                
                Paint bg = new Paint();  
                bg.setColor(Color.Red);  
                canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //將view的左上角四分之一填充為紅色    
                
            }  
            @Override 
            public boolean onTouchEvent(MotionEvent event) {  
                  return super.onTouchEvent(event); //讓父類處理屏幕觸控事件  
            }  
            @Override 
            public boolean onKeyDown(int keyCode, KeyEvent event) { //處理按鍵事件,響應的軌跡球事件為 public boolean onTrackballEvent (MotionEvent event)   
                  
                switch (keyCode) {  
                case KeyEvent.KEYCODE_DPAD_UP:  
                  
                  break;  
                case KeyEvent.KEYCODE_DPAD_DOWN:  
                    
                  break;  
                case KeyEvent.KEYCODE_DPAD_LEFT:  
                    
                  break;  
                case KeyEvent.KEYCODE_DPAD_RIGHT:  
                  
                  break;  
                  
                case KeyEvent.KEYCODE_DPAD_CENTER: //處理中鍵按下  
                  
                  break;  
                default:  
                  return super.onKeyDown(keyCode, event);  
                }  
                return true;  
            }  

          public class cwjView extends View {
              public cwjView(Context context) {
             
                super(context);
             
                setFocusable(true); //允許獲得焦點
                setFocusableInTouchMode(true); //獲取焦點時允許觸控
               
            }
            @Override
            protected Parcelable onSaveInstanceState() {  //處理窗口保存事件
                Parcelable pSaved = super.onSaveInstanceState();
             
                Bundle bundle = new Bundle();
              //dosomething
                return bundle;
            }
            @Override
            protected void onRestoreInstanceState(Parcelable state) {  //處理窗口還原事件
             
                Bundle bundle = (Bundle) state;
              //dosomething
              super.onRestoreInstanceState(bundle.getParcelable("cwj"));
                return;
            }
                @Override
            protected void onSizeChanged(int w, int h, int oldw, int oldh) //處理窗口大小變化事件
            {
                super.onSizeChanged(w, h, oldw, oldh);
            }
            @Override
            protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec) 
            {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不讓父類處理記住調(diào)用setMeasuredDimension
            }
            @Override
            protected void onLayout (boolean changed, int left, int top, int right, int bottom)
            {
              super.onLayout (changed,left,top, ight,bottom) ;
            }
            @Override
            protected void onDraw(Canvas canvas) {
             
                Paint bg = new Paint();
                bg.setColor(Color.Red);
                canvas.drawRect(0, 0, getWidth()/2, getHeight()/2, bg); //將view的左上角四分之一填充為紅色 
             
            }
            @Override
            public boolean onTouchEvent(MotionEvent event) {
                  return super.onTouchEvent(event); //讓父類處理屏幕觸控事件
            }
            @Override
            public boolean onKeyDown(int keyCode, KeyEvent event) { //處理按鍵事件,響應的軌跡球事件為 public boolean onTrackballEvent (MotionEvent event)
               
                switch (keyCode) {
                case KeyEvent.KEYCODE_DPAD_UP:
               
                  break;
                case KeyEvent.KEYCODE_DPAD_DOWN:
                 
                  break;
                case KeyEvent.KEYCODE_DPAD_LEFT:
                 
                  break;
                case KeyEvent.KEYCODE_DPAD_RIGHT:
               
                  break;
               
                case KeyEvent.KEYCODE_DPAD_CENTER: //處理中鍵按下
               
                  break;
                default:
                  return super.onKeyDown(keyCode, event);
                }
                return true;
            }
          }

          上面我們可以看到onMeasure使用的是父類的處理方法,如果我們需要解決 自定義View的大小,可以嘗試下面的方法

          view plaincopy to clipboardprint?
          @Override 
          protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)    
          {  
              height = View.MeasureSpec.getSize(heightMeasureSpec);   
              width = View.MeasureSpec.getSize(widthMeasureSpec);   
              setMeasuredDimension(width,height);  //這里面是原始的大小,需要重新計算可以修改本行  
            //dosomething  

           

          本文來自CSDN博客,轉(zhuǎn)載請標明出處:http://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034560.aspx



                                                                                                                 --    學海無涯
                  

          主站蜘蛛池模板: 勐海县| 合水县| 札达县| 濮阳市| 金寨县| 北辰区| 石棉县| 封丘县| 永宁县| 中阳县| 石林| 苍溪县| 大名县| 鲁山县| 双桥区| 遂昌县| 英吉沙县| 昭苏县| 黑山县| 韶关市| 海丰县| 宁陵县| 成都市| 侯马市| 专栏| 聂拉木县| 通渭县| 防城港市| 绵阳市| 临朐县| 赞皇县| 山东省| 民县| 洮南市| 姚安县| 集安市| 德格县| 沿河| 莒南县| 格尔木市| 凌源市|