<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



                                                                                                           --    學海無涯
            

    主站蜘蛛池模板: jizz免费在线观看| 亚洲图片中文字幕| 三年片在线观看免费观看高清电影 | 亚洲精品视频免费看| 一级**爱片免费视频| 亚洲码欧美码一区二区三区| 亚洲欧美熟妇综合久久久久| 亚洲成_人网站图片| 亚洲第一成年免费网站| jizzjizz亚洲日本少妇| 国产尤物在线视精品在亚洲| 亚洲 欧洲 日韩 综合在线| 亚洲色欲一区二区三区在线观看 | 亚洲国产精品免费在线观看| 亚洲Aⅴ无码专区在线观看q| 亚洲日韩国产成网在线观看| 国产黄色一级毛片亚洲黄片大全| 亚洲精品无码专区2| 亚洲AV无码一区二区三区系列| 久久精品国产亚洲AV无码麻豆| 自怕偷自怕亚洲精品| 国产成人精品久久亚洲高清不卡| 国产99视频精品免费视频76| 免费一区二区无码视频在线播放| 午夜在线免费视频| 男女做羞羞的事视频免费观看无遮挡| 狠狠久久永久免费观看| 亚洲免费一区二区| 亚洲综合视频在线| 亚洲精品日韩一区二区小说| 久香草视频在线观看免费| 色欲国产麻豆一精品一AV一免费 | 激情内射亚洲一区二区三区爱妻| 日韩在线观看免费| 一个人免费观看视频www| 精品国产_亚洲人成在线高清| 亚洲国产精品日韩av不卡在线 | 免费一看一级毛片| 亚洲色欲色欲www| 日韩av无码久久精品免费 | 亚洲av永久中文无码精品|