工欲善其事,必先利其器。自定义控件对于每个开发人员来说都直接或者间接的接触过自定义控件。今天来介绍一下自定义控件中必不可少的两个东西,paint 与canvas。首先从paint 与canvas 的常用方法入手。
Paint 常用方法:
setTextSize(float textSize)//设置文字大小
setFakeBoldText(boolean fakeBoldText)//设置是否为粗体文字
setStrikeThruText(boolean strikeThruText)//设置带有删除线效果
setUnderlineText(boolean underlineText)//设置下划线
setTextAlign(Paint.Align align)//设置开始绘图点位置
setTextScaleX(float scaleX)//水平拉伸设置
setTextSkewX(float skewX)//设置字体水平倾斜度,普通斜体字是-0.25,可见往右斜
setTypeface(Typeface typeface)
setAntiAlias(true);//设置抗锯齿
setStrokeJoin(Paint.Join join) //设置画笔拐弯处的连接风格
join有三种方式:
Join.MITER(结合处为锐角)
Join.Round(结合处为圆弧)
Join.BEVEL(结合处为直线)
setColor(Color color); //设置画笔颜色
setStrokeWidth();//设置画笔宽度
setStyle(Paint.Style.STROKE); //设置风格
Style.STROKE (空心)
Style.FILL(填充)
/**
* 参数说明
*第一个参数为模糊半径,越大越模糊。
* 第二个参数是阴影离开文字的x横向距离。
* 第三个参数是阴影离开文字的Y横向距离。 第四个参数是阴影颜色
*/
setShadowLayer(1,5,-15,Color.BLUE);//设置阴影
setStrokeCap(Paint.Cap.ROUND); //设置线帽
setTextAlign(Paint.Align align) //设置绘制文本时的文字的对齐方式
canvas 常用方法: 在介绍canvas 常用方法之前,首先介绍一下canvas 的坐标系,请看此文:
canvas 常用方法:
<pre name="code" class="java">canvas.drawRect(0,0,getMeasuredWidth(),getMeasuredHeight(),mPaint);
//参数说明 text 是要画的字 第二个 x轴开始的位置 ,第三个是 y轴的底部基准线 四 是画笔 canvas.drawText(text,getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint); canvas.drawText(text,0,text.length()-2,getWidth() / 2 - mBound.width() / 2, getHeight() / 2 + mBound.height() / 2, mPaint); canvas.drawCircle(getWidth()/2,getHeight()/2,TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,20,getResources().getDisplayMetrics()),mPaint); canvas.drawColor(Color.RED, PorterDuff.Mode.SCREEN);
//根据一个矩形画圆弧
RectF rectF=new RectF(0,0,200,200);
/**
* rectF 弧线所使用的矩形区域大小
* 0 开始角度 以x轴水平方向 顺时针
* 180 扫过的角度
* true 是否使用中心 true 则连接中心,画一个扇形 false 画一个圆弧
*/
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawArc(rectF,0,60,false,mPaint);
//画线
canvas.drawLine(0,0,100,50,mPaint);
//画多条线1
mPaint.setStrokeWidth(20);
float [] ops=new float[]{0f,30f,40f,90f,40f,90f,135f,155f}; //个数必须是4的倍数 没4个坐标 确定一段
canvas.drawLines(ops,mPaint);
// //画多条线2
/**
* ops 线的坐标
* 0 数组中,从哪个开始
* 4 数组中有几个数据有效
* mPaint 画笔
* int offset:集合中跳过的数值个数,注意不是点的个数!一个点是两个数值;
count:参与绘制的数值的个数,指pts[]里人数值个数,而不是点的个数,因为一个点是两个数值
*/
canvas.drawLines(ops,2,0,mPaint);//不推荐使用
//画内圆
RectF rectF1=new RectF(0,0,getWidth(),getHeight());
canvas.drawOval(rectF1,mPaint);
//按照既定点 绘制文本内容
canvas.drawPosText(" 雷娅",
new float[]{
50,50,//第一个字母在坐标50,50
100,100,//第二个字母在坐标50,50
200,200
},
mPaint);
//画圆角矩形
RectF rect = new RectF(50, 50, 200, 200);
canvas.drawRoundRect(rect,
30,//x轴的半径
30,//y轴的半径
mPaint);
//画路径 //其他更多
Path path = new Path(); //定义一条路径
path.moveTo(10,10); //移动到坐标10,10
path.lineTo(50, 60);
path.lineTo(200,80);
path.lineTo(10,10);
mPaint.setStyle(Paint.Style.STROKE);
canvas.drawPath(path, mPaint);
//画路径
Path path = new Path(); //定义一条路径
path.moveTo(10,10); //移动到坐标10,10
path.lineTo(50,60);
path.lineTo(200,200);
canvas.drawPath(path, mPaint);
mPaint.setStrokeWidth(5);
canvas.drawTextOnPath("asdfghjkl",
path, 10, 10, mPaint);
/**
* 参数说明
*第一个参数为模糊半径,越大越模糊。
* 第二个参数是阴影离开文字的x横向距离。
* 第三个参数是阴影离开文字的Y横向距离。 第四个参数是阴影颜色
*/
mPaint.setShadowLayer(1,5,-15,Color.BLUE);
mPaint.setTypeface(Typeface.MONOSPACE);//好像没什么卵用
canvas.drawText("你是煞笔",getWidth()/2-mBound.width()/2,getHeight()/2+mBound.height()/2,mPaint);
//画路径
mPaint.setColor(Color.BLACK);
mPaint.setStrokeCap(Paint.Cap.ROUND);
canvas.drawLine(30,getHeight()/2,30,30,mPaint);
mPaint.reset();
mPaint.setColor(Color.BLACK);
canvas.drawLine(30,getHeight()/2,getWidth(),getHeight()/2,mPaint);
Path path2=new Path();
path2.moveTo(30,getHeight()/2);
path2.lineTo(80,getHeight()/2-50);
path2.lineTo(130,getHeight()/2-70);
path2.lineTo(180,getHeight()/2+50);
path2.lineTo(230,getHeight()/2+80);
// 画路径时线条生硬 参数表示弧度
mPaint.setPathEffect(new CornerPathEffect(20));
//虚线 第一个参数设置虚线的长度, 第二个参数表示划线的偏移量
mPaint.setPathEffect(new DashPathEffect(new float[]{10,5},0));
//DiscretePathEffect——离散路径效果
/**
* 参数说明
* 第一个参数segmentLength:表示将原来的路径切成多长的线段。
* 如果值为2,那么这个路径就会被切成一段段由长度为2的小线段。
* 所以这个值越小,所切成的小线段越多;这个值越大,所切成的小线段越少。
第二参数deviation:表示被切成的每个小线段的可偏移距离。
值越大,就表示每个线段的可偏移距离就越大,就显得越凌乱,
值越小,每个线段的可偏移原位置的距离就越小。
*/
mPaint.setPathEffect(new DiscretePathEffect(2,5));
//PathDashPathEffect——印章路径效果
/**
* Path shape:表示印章路径,比如我们下面示例中的三角形加右上角一个点;
float advance:表示两个印章路径间的距离,很容易理解,印章间距离越大,间距就越大。
float phase:路径绘制偏移距离,与上面DashPathEffect中的float phase参数意义相同
Style style:表示在遇到转角时,如何操作印章以使转角平滑过渡,
取值有:Style.ROTATE,Style.MORPH,Style.TRANSLATE;Style.ROTATE表示通过旋转印章来过渡转角;
Style.MORPH表示通过变形印章来过渡转角;Style.TRANSLATE表示通过位移来过渡转角。
这三个效果的具体意义,上面会通过具体示例来分别讲解。
*/
// mPaint.setPathEffect(new PathDashPathEffect());
mPaint.setStrokeWidth(3);
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setStrokeJoin(Paint.Join.ROUND);
canvas.drawPath(path2,mPaint);
//画bitmap
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
canvas.drawBitmap(bitmap,getWidth()/2-mBound.width()/2,getHeight()/2-mBound.height()/2,mPaint);