Android实现自定义View控件的流程详解

来自:网络
时间:2023-07-25
阅读:
目录

官方自定义控件流程

根据Android Developers官网的介绍,自定义控件需要以下步骤。(根据业务需要,某些步骤可省略)

1、创建View

2、处理View的布局

3、绘制View

4、与用户进行交互

5、优化已定义的View

上面五项就是Android官方给出的自定义控件步骤。

每个步骤里面又包括了很多细小的知识点。可以记住这五个点,并且了解每个点里包含的小知识点。再加上一些自定义控件的练习。将这些知识熟练于心,相信开发者都能够定义出优秀的自定义控件。接下来对上面列出的5个要点进行细化阐述。

创建View

1.继承View

自定义的View是继承于View,当然如要自定义的View拥有某些Android已经提供的控件功能,可直接继承于已经提供的控件。

2.重写构造方法

  • Xxx(Context context)
  • Xxx(Context context, AttributeSet attrs)
  • Xxx(Context context, AttributeSet attrs, int defStyleAttr)

3.定义自定义属性

自定义属性通常写在res/values/attrs.xml文件中。声明自定义属性,都属于styleable,一般styleable的name和自定义控件的类名一样。

4.获取自定义属性

  • 当在xml中创建一个view时,所有在xml中声明的属性都会被传入到view的构造方法中的AttributeSet类型的参数当中。
  • 通过调用Context的obtainStyledAttributes()方法返回一个TypedArray对象。然后直接用TypedArray对象获取自定义属性的值。
  • TypedArray对象是共享的资源,因此在获取完值之后必须要调用recycle()方法来回收。

测量View(Measure)

1.测量

一个View在展示时是有宽和高,测量View就是为了能够让自定义的控件能够根据各种不同的情况以合适的宽高去展示。测量就必须要提到onMeasure方法。onMeasure方法是一个view确定宽高的地方。

2.重写onMeasure的固定伪代码写法:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int measureWidth = measure(widthMeasureSpec, true);
    int measureHeight = measure(heightMeasureSpec, false);
    setMeasuredDimension(measureWidth, measureHeight);
}

计算出height和width之后在onMeasure中要调用setMeasuredDimension()方法。否则会出现运行时异常。

3.计算一些自定义控件需要的值 onSizeChange()

onSizeChange() 方法在view第一次被指定了大小值、或者view的大小发生改变时会被调用。

绘制View(Draw)

1.自定义控件被创建并且测量代码写好后,接下来就调用onDraw()来绘制View

  • onDraw方法包含一个Canvas叫做画布的参数,onDraw()简单来说就两点:Canvas决定要去画什么;Paint决定怎么画
  • Canvas提供了画线方法,Paint就来决定线的颜色。Canvas提供了画矩形,Paint又可以决定让矩形是空心还是实心。

2.在onDraw方法中开始绘制之前

画笔Paint对象信息要初始化完毕。因为View的重新绘制是比较频繁的,可能多次调用onDraw,所以初始化的代码不应该放在onDraw方法里。

3.Paint画笔

在绘图过程中起到了极其重要的作用,画笔主要保存颜色,样式等绘制信息,指定如何绘制文本和图形,画笔对象有很多设置方法,大体上可以分为两类,一类与图形绘制相关,一类与文本绘制相关。

4.Canvas画布

当调整好画笔之后,需要绘制到画布上,这就得用Canvas类。Canvas画布可以绘制任何东西。还需要设置一些关于画布的属性,比如,画布的颜色、尺寸等。

5.常见绘制操作有哪些

  • drawRect,drawRoundRect,绘制矩形
  • drawOval,drawCircle,drawArc:绘制椭圆,圆,以及圆弧
  • drawText:绘制文本
  • drawBitmap:绘制图片

6.Rect和RectF介绍和区别

Rect的参数为int类型,而RectF的参数类型为float类型,从这一点上来看,RectF的精度更高一些,但是他们都是通过四个坐标参数来确定一个矩形的区域。

与用户进行交互

  • 某些情况自定义控件不仅只是展示漂亮的样式,还需要支持用户点击,拖动操作。自定义控件就需要做用户交互这一步。
  • 在Android系统中最常见的事件就是触摸事件,会调用View的onTouchEvent(android.view.MotionEvent).重写这个方法去处理事件逻辑。
  • 触控有了更多的手势,比如轻点,快速滑动等,所以在支持特殊用户交互的时需要用到android提供的GestureDetector. 只需要实现GestureDetector中相对应的接口,并且处理相应的回调方法。
  • 除手势之外,如果有移动之类的情况还需要让滑动的动画显示得比较平滑。动画应该是平滑的开始和结束,而不是突然消失突然开始。建议使用属性动画

优化自定义View

在上述步骤结束之后,其实一个较为完善的自定义控件已经出来。接下来需要确保自定义控件运行得流畅,官方说法是:为了避免控件体验迟缓,确保动画尽可能保持每秒60帧效果。

官网给出的优化建议:

  • 1、避免不必要的代码
  • 2、在onDraw()方法中不应该有会导致垃圾回收的代码
  • 3、尽可能少让onDraw()方法调用,大多数onDraw()方法调用都伴随调用invalidate(),所以不是必须,不要调用invalidate()方法。
返回顶部
顶部