Android游戏开发之旅(六)自定义View

http://blog.csdn.net/javatiger427/article/details/6034560


有关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 支持多继承可以帮助我们不断的完善复杂的问题。

  1. public class cwjView extends View {  
  2.     public cwjView(Context context) {  
  3.       
  4.       super(context);  
  5.       
  6.       setFocusable(true); //允许获得焦点  
  7.       setFocusableInTouchMode(true); //获取焦点时允许触控  
  8.         
  9.   }  
  10.   @Override  
  11.   protected Parcelable onSaveInstanceState() {  //处理窗口保存事件  
  12.       Parcelable pSaved = super.onSaveInstanceState();  
  13.       
  14.       Bundle bundle = new Bundle();  
  15.     //dosomething  
  16.       return bundle;  
  17.   }  
  18.   @Override  
  19.   protected void onRestoreInstanceState(Parcelable state) {  //处理窗口还原事件  
  20.       
  21.       Bundle bundle = (Bundle) state;  
  22.     //dosomething  
  23.     super.onRestoreInstanceState(bundle.getParcelable("cwj"));  
  24.       return;  
  25.   }  
  26.       @Override  
  27.   protected void onSizeChanged(int w, int h, int oldw, int oldh) //处理窗口大小变化事件  
  28.   {  
  29.       super.onSizeChanged(w, h, oldw, oldh);  
  30.   }  
  31.   @Override  
  32.   protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)    
  33.   {  
  34.       super.onMeasure(widthMeasureSpec, heightMeasureSpec); //如果不让父类处理记住调用setMeasuredDimension  
  35.   }  
  36.   @Override  
  37.   protected void onLayout (boolean changed, int left, int top, int right, int bottom)  
  38.   {  
  39.     super.onLayout (changed,left,top, ight,bottom) ;  
  40.   }  
  41.   @Override  
  42.   protected void onDraw(Canvas canvas) {  
  43.       
  44.       Paint bg = new Paint();  
  45.       bg.setColor(Color.Red);  
  46.       canvas.drawRect(00, getWidth()/2, getHeight()/2, bg); //将view的左上角四分之一填充为红色    
  47.       
  48.   }  
  49.   @Override  
  50.   public boolean onTouchEvent(MotionEvent event) {  
  51.         return super.onTouchEvent(event); //让父类处理屏幕触控事件  
  52.   }  
  53.   @Override  
  54.   public boolean onKeyDown(int keyCode, KeyEvent event) { //处理按键事件,响应的轨迹球事件为 public boolean onTrackballEvent (MotionEvent event)   
  55.         
  56.       switch (keyCode) {  
  57.       case KeyEvent.KEYCODE_DPAD_UP:  
  58.         
  59.         break;  
  60.       case KeyEvent.KEYCODE_DPAD_DOWN:  
  61.           
  62.         break;  
  63.       case KeyEvent.KEYCODE_DPAD_LEFT:  
  64.           
  65.         break;  
  66.       case KeyEvent.KEYCODE_DPAD_RIGHT:  
  67.         
  68.         break;  
  69.         
  70.       case KeyEvent.KEYCODE_DPAD_CENTER: //处理中键按下  
  71.         
  72.         break;  
  73.       default:  
  74.         return super.onKeyDown(keyCode, event);  
  75.       }  
  76.       return true;  
  77.   }  
  78. }  

上面我们可以看到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. }  


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值