`
ET焖猪仔
  • 浏览: 236991 次
  • 性别: Icon_minigender_1
  • 来自: 广东
社区版块
存档分类
最新评论

自定义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;
  }

}

上面我们可以看到onMeasure使用的是父类的处理方法,如果我们需要解决自定义View的大小,可以尝试下面的方法
  @Override
  protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)  
  {
      height = View.MeasureSpec.getSize(heightMeasureSpec); 
      width = View.MeasureSpec.getSize(widthMeasureSpec); 
      setMeasuredDimension(width,height);  //这里面是原始的大小,需要重新计算可以修改本行

    //dosomething

  }


以上是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;
  }


分享到:
评论

相关推荐

    android开发中常用的工具类和自定义view

    android开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中常用的工具类和自定义viewandroid开发中...

    android 自定义view 含高级

    ### Android自定义View从入门到高级 在Android开发过程中,自定义View是非常重要的一项技能,它可以帮助开发者实现更加丰富的UI效果以及更为灵活的功能定制。本文将深入探讨Android自定义View的相关知识,包括基本...

    Android 自定义View绘制居中文本

    在Android开发中,自定义View是一项常见的需求,它允许开发者根据特定的设计要求或者功能扩展来创建独特的用户界面组件。本文将深入探讨如何实现一个自定义的View,使其能够精确地绘制水平和垂直居中的文本,效果...

    Android实现在xml文件中引用自定义View的方法分析

    这种方法是最常用的方法,通过指定自定义View的类名和布局参数来实现自定义View的引用。在上面的代码中,我们指定了自定义View的类名为com.test.copytext.CopyText,并设置了其宽度和高度。 方法二:<view class=...

    安卓自定义View组件

    下面将详细介绍自定义View的基本步骤、核心概念以及常用技巧。 1. **创建自定义View** 创建自定义View通常需要继承自`View`类或其子类,如`Button`、`TextView`等。在Java代码中,我们可以通过重写构造函数、`...

    View自定义加载图片

    3. **测量(Measure)**:重写`onMeasure()`方法,确定自定义View的尺寸。 4. **布局(Layout)**:重写`onLayout()`方法,安排子View的位置(如果继承自`ViewGroup`)。 5. **绘制(Draw)**:重写`onDraw()`方法,这是...

    最简单的仿QQ音乐歌词颜色渐变-android自定义view

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面元素。本教程将聚焦于如何创建一个简单的仿QQ音乐歌词颜色渐变的自定义View。这个功能在许多音乐播放应用中常见,它能为用户...

    自定义View(四)

    1. **绘制流程**:自定义View的核心在于重写`onDraw()`方法。在这个方法中,我们可以使用Canvas对象进行图形绘制,如线条、矩形、圆形等。Canvas提供了多种绘图API,如`drawRect()`, `drawCircle()`, `drawText()`等...

    锯齿边框,类似优惠劵效果的自定义 View.zip

    在Android开发中,自定义View是一项重要的技能,它允许开发者创造出独特且富有创意的界面元素。这个开源项目“锯齿边框,类似优惠劵效果的自定义 View”提供了实现优惠券样式视图的方法,其核心是通过组合半圆锯齿...

    SeekBar 自定义View 进度条

    SeekBar 是 Android 系统中一个非常常用的控件,它用于显示进度信息,通常用于音频、视频播放控制或者设置应用的参数。自定义 SeekBar 可以帮助开发者根据设计需求打造出独特且符合用户体验的界面元素。本文将深入...

    自定义View实现折线图动态添加功能

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建具有独特功能和视觉效果的组件。本项目标题“自定义View实现折线图动态添加功能”旨在教你如何构建一个能够实时动态更新数据的折线图表...

    自定义View环形Progress

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据特定需求创建独特且具有交互性的用户界面元素。本主题将深入探讨如何实现一个自定义的环形Progress View,即"自定义View环形Progress"。 环形...

    自定义View 实现全屏滑动的DrawerLayout

    本篇文章将详细探讨如何通过自定义View来实现一个全屏滑动的DrawerLayout。 首先,了解DrawerLayout的基本结构和工作原理是至关重要的。DrawerLayout允许一个或两个“抽屉”从屏幕边缘滑出。这些抽屉通常包含导航...

    自定义组合View

    1. **代码复用**:自定义View可以封装常用的功能,减少重复代码。 2. **性能优化**:由于控制权在开发者手中,可以根据需求进行性能优化,避免不必要的绘制和计算。 3. **增强用户体验**:自定义View可以提供独特的...

    android自定义View之customView

    - `onMeasure()`:根据MeasureSpec计算并设定自定义View的尺寸,使用`setMeasuredDimension()`方法。 4. **事件处理** - `MotionEvent`:处理触摸事件,如ACTION_DOWN, ACTION_UP, ACTION_MOVE等。 - `...

    Android自定义动画View

    在自定义View中不常用,但在某些场景下,如游戏或加载指示器,可能会用到。 为了响应触摸事件,我们需要重写`onTouchEvent()`方法,处理ACTION_DOWN、ACTION_UP、ACTION_MOVE等事件,实现拖动、点击等交互。 最后...

    自定义View----点击滑动选择字母列表

    5. **布局管理**:如果你的自定义View包含多个子View(如每个字母项),可能需要重写`onLayout()`方法来合理安排子View的位置。 6. **数据绑定**:为了将数据(如字母列表)与视图关联,可以考虑使用数据绑定库,如...

    自定义View

    在创建自定义View时,通常会重写以下几个关键方法: 1. **构造函数**:Android提供了几个构造函数供选择,其中`public CustomView(Context context)`和`public CustomView(Context context, AttributeSet attrs)`是...

    android自定义View画板

    在Android开发中,自定义View是一项重要的技能,它允许开发者根据需求创建独特的用户界面和交互体验。本主题将深入探讨如何在Android中实现一个自定义的画板(View)。我们将讨论核心概念、步骤以及关键代码片段,以...

    Android自定义View倒计时圆

    接下来,我们引入了一个`DisplayUtil`类,它是一些常用的转换方法,用于将像素单位(px)转换为设备独立像素(dp)或文字缩放像素(sp)。这些方法在处理尺寸时非常有用,确保在不同分辨率和密度的设备上保持一致的视觉...

Global site tag (gtag.js) - Google Analytics