画笔Paint及Canvas的简单应用(线 点 圆 矩形 扇形)
Android中Paint字体属性的设置
在Android SDK中使用Typeface类来定义字体,可以通过常用字体类型名称进行设置,如设置默认黑体:
Paint mp = new paint();
mp.setTypeface(Typeface.DEFAULT_BOLD)
常用的字体类型名称还有:
* Typeface.DEFAULT //常规字体类型
* Typeface.DEFAULT_BOLD //黑体字体类型
* Typeface.MONOSPACE //等宽字体类型
* Typeface.SANS_SERIF //sans serif字体类型
* Typeface.SERIF //serif字体类型
除了字体类型设置之外,还可以为字体类型设置字体风格,如设置粗体:
Paint mp = new Paint();
Typeface font = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);
p.setTypeface( font );
常用的字体风格名称还有:
* Typeface.BOLD //粗体
* Typeface.BOLD_ITALIC //粗斜体
* Typeface.ITALIC //斜体
* Typeface.NORMAL //常规
但是有时上面那些设置在绘图过程中是不起作用的,所以还有如下设置方式:
Paint mp = new Paint();
mp.setFakeBoldText(true); //true为粗体,false为非粗体
mp.setTextSkewX(-0.5f); //float类型参数,负数表示右斜,整数左斜
mp.setUnderlineText(true); //true为下划线,false为非下划线
mp.setStrikeThruText(true); //true为删除线,false为非删除线
Paint常用的方法还有:
mp.setTextSize(); //设置字体大小,int型,如12
mp.setStrokeWidth(w); //设置线宽,float型,如2.5f,默认绘文本无需设置(默认值好像为0),但假如设置了,再绘制文本的时候一定要恢复到0
在Android中需要通过graphics类来显示2D图形。
graphics中包括了Canvas(画布)、Paint(画笔)、Color(颜色)、Bitmap(图像)等常用的类。graphics具有绘制点、线、颜色、2D几何图形、图像处理等功能。
1.Color(颜色)类
Android系统中颜色的常用表示方法有以下3种:
(1)int color = Color.BLUE;
(2)int color = Color.argb(150,200,0,100);
(3)在xml文件中定义颜色;
在实际应用当中,我们常用的颜色有以下一些,其颜色常量及其表示的颜色如下所示:
Color.BLACK 黑色 Color.GREEN 绿色
Color.BLUE 蓝色 Color.LTGRAY 浅灰色
Color.CYAN 青绿色 Color.MAGENTA 红紫色
Color.DKGRAY 灰黑色 Color.RED 红色
Color.YELLOW 黄色 Color.TRANSPARENT 透明
Color.GRAY 灰色 Color.WHITE 白色
2.Paint(画笔)类
要绘制图形,首先得调整画笔,按照自己的开发需要设置画笔的相关属性。Pain类的常用属性设置方法如下:
setAntiAlias(); //设置画笔的锯齿效果
setColor(); //设置画笔的颜色
setARGB(); //设置画笔的A、R、G、B值
setAlpha(); //设置画笔的Alpha值
setTextSize(); //设置字体的尺寸
setStyle(); //设置画笔的风格(空心或实心) Paint.Style.STORKE 代表空心, FILL 代表实心
setStrokeWidth(); //设置空心边框的宽度
getColor(); //获取画笔的颜色
3.Canvas(画布)类
画笔属性设置好之后,还需要将图像绘制到画布上。Canvas类可以用来实现各种图形的绘制工作,如绘制直线、矩形、圆等等。Canvas绘制常用图形的方法如下:
绘制直线:canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint);
绘制矩形:canvas.drawRect(float left, float top, float right, float bottom, Paint paint);
绘制圆形:canvas.drawCircle(float cx, float cy, float radius, Paint paint);
绘制字符:canvas.drawText(String text, float x, float y, Paint paint);
绘制图形:canvas.drawBirmap(Bitmap bitmap, float left, float top, Paint paint);
小例子: 画,所参考的坐标指的是当前类指的控件,也就是this, 所有(0,0)指的是你这个控件的左上方,而不是屏幕
public class MyView extends View { private Paint paint; public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); paint = new Paint(); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); paint.setStrokeWidth(6);//宽度 paint.setColor(0xffff0000); //画点 // float x, 点的x坐标 float y, 点的y坐标 canvas.drawPoint(100,100,paint); //画线 paint.setColor(0xff00ff00); paint.setStrokeWidth(4); //参数1,2线的起点坐标 参数3,4,终点坐标 canvas.drawLine(0,0,20,100,paint); //圆形 paint.setColor(0xff0000ff); //设置图形的的样式 Paint.Style.STROKE 描图形的边缘(空心) Paint.Style.FILL 填充满图形 paint.setStyle(Paint.Style.FILL); //参数1,2确定圆心的位置, 参数3.半径 canvas.drawCircle(300,400,50,paint); //长方形 paint.setStyle(Paint.Style.STROKE);//空心 paint.setStrokeWidth(3);//线宽 canvas.drawRect(50,50,150,150,paint);//左上方(50,50),右下方(150,150) //直接创建一个矩形 RectF rectF = new RectF(50, 50, 150, 150); //扇形 /* RectF oval, 约束扇形的矩形,完整的扇形会与该矩形的四条边相切 float startAngle 扇形的起始度数(默认圆心水平与最右侧的连接线) float sweepAngle, 旋转的度数 .(顺时针旋转) boolean useCenter, 表示扇形的边点是否与圆心连接 Paint paint*/ canvas.drawArc(rectF,0,90,false,paint); //文本 paint.setStrokeWidth(0.2f); paint.setStyle(Paint.Style.FILL); paint.setTextSize(40); canvas.drawText("我是",400,50,paint); } }
效果图:
Paint 代表了Canvas上的画笔、画刷、颜料等等; Paint类常用方法: setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值 setAlpha(int a) // 设置alpha不透明度,范围为0~255 setAntiAlias(boolean aa) // 是否抗锯齿 setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义 setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始 setTextSize(float textSize) // 设置字体大小 setUnderlineText(booleanunderlineText) // 设置下划线 /*canvas.drawText("请输入内容", 10, getHeight()/2, paint); *//** * cx, 绘制时圆心x轴的坐标 * cy, 绘制时圆心y轴的坐标 * radius:半径 * paint *//* paint.setStyle(Paint.Style.STROKE); canvas.drawCircle(100, 200, 10, paint); canvas.drawCircle(230, 200, 30, paint); // TODO Auto-generated method stub //具体绘画通过canvas实现 canvas.drawLine(0, 0, getWidth(), getHeight(), paint);*/ /*//绘制正方形 paint.setColor(Color.MAGENTA); //paint.setColor(Color.rgb(0, 255, 22)); *//** * 1.left:绘制矩形时左边缘的坐标 * 2.top:绘制矩形时顶部的坐标,y轴坐标 * 3.right: * 4.bottom *//* canvas.drawRect(60, 280, 200, 420, paint); //绘制长方形 canvas.drawRect(220, 280, 300, 300, paint);*/ //绘制弧线 paint.setStyle(Paint.Style.STROKE);//空心 RectF rectF = new RectF(150, 20, 180, 40); /** * oval:RectF对象,指定弧线的外面的轮廓 * startAngle:弧线起始的角度 * sweepAngle:弧线扫过的角度 * useCenter:if true 将圆心包含在内,if false * paint */ canvas.drawArc(rectF, 180, 180, false, paint); /* //右眼 RectF rectF2 = new RectF(210, 20, 240, 40); canvas.drawArc(rectF2, 180, 180, false, paint); //嘴巴 RectF rectF3 = new RectF(180, 60, 210, 70); canvas.drawArc(rectF3, 0, 180, false, paint);*/ // TODO Auto-generated method stub //具体绘画通过canvas实现 canvas.drawLine(0, 0, getWidth(), getHeight(), paint); //画线 // canvas.drawLine(0, 0, getWidth(), getHeight(), paint); //画圆 // canvas.drawCircle(cx, cy, radius, paint); //画弧线 //第一个参数是说,画的弧线是属于哪个圆的一部分 //第二个参数是说,开始的度数,(从圆心水平右射线顺时针方向转的角度) //第三个参数是说,弧线的度数(不是结束的度数) //第四个参数是说,是否连接中心点 //第五个参数是画笔 // canvas.drawArc(oval, startAngle, sweepAngle, useCenter, paint) //画bitmap //第一个参数,画哪个bitmap //第二个参数和第三个参数是说,画这个bitmap左边界和上边界的坐标值 //第四个参数是画笔 // canvas.drawBitmap(bitmap, left, top, paint) //画一组线 //第一个参数是一组坐标点 //第二个参数是画笔 // canvas.drawLines(pts, paint) //画椭圆 //使用一个Rectf对象来确认要画的椭圆,第二个参数是画笔 // canvas.drawOval(oval, paint); //绘制路径 //给定一个路径,用paint绘制出来,此方法为底层方法。 // canvas.drawPath(path, paint); //画点 //前两个参数是横纵坐标 //第二个参数是画笔 // canvas.drawPoint(x, y, paint) //画矩形 //前四个参数是限定矩形的位置 //第五个参数是画笔 // canvas.drawRect(left, top, right, bottom, paint) //画圆角矩形 //第一个参数是矩形的位置 //第二个参数和第三个参数是圆角矩形中圆角的大小 //第四个参数是画笔 // canvas.drawRoundRect(rect, rx, ry, paint); //画文字 //第一个参数是说绘制的内容 //第二、第三个参数来确认从哪里绘制 //第四个参数是画笔ABCDQg // canvas.drawText(text, x, y, paint)
// 1、将会以颜色ARBG填充整个控件的Canvas背景 //mCanvas.drawARGB(122, 10, 159, 163) ; // 2、将会以颜色ARBG填充整个控件的Canvas背景 //mCanvas.drawColor(Color.BLUE) ; // 3、绘制颜色,但是要制定一个mode //mCanvas.drawColor(Color.BLUE, Mode.SCREEN) ; // 4、画背景,跟2等效 //mCanvas.drawPaint(mPaint) ; // 5、画一个点 //mCanvas.drawPoint(23, 23, mPaint) ; // 6、画很多点这里的float[] 表示{x0,y0,x1,y1,x2,y2,x3,y3.....} //mCanvas.drawPoints(new float[]{10,11,10,12,10,13,10,14,10,15,10,16}, mPaint) ; // 7、画线 //mCanvas.drawLine(...) ; // 8、画长方形 Rect 和RectF的区别? //精度不一样,Rect是使用int类型作为数值,RectF是使用float类型作为数值 //Rect r = new Rect(10,10,50,50) ; //mCanvas.drawRect(r, mPaint) ; //RectF rf = new RectF(10,10,50,50) ; //mCanvas.drawRect(rf, mPaint) ; //mCanvas.drawRect(10, 10, 50, 50, mPaint) ; // 9、画椭圆 初始化RectF的参数是(left,top,right,bottom) //RectF rf = new RectF(100,100 ,200 ,250) ; //mCanvas.drawOval(rf, mPaint) ; // 10、画圆 (圆心x0,圆心y0,半径,paint) //mCanvas.drawCircle(100, 100, 50, mPaint) ; // 11、画圆弧 RectF对象表明内切矩形的(left,top,right,bottom) //RectF rf = new RectF(100 ,100 ,200 ,200) ; // 参数(rf,startAngle ,angle ,sweepAngle ,paint) sweepAngle表明是否显示圆弧三角形 angle画多少度 //mCanvas.drawArc(rf, 60, 30, true, mPaint) ; // 12、绘制圆角矩形 RectF是矩形的(left,top,right,bottom) //RectF rf = new RectF(100 ,100 ,200 ,200) ; // 50表明x方向的半径,20表示y方向的半径 //mCanvas.drawRoundRect(rf, 50, 20, mPaint) ; // 13、画任意多边形 //Path path = new Path() ; //path.moveTo(100, 100) ; //path.lineTo(200, 200) ; //path.lineTo(300, 200) ; //mCanvas.drawPath(path, mPaint) ; // 14、通过Path对象,也可以画其他的图形 //Path path = new Path() ; //path.addCircle(100, 100, 20, Path.Direction.CCW) ; //mCanvas.drawPath(path ,mPaint); /*drawBitmap drawText drawPicture*/ /*Rect r = new Rect(100,100,200,200) ; ByteArrayOutputStream out = new ByteArrayOutputStream(); Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ; bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out) ; InputStream in = new ByteArrayInputStream(out.toByteArray()) ; */ /*Picture picture = Picture.createFromStream(mContext.getResources().openRawResource(R.raw.bg)) ; mCanvas.drawPicture(picture) ;*/ // 15、画bitmap对象 //mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg),100, 100, mPaint) ; // 16、Matrix中包含了对Bitmap的处理操作 /*Matrix m = new Matrix() ; m.postScale(2, 2) ; m.postRotate(60) ; mCanvas.drawBitmap(BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg), m, mPaint) ;*/ // 17、画带Matrix参数的bitmap,经过Matrix对象可以对bitmap做相关的处理,比如旋转,缩放,移动等《关于Matrix的使用另行总结》 /*Bitmap bitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.bg) ; Matrix m = new Matrix() ; m.postScale(2, 2) ; m.postRotate(60) ; m.postTranslate(300, 300) ; mCanvas.drawBitmap(bitmap, m, mPaint) ;*/ //mCanvas.drawBitmap(....) ; 暂不总结 // 18、画文字 //mCanvas.drawText(123, 10, 10, mPaint) ; //mCanvas.drawText(....) ;
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); Paint paint = new Paint(); paint.setColor(Color.RED); paint.setAntiAlias(true); paint.setStrokeWidth(3);//画笔的宽度 paint.setTextSize(50);//设置文本的大小 /** * 第二和第三个参数 代表文字的左下角 在(x,y)轴的坐标 */ canvas.drawText("画文字",10,100,paint); paint.setUnderlineText(true); // 设置下划线 canvas.drawText("我是带下划线的",10,200,paint); paint.setTextScaleX(2); // 设置文本缩放倍数,1.0f为原始 canvas.drawText("我是有间距的",200,100,paint); /** * 参数一是中心点的x轴,参数二是中心点的y轴,参数三是半径,参数四是paint对象; */ paint.setStyle(Paint.Style.STROKE);//空心圆 paint.setStrokeWidth(3);//画笔的宽度 canvas.drawCircle(250, 300,100, paint);//圆 paint.setStyle(Paint.Style.FILL);//实心 canvas.drawCircle(250, 300,50, paint);//圆 /** * 画线 前面两个参数代表xy轴的起点坐标,第三、四为xy轴的终点坐标 */ canvas.drawLine(0, 400, 200, 400,paint);//直线 canvas.drawLine(0, 400, 200, 500, paint);// 斜线 /** * 画弧 参数一是RectF对象,一个矩形区域椭圆形的界限用于定义在形状、大小、电弧, * 参数二是起始角(度)在电弧的开始, 矩形的中心点开始 参数三扫描角(度)开始顺时针测量的, 参数四是如果这是真的话,包括椭圆中心的电弧,并关闭它,如果它是假这将是一个弧线,参数五是Paint对象; */ paint.setStyle(Paint.Style.STROKE);//设置空心 RectF oval1=new RectF(0,500,180,700);//矩形 canvas.drawArc(oval1, 0, 180, false, paint);//小弧形 oval1.set(0,500,150,700);//重新设置矩形范围 canvas.drawArc(oval1, 0, 360, false, paint);//小弧形 paint.setStyle(Paint.Style.STROKE);//设置实心(扫过的角度将填满) RectF oval12=new RectF(0,800,180,1000);//矩形 canvas.drawArc(oval12, 0, 180, true, paint);//小弧形 oval12.set(0,800,150,1000);//重新设置矩形范围 canvas.drawArc(oval12, 0, 360, true, paint);//小弧形 /** * 画矩形 */ paint.setStyle(Paint.Style.STROKE);//设置空心 canvas.drawRect(200,500,380,700, paint);// 正方形 canvas.drawRect(200,800,450,1000, paint);// 长方形 /** * 画椭圆 */ paint.setStyle(Paint.Style.FILL);//设置实心 RectF rectF = new RectF(200,800,450,1000); canvas.drawOval(rectF,paint);//画椭圆,参数一是扫描区域,参数二为paint对象; /** * 绘制三角形,你可以绘制任意多边形 */ Path path = new Path(); path.moveTo(80, 200);// 此点为多边形的起点 path.lineTo(120, 250); path.lineTo(80, 350); path.close(); // 使这些点构成封闭的多边形 canvas.drawPath(path, paint); paint.setStyle(Paint.Style.STROKE); path.moveTo(500, 200);// 此点为多边形的起点 path.lineTo(600, 450); path.lineTo(800, 350); //path.close(); 没有封闭 canvas.drawPath(path, paint); /** * 画圆角矩形 第二个参数是x半径,第三个参数是y半径 */ RectF oval3 = new RectF(500, 600, 800, 1000);// 设置个新的长方形区域 canvas.drawRoundRect(oval3, 20, 15, paint); //画点 paint.setStyle(Paint.Style.FILL); canvas.drawText("画点:", 0, 1600, paint); canvas.drawPoint(60, 390, paint);//画一个点 canvas.drawPoints(new float[]{60,400,65,400,70,400}, paint);//画多个点 //画贝塞尔曲线 paint.reset(); paint.setStyle(Paint.Style.STROKE); paint.setColor(Color.RED); canvas.drawText("画贝塞尔曲线:", 0, 1000, paint); Path path2=new Path(); path2.moveTo(500, 1000);//设置Path的起点 path2.quadTo(500, 1200, 900, 1500); //设置贝塞尔曲线的控制点坐标和终点坐标 canvas.drawPath(path2, paint);//画出贝塞尔曲线 }