自定义View 常用方法

自定义View的常用方法:

onFinishInflate() 当View中所有的子控件均被映射成xml后触发

onMeasure(int, int) 确定所有子元素的大小

onLayout(boolean, int, int, int, int) 当View分配所有的子元素的大小和位置时触发

onSizeChanged(int, int, int, int) 当view的大小发生变化时触发

onDraw(Canvas) view渲染内容的细节

onKeyDown(int, KeyEvent) 有按键按下后触发

onKeyUp(int, KeyEvent) 有按键按下后弹起时触发

onTrackballEvent(MotionEvent) 轨迹球事件

onTouchEvent(MotionEvent) 触屏事件

onFocusChanged(boolean, int, Rect) 当View获取或失去焦点时触发

onWindowFocusChanged(boolean) 当窗口包含的view获取或失去焦点时触发

onAttachedToWindow() 当view被附着到一个窗口时触发

onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和  onAttachedToWindow() 是相反的。

onWindowVisibilityChanged(int) 当窗口中包含的可见的view发生变化时触发

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; } }

 

 

以上是View实现的一些基本接口的回调方法,一般我们需要处理画布的显示时,重写onDraw(Canvas)用的的是最多的:

  @Override   
  protected void onDraw(Canvas canvas) {    
    //这里我们直接使用canvas对象处理当前的画布,比如说使用Paint来选择要填充的颜色    
   
  Paint paintBackground = new Paint();    
  paintBackground.setColor(getResources().getColor(R.color.xxx));  //从Res中找到名为xxx的color颜色定义    
  canvas.drawRect(0, 0, getWidth(), getHeight(), paintBackground); //设置当前画布的背景颜色为paintBackground中定义的颜色,以0,0作为为起点,以当前画布的宽度和高度为重点即整块画布来填充,具体的请查看Android123未来讲到的Canvas和Paint,在Canvas中我们可以实现画路径,图形,区域,线。而Paint作为绘画方式的对象可以设置颜色,大小,甚至字体的类型等等。    
} 

 

当然还有就是处理窗口还原状态问题(一般用于横竖屏切换),除了在Activity中可以调用外,开发游戏时我们尽量在View中使用类似

@Override   
  protected Parcelable onSaveInstanceState() {    
      Parcelable p = super.onSaveInstanceState();    
      Bundle bundle = new Bundle();    
      bundle.putInt("x", pX);    
      bundle.putInt("y", pY);    
      bundle.putParcelable("android123_state", p);    
      return bundle;    
  }    
  @Override   
  protected void onRestoreInstanceState(Parcelable state) {     
      Bundle bundle = (Bundle) state;    
      dosomething(bundle.getInt("x"), bundle.getInt("y")); //获取刚才存储的x和y信息    
      super.onRestoreInstanceState(bundle.getParcelable("android123_state"));    
      return;    
  } 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值