日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Android游戲開發(fā)之六:自定義View詳解

View需處理的三個問題

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

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:空間域名、網(wǎng)絡(luò)空間、營銷軟件、網(wǎng)站建設(shè)、雙臺子網(wǎng)站維護、網(wǎng)站推廣。

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

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

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

自定義View框架

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

 
 
  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); //如果不讓父類處理記住調(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(0, 0, 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其實是直接用的父類的方法。而如果我們要修改自定義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. }  

分享名稱:Android游戲開發(fā)之六:自定義View詳解
網(wǎng)站URL:http://www.dlmjj.cn/article/dhpgjde.html