用自定义view------一用canvas来画图形.

来源:互联网 发布:js 判断对象未定义 编辑:程序博客网 时间:2024/06/15 13:58

         首先搭建外环境就,创建一个activity,然后创建一个继承view的canvas类,然后在activity的布局中加载一个自定义布局canvas.

然后:一.我们要理解canvas里面复写的三个方法的意思.1,context:上下文对象,这个是必须要写的构造方法,目的是为了在java代码当中创建自定义view的对象.

              2.attrs:自定义view在布局中定义的属性的集合.如果自定义想要定义在布局当中,必须要定义这个构造方法.

      3.defStyleAttr:默认的自定义的风格.特定的自定义风格.

二.我们要知道每一个方法,及其中参数的意思.这里最好去官方文档里面查看.

@des 绘制自定义view显示的内容

Canvas:画布. 确定了绘制的区域,提供了不同的绘制的方法,来完成绘制.

Canvas在api当中的方法的分类:

1.在画布中绘制图片:drawBitmap和drawPicture

2.绘制颜色:drawColor或drawARGB(A:透明度)

3.绘制基本几何形状:drawPoint(点),drawpoints(多点),drawCircle(圆),drawLine(线),drawAre(扇形),drawRect(矩形),drawOval(椭圆),drawRoundRect(圆角矩形),drawPath(路径:画点,连线),drawText(文字)

4.绘制剪切区:Clipath(),ClipRect(),ClipRegion(),drawPath();

5..变换画布:save(保存,每次变换之前保存一下画布的状态). rotate(旋转), restore(恢复,恢复到上一次保存的状态), translate(平移) scale(矩阵平移).

6.绘制顶点数据:drawVertices(绘制顶点), drawBitmapMesh(图片的外围设置)

7.Paint:画笔,  画笔的方法:reset(重置),setARGB(颜色) setAlpha(透明度) setAntiAlias(设置抗锯齿). setStrokeWidth(宽度) setTextSize(文字尺寸)

三.我们要知道运行的流程.即先后性.(先运行继承父类一般是view的构造方法,然后运行onMeasure测量方法,最后运行onDraw方法)

1.首先继承父控件的方法,比如常用的view方法,一般重写2个或者三个,根据需求来自行选择.方法一,里面的参数是context.指的是上下文对象.方法二里面多了一个attrs.这个是自定义view在布局定义的属性的集合(这个在我的自定义view---自定义属性里面详细的讲解).方法三比方法二多了一个

defStyleAttr方法.这个方法是定义特定的自定义风格或默认的自定义风格.
2.onMeasure方法.
//测量控件的长度和宽度//传入的值widthMeasureSpec:父容器允许的最大宽度.//传入的值heightMeasureSpec:父容器允许的最大高度.//view.MeasureSpecview的静态内部类,反映了view的高度和宽度的尺寸和传入的测量方式(3_)//测量方式1:AT_MOST:代表不固定的值,根据内部的内容进行展示.通常定义wrap_content会传入的值//测量方式2.EXACTLY:代表精确的值,view的宽度或者高度被定义为match_parent或者固定值时会传入的模式//测量方式3:UNSPECIFIED:没有限制的,不固定的.通常用于一些复杂控件,listview,grideview//widthMeasureSpecheightMeasureSpec表示他的对象的内容,内容包含两个值
具体如下
//获取宽度的测量模式:getMode,getSizeint wMode=MeasureSpec.getMode(widthMeasureSpec);int hMode=MeasureSpec.getMode(heightMeasureSpec);//获取控件测量后宽高的最大尺寸int wSize=MeasureSpec.getSize(widthMeasureSpec);int hSize=MeasureSpec.getSize(heightMeasureSpec);//判断xml文件当中传入的宽度的测量模式//即自定义view中的宽高的多少,match_parent?还是wrap_content?还是一个固定的值,根据不同的内容来选择不同的判断结果switch (wMode){    case MeasureSpec.AT_MOST:        wSize=500;        break;    case MeasureSpec.EXACTLY:        wSize=300;        break;}//判断xml文件当中传入的高度的测量模式switch (hMode){    case MeasureSpec.AT_MOST:        hSize=500;        break;    case MeasureSpec.EXACTLY:        hSize=400;        break;}Log.i("tag","自定义view的宽度:"+wSize+",高度:"+hSize);//将计算出来的宽度和高度的值进行设置,从而确定自定义view的宽高setMeasuredDimension(wSize,hSize);
3.onDraw方法
//设置画布的颜色canvas.drawColor(Color.RED);//定义画笔Paint paint=new Paint();//定义画布的颜色paint.setColor(Color.GREEN);//定义画笔的尺寸paint.setTextSize(80);//内容canvas.drawText("自定义view",100,200,paint);//设置颜色paint.setColor(Color.BLUE);//参数一二:起点的x y轴坐标,参数三四:重点的 x y轴坐标canvas.drawLine(0,0,100,200,paint);//参数一二:圆心xy坐标,参数三:半径长度canvas.drawCircle(100,200,50,paint);

0 0