自定义View的初步使用

自定义View初学

自定义的属性:
选择和设置构造方法;
重写onMeasure()方法;
重写onDraw()方法;
重写onLayout()方法;
重写其他事件的方法(滑动监听等)。
常用的format类型:
1) string:字符串类型;
2) integer:整数类型;
3) float:浮点型;
4) dimension:尺寸,后面必须跟dp、dip、px、sp等单位;
5) Boolean:布尔值;
6) reference:引用类型,传入的是某一资源的ID,必须以“@”符号开头;
7) color:颜色,必须是“#”符号开头;
8) fraction:百分比,必须是“%”符号结尾;
9) enum:枚举类型

三个构造方法的整合

在这里插入图片描述

onMeasure():

onMeasure()方法中主要负责测量,决定控件本身或其子控件所占的宽高。我们可以通过onMeasure()方法提供的参数widthMeasureSpec和heightMeasureSpec来分别获取控件宽度和高度的测量模式和测量值(测量 = 测量模式 + 测量值)。

onMeasure()方法中常用的方法:

1)  getChildCount():获取子View的数量;
2)  getChildAt(i):获取第i个子控件;
3)  subView.getLayoutParams().width/height:设置或获取子控件的宽或高;
4)  measureChild(child, widthMeasureSpec, heightMeasureSpec):测量子View的宽高;
5)  child.getMeasuredHeight/width():执行完measureChild()方法后就可以通过这种方式获取子View的宽高值;
6)  getPaddingLeft/Right/Top/Bottom():获取控件的四周内边距;
7)  setMeasuredDimension(width, height):重新设置控件的宽高。如果写了这句代码,就需要删除“super. onMeasure(widthMeasureSpec, heightMeasureSpec);”这行代码。

onDraw()

onDraw()方法负责绘制,即如果我们希望得到的效果在Android原生控件中没有现成的支持,那么我们就需要自己绘制我们的自定义控件的显示效果。
  要学习onDraw()方法,我们就需要学习在onDraw()方法中使用最多的两个类:Paint和Canvas。
 注意:每次触摸了自定义View/ViewGroup时都会触发onDraw()方法。、

Paint类

Paint画笔对象,这个类中包含了如何绘制几何图形、文字和位图的样式和颜色信息,指定了如何绘制文本和图形。画笔对象右很多设置方法,大体上可以分为两类:一类与图形绘制有关,一类与文本绘制有关。

Paint类中有如下方法:

        1)  setArgb(int a, int r, int g, int b):设置绘制的颜色,a表示透明度,r、g、b表示颜色值;
	    2)  setAlpha(int a):设置绘制的图形的透明度;
		3)  setColor(int color):设置绘制的颜色;
		4)  setAntiAlias(boolean a):设置是否使用抗锯齿功能,抗锯齿功能会消耗较大资源,绘制图形的速度会减慢;
		5)  setDither(boolean b):设置是否使用图像抖动处理,会使图像颜色更加平滑饱满,更加清晰;
		6)  setFileterBitmap(Boolean b):设置是否在动画中滤掉Bitmap的优化,可以加快显示速度;
		7)  setMaskFilter(MaskFilter mf):设置MaskFilter来实现滤镜的效果;
		8)  setColorFilter(ColorFilter cf):设置颜色过滤器,可以在绘制颜色时实现不同颜色的变换效果;
		9)  setPathEffect(PathEffect pe):设置绘制的路径的效果;
		10) setShader(Shader s):设置Shader绘制各种渐变效果;
		11) setShadowLayer(float r, int x, int y, int c):在图形下面设置阴影层,r为阴影角度,x和y为阴影在x轴和y轴上的距离,c为阴影的颜色;
		12) setStyle(Paint.Style s):设置画笔的样式:FILL实心;STROKE空心;FILL_OR_STROKE同时实心与空心;
		13) setStrokeCap(Paint.Cap c):当设置画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的图形样式;
		14) setStrokeJoin(Paint.Join j):设置绘制时各图形的结合方式;
		15) setStrokeWidth(float w):当画笔样式为STROKE或FILL_OR_STROKE时,设置笔刷的粗细度;	
		16) setXfermode(Xfermode m):设置图形重叠时的处理方式; 

其他方法:

			1)  getTextBounds(String t, int s, int e, Rect b):将页面中t文本从s下标开始到e下标结束的所有字符所占的区域宽高封装到b这个矩形中;
			2)  clearShadowLayer():清除阴影层;
			3)  measureText(String t, int s, int e):返回t文本中从s下标开始到e下标结束的所有字符所占的宽度;
			4)  reset():重置画笔为默认值。

Canvas类

Canvas即画布,其上可以使用Paint画笔对象绘制很多东西。

			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():绘制顶点。

onLayout()

onLayout()方法负责布局,大多数情况是在自定义ViewGroup中才会重写,主要用来确定子View在这个布局空间中的摆放位置。
常用的方法:

1)  getChildCount():获取子View的数量;
2)  getChildAt(i):获取第i个子View
3)  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布局的上下左右边的坐标。

postInvalidate()

功能与invalidate()方法相同,只是postInvalidate()方法是异步请求重绘视图。

总结:

onMeasure()会在初始化之后调用一到多次来测量控件或其中的子控件的宽高;
onLayout()会在onMeasure()方法之后被调用一次,将控件或其子控件进行布局;
onDraw()会在onLayout()方法之后调用一次,也会在用户手指触摸屏幕时被调用多次,来绘制控件。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值