<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Cyh的博客

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

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

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

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

      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比較簡單,Android123提示大家如果在線程中刷新,除了使用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變化時每個形參的變動。

      下面cwjView是我們為今后游戲設計的一個簡單自定義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); //如果不讓父類處理記住調用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); //如果不讓父類處理記住調用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博客,轉載請標明出處:http://blog.csdn.net/JavaTiger427/archive/2010/11/25/6034560.aspx



                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: 亚洲国产成人乱码精品女人久久久不卡 | 亚洲色图黄色小说| 两个人看www免费视频| 亚洲成网777777国产精品| 国产精品亚洲综合网站| 免费A级毛片在线播放不收费| 国产成人 亚洲欧洲| 亚洲日韩中文字幕日韩在线| 九九九精品视频免费| 亚洲精品线路一在线观看| 中文字幕不卡免费视频| 人人狠狠综合久久亚洲88| 无码人妻一区二区三区免费看| 亚洲人成亚洲精品| 黄页网站免费观看| 亚洲成在人线在线播放无码| 免费人妻av无码专区| 成人精品视频99在线观看免费| 亚洲AV无码久久精品成人| 2021在线观看视频精品免费| 亚洲男人的天堂久久精品| 亚洲av高清在线观看一区二区| a级毛片在线免费| 亚洲伊人久久大香线蕉啊| 日本一道本高清免费| 中国内地毛片免费高清| 久久精品国产亚洲AV高清热 | 久久亚洲国产精品一区二区| 精品无码免费专区毛片| 亚洲成AV人片在WWW| 亚洲女同成av人片在线观看| 999在线视频精品免费播放观看| 亚洲精品美女久久7777777| 国产综合精品久久亚洲| 精品熟女少妇av免费久久| 亚洲a∨无码一区二区| 国产V亚洲V天堂A无码| 四虎影院在线免费播放| 三根一起会坏掉的好痛免费三级全黄的视频在线观看 | 亚洲国产精久久久久久久| 一个人免费观看视频www|