前言:自定义view重要的部分就是view的展示样式,为了实现view的样式可以重写onDraw()方法。

一:Override onDraw()

    1.当覆盖了onDraw()方法后,需要一个Canvas变量,就是一个画布,他能画直线等各种形状,还能画bitmap等等。

     当使用画布的时候,可以提供一个画笔:Paint。就是设置画出图形的一些特性,如颜色等。

二:创建图形对象

    1.在android.graphics中提供了两大类:

        1.Canvas:描述画什么。

        2.Paint:怎么画。

    2.比如,你想用Canvas一线,就可以定义一个Paint来设置这条线的颜色等属性,或是用Canvas画一个矩形的时候,

     Paint可以定义一个颜色来填充矩形,或是不填充。

    3.在画图形之前,可以定义多个Paint,并放在一个初始化函数中初始化:

        

Android中viewportWidth作用_初始化

    4.在画之前初始化这些画笔是很必要的,因为初始化画笔是个很费资源的过程,如果将初始化过程放在了onDraw中,

     用户界面就会显得有些呆滞,停顿的感觉。

二:处理layout事件

    1.为了能适当的展示你的控件的大小,往往或通过计算屏幕的大小,密度等属性,来设置控件最终显示的大小。切记

     千万不要自己以为控件就是那么大,要根据实际情况来设置控件的大小,还有为不同的排列方式,提供不同的布局。

overridden,如果没有特殊的需要,设置控件的大小

overridden中的onSizeChanged();

    3.onSizeChanged()方法当,第一次给view赋值的时候,或是任何情况view的大小被改变的时候,都会调用此方法。

     计算位置,计算尺寸,都需要在此方法中完成。

    4.当设置view的大小的时候,layout manager会默认包含了view的padding值,所以必须控制padding的值,当给

     view设置大小的时候:

        

Android中viewportWidth作用_控件_02

    5.如果你想更好的控制控件的大小,需要实现onMeasure方法,这个方法的两个参数表示父控件希望view的显示大小,

     这两个值的大小是硬性标准还是建议值。下面的实例:设置控件的大小以其足够大来容纳内容:

        

Android中viewportWidth作用_初始化_03

1.设置控件的大小需要考虑padding,正如上文提到过的,这是view的责任。

         2.其中的resolveSizeAndState(int,int)方法用于计算view最终显示的大小高度。

            其中的View.MeasureSpec有三个常量:

UNSPECIFIED:父控件没有对子view任何限制。

EXACTLY:父控件给了一个适当的大小给子view,当子view设置大小的时候,收到他的束缚。

AT_MOST:尽可能的扩展到指定的大小。

         3.这个方法没有返回值,需要在最后强制性的调用setMeasureDimension(w,h)方法,否则在运行时会出现异常。

三:开始画了

    1.一旦你完成了初始化工作,定义画笔,确定view的大小,你就可以通过实现onDraw()方法来画控件了。虽然每个控件不同,

     但是有一些通用的东西:

 drawText(),通过 setTypeface()设置字体,通过setColor()设置文字的颜色。

       2.绘制基本形状:绘制矩形:drawRect(),绘制椭圆:drawOval(),绘制弧线:drawArc()改变是否填充,是否描边等调用 setStyle()。

       3.绘制更复杂的图形就需要使用Path类了,可以将多个线条和多个曲线添加到一个Path对象中,然后使用drawPath(),

        绘制path对象。通过调用setStyle()来设置填充,描边等属性。

 LinearGradient来创建填充渐变对象,然后通过 setShader()将渐变对象设置到形状上。

       5.用drawBitmap();对象来绘制图片。

       

Android中viewportWidth作用_初始化_04