文本中从s下标开始到e下标结束的所有字符所占的宽度;4)　reset():重置画笔为默认值。　这里需要就几个方法解释一下:　1、setPathEffect(PathEffect　pe):设置绘制的路径的效果:　常见的有以下几种可选方案:　1)　CornerPathEffect:可以用圆角来代替尖锐的角;2)　DathPathEffect:虚线,由短线和点组成;3)　DiscretePathEffect:荆棘状的线条;4)　PathDashPathEffect:定义一种新的形状并将其作为原始路径的轮廓标记;5)　SumPathEffect:在一条路径中顺序添加参数中的效果;6)　ComposePathEffect:将两种效果组合起来,先使用第一种效果,在此基础上应用第二种效果。　2、setXfermode(Xfermode　m):设置图形重叠时的处理方式:　关于Xfermode的多种效果,我们可以参考下面一张图:　在使用的时候,我们需要通过paint.　setXfermode(new　PorterDuffXfermode(PorterDuff.Mode.XXX))来设置,XXX是上图中的某种模式对应的常量参数,如DST_OUT。　这16中情况的具体解释如下:　1.PorterDuff.Mode.CLEAR:所绘制不会提交到画布上。2.PorterDuff.Mode.SRC:显示上层绘制图片3.PorterDuff.Mode.DST:显示下层绘制图片4.PorterDuff.Mode.SRC_OVER:正常绘制显示,上下层绘制叠盖。5.PorterDuff.Mode.DST_OVER:上下层都显示。下层居上显示。6.PorterDuff.Mode.SRC_IN:取两层绘制交集。显示上层。7.PorterDuff.Mode.DST_IN:取两层绘制交集。显示下层。8.PorterDuff.Mode.SRC_OUT:上层绘制非交集部分。9.PorterDuff.Mode.DST_OUT:取下层绘制非交集部分。10.PorterDuff.Mode.SRC_ATOP:取下层非交集部分与上层交集部分11.PorterDuff.Mode.DST_ATOP:取上层非交集部分与下层交集部分12.PorterDuff.Mode.XOR:异或:去除两图层交集部分13.PorterDuff.Mode.DARKEN:取两图层全部区域,交集部分颜色加深14.PorterDuff.Mode.LIGHTEN:取两图层全部,点亮交集部分颜色15.PorterDuff.Mode.MULTIPLY:取两图层交集部分叠加后颜色16.PorterDuff.Mode.SCREEN:取两图层全部区域,交集部分变为透明色　5.2、Canvas类Canvas即画布,其上可以使用Paint画笔对象绘制很多东西。　Canvas　对象中可以绘制:　1)　drawArc():绘制圆弧;2)　drawBitmap():绘制Bitmap图像;3)　drawCircle():绘制圆圈;4)　drawLine():绘制线条;5)　drawOval():绘制椭圆;6)　drawPath():绘制Path路径;7)　drawPicture():绘制Picture图片;8)　drawRect():绘制矩形;9)　drawRoundRect():绘制圆角矩形;10)　drawText():绘制文本;11)　drawVertices():绘制顶点。　Canvas　对象的其他方法:　1)　canvas.save():把当前绘制的图像保存起来,让后续的操作相当于是在一个新图层上绘制;2)　canvas.restore():把当前画布调整到上一个save()之前的状态;3)　canvas.translate(dx,　dy):把当前画布的原点移到(dx,　dy)点,后续操作都以(dx,　dy)点作为参照;4)　canvas.scale(x,　y):将当前画布在水平方向上缩放x倍,竖直方向上缩放y倍;5)　canvas.rotate(angle):将当前画布顺时针旋转angle度。　6、onLayout()　onLayout()方法负责布局,大多数情况是在自定义ViewGroup中才会重写,主要用来确定子View在这个布局空间中的摆放位置。　onLayout(boolean　changed,　int　l,　int　t,　int　r,　int　b)方法有5个参数,其中changed表示这个控件是否有了新的尺寸或位置;l、t、r、b分别表示这个View相对于父布局的左/上/右/下方的位置。　以下是onLayout()方法中常用的方法:　1)　getChildCount():获取子View的数量;2)　getChildAt(i):获取第i个子View3)　getWidth/Height():获取onMeasure()中返回的宽度和高度的测量值;4)　child.getLayoutParams():获取到子View的LayoutParams对象;5)　child.getMeasuredWidth/Height():获取onMeasure()方法中测量的子View的宽度和高度值;6)　getPaddingLeft/Right/Top/Bottom():获取控件的四周内边距;7)　child.layout(l,　t,　r,　b):设置子View布局的上下左右边的坐标。　7、其他方法　7.1、generateLayoutParams()　generateLayoutParams()方法用在自定义ViewGroup中,用来指明子控件之间的关系,即与当前的ViewGroup对应的LayoutParams。我们只需要在方法中返回一个我们想要使用的LayoutParams类型的对象即可。　在generateLayoutParams()方法中需要传入一个AttributeSet对象作为参数,这个对象是这个ViewGroup的属性集,系统根据这个ViewGroup的属性集来定义子View的布局规则,供子View使用。　例如,在自定义流式布局中,我们只需要关心子控件之间的间隔关系,因此我们需要在generateLayoutParams()方法中返回一个new　MarginLayoutParams()即可。　7.2、onTouchEvent()　onTouchEvent()方法用来监测用户手指操作。我们通过方法中MotionEvent参数对象的getAction()方法来实时获取用户的手势,有UP、DOWN和MOVE三个枚举值,分别表示用于手指抬起、按下和滑动的动作。每当用户有操作时,就会回掉onTouchEvent()方法。　7.3、onScrollChanged()　如果我们的自定义View　/　ViewGroup是继承自ScrollView　/　HorizontalScrollView等可以滚动的控件,就可以通过重写onScrollChanged()方法来监听控件的滚动事件。　这个方法中有四个参数:l和t分别表示当前滑动到的点在水平和竖直方向上的坐标;oldl和oldt分别表示上次滑动到的点在水平和竖直方向上的坐标。我们可以通过这四个值对滑动进行处理,如添加属性动画等。　7.4、invalidate()　invalidate()方法的作用是请求View树进行重绘,即draw()方法,如果视图的大小发生了变化,还会调用layout()方法。　一般会引起invalidate()　操作的函数如下:　1)　直接调用invalidate()方法,请求重新draw(),但只会绘制调用者本身;2)　调用setSelection()方法,请求重新draw(),但只会绘制调用者本身;3)　调用setVisibility()方法,会间接调用invalidate()方法,继而绘制该View;4)　调用setEnabled()方法,请求重新draw(),但不会重新绘制任何视图,包括调用者本身。　7.5、postInvalidate()　功能与invalidate()方法相同,只是postInvalidate()方法是异步请求重绘视图。　7.6、requestLayout()　requestLayout()方法只是对View树进行重新布局layout过程(包括measure()过程和layout()过程),不会调用draw()过程,即不会重新绘制任何视图,包括该调用者本身。　7.7、requestFocus()　请求View树的draw()过程,但只会绘制需要重绘的视图,即哪个View或ViewGroup调用了这个方法,就重绘哪个视图。　8、总结　最后,让我们来总览一下自定义View　/　ViewGroup时调用的各种函数的顺序,如下图所示:　在这些方法中:　onMeasure()会在初始化之后调用一到多次来测量控件或其中的子控件的宽高;　onLayout()会在onMeasure()方法之后被调用一次,将控件或其子控件进行布局;　onDraw()会在onLayout()方法之后调用一次,也会在用户手指触摸屏幕时被调用多次,来绘制控件。