博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android Canva和Paint学习
阅读量:5965 次
发布时间:2019-06-19

本文共 9504 字,大约阅读时间需要 31 分钟。

  • 先上图看效果

  • 圆角矩形的实现方法 在自定义View初始化的地方创建画笔,并设置相关属性

    //创建画笔,设置flag //ANTI_ALIAS_FLAG 抗锯齿 //DITHER_FLAG 在绘制的时候启用抖动标志 paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DITHER_FLAG); //给画笔设置颜色 paint.setColor(0x9f345f56); //设置画笔线条宽度 paint.setStrokeWidth(10); //将画笔设置为填充且描边 paint.setStyle(Paint.Style.STROKE); //创建文字画笔 mTextPaint = new Paint(); //设置画笔颜色 mTextPaint.setColor(0xff000000); //设置文字大小 mTextPaint.setTextSize(36);复制代码

    在自定义View的onDraw()方法里面,调用canvas的drawRoundRect方法绘制圆角矩形。

    //绘制文字 canvas.drawText("圆角矩形",50,70,mTextPaint); //定义一个矩形 RectF rectF = new RectF(10,100,500,250); //绘制圆角矩形 canvas.drawRoundRect(rectF,16,16,paint);复制代码
  • 圆形的实现方法 绘制圆形就是在自定义view的onDraw()方法里调用canvas的drawCircle()方法 绘制圆形是使用的画笔要设置属性填充

    //画笔设置属性填充且描边 mCirclePaint.setStyle(Paint.Style.FILL_AND_STROKE); //绘制文字 canvas.drawText("圆形",170,320,mTextPaint); //绘制圆形 canvas.drawCircle(200,500,150,mCirclePaint);复制代码
  • 圆环的实现方法

    //画笔只设置描边 mRingPaint.setStyle(Paint.Style.STROKE);  //绘制圆环 canvas.drawCircle(200,910,150,mRingPaint);复制代码
  • 带有圆形线帽的线的实现方法

    canvas.drawText("带有圆形线帽的线",80,1190,mTextPaint);  //设置画笔属性,绘制带有圆形线帽的线 paint.setStrokeCap(Paint.Cap.ROUND); paint.setStrokeWidth(50); //绘制圆形线帽 canvas.drawLine(70,1250,350,1250,paint);复制代码
  • 连接处为圆角的线的实现方法

    //绘制文字 canvas.drawText("绘制线的连接处为圆角的线",60,1350,mTextPaint);  //设置画笔属性,使画笔绘制path的时候连接处为圆角 mRoundJoinPaint.setStrokeJoin(Paint.Join.ROUND); //新建path对象 Path path = new Path(); //path线绘制的起点移动到(70,1400)这个点处 path.moveTo(70,1400); //从(70,1400)连接到(350,1400),是一条水平线 path.lineTo(350,1400); //再从(350,1400)连接到(70,1600),是一条斜线 path.lineTo(70,1600); //绘制这两条线,连接处为圆角 canvas.drawPath(path,mRoundJoinPaint);复制代码
  • 连接处为平角的线的实现方法

    //绘制文字 canvas.drawText("绘制线的连接处为平角的线",560,50,mTextPaint); //设置画笔属性,使画笔绘制path的时候连接处为平角 mBevelJoinPaint.setStrokeJoin(Paint.Join.BEVEL); //创建path对象 Path bevelPath = new Path(); //移动绘制的起点为(600,100) bevelPath.moveTo(600,100); //从(600,100)连接到(850,100),是一条水平线 bevelPath.lineTo(850,100); //再从(850,100)连接到(600,300),是一条斜线 bevelPath.lineTo(600,300); //绘制这两条线,连接处为平角 canvas.drawPath(bevelPath,mBevelJoinPaint);复制代码
  • 连接处为直角的线的实现方法

    //绘制文字 canvas.drawText("绘制线的连接处为直角的线",560,390,mTextPaint);  //设置画笔属性,使画笔绘制path的时候连接处为直角 mMiterJoinPaint.setStrokeJoin(Paint.Join.MITER); //创建path对象 Path miterPath = new Path(); //把path的绘制起点移动到(600,430)这个点 miterPath.moveTo(600,430); //从(600,430)连接到(850,430),是一条水平线 miterPath.lineTo(850,430); //再从(850,430)连接到(600,630),是一条斜线 miterPath.lineTo(600,630); //绘制这两条线,连接处为直角 canvas.drawPath(miterPath,mMiterJoinPaint);复制代码
  • 使用CornerPathEffect实现连接处为圆角的效果

    //绘制文字 canvas.drawText("使用 CornerPathEffect",560,710,mTextPaint); //绘制文字 canvas.drawText("可以实现线段连接处圆角效果",560,760,mTextPaint); //把画笔属性置为默认值() mMiterJoinPaint.reset();  //设置画笔的PathEffect属性为new CornerPathEffect(10),可使这个画笔绘制path连接处为圆角 mMiterJoinPaint.setPathEffect(new CornerPathEffect(10)); //设置画笔为描边 mMiterJoinPaint.setStyle(Paint.Style.STROKE); //设置画笔的颜色 mMiterJoinPaint.setColor(0xfff04598); //设置画笔绘制线条的宽度 mMiterJoinPaint.setStrokeWidth(30); //创建path对象 Path pathEffect = new Path(); //绘制path的起点移动到(600,800) pathEffect.moveTo(600,800); //从(600,800)连接到(850,800),是一条水平线 pathEffect.lineTo(850,800); //从(850,800)连接到(600,1000),是一条斜线 pathEffect.lineTo(600,1000); //绘制这两条线,连接处为圆角 canvas.drawPath(pathEffect,mMiterJoinPaint);复制代码
  • 使用DashPathEffect实现虚线的效果

    //绘制文字 canvas.drawText("使用 DashPathEffect",560,1110,mTextPaint); //绘制文字 canvas.drawText("可以实现线段虚线效果",560,1150,mTextPaint); //把画笔置为默认值 mMiterJoinPaint.reset(); mMiterJoinPaint.setPathEffect(new DashPathEffect(new float[]{10,5},0)); mMiterJoinPaint.setStyle(Paint.Style.STROKE); mMiterJoinPaint.setColor(0xfff04598); mMiterJoinPaint.setStrokeWidth(30); //绘制连接处为直角的线 Path dashPathEffect = new Path(); dashPathEffect.moveTo(600,1200); dashPathEffect.lineTo(960,1200); canvas.drawPath(dashPathEffect,mMiterJoinPaint);复制代码
  • 实现PathDashPathEffect实现特殊的虚线效果(圆)

    Path ovalPaht = new Path(); ovalPaht.addOval(dotRectF,Path.Direction.CW); mMiterJoinPaint.setPathEffect(new PathDashPathEffect(ovalPaht,dotRectF.width() * 1.5f,0,PathDashPathEffect.Style.TRANSLATE)); pathDashEffect.moveTo(600,1370); pathDashEffect.lineTo(960,1370); canvas.drawPath(pathDashEffect,mMiterJoinPaint);复制代码
  • 实现PathDashPathEffect实现特殊的虚线效果(方块)

    //绘制文字  canvas.drawText("使用 PathDashPathEffect",560,1310,mTextPaint);  //绘制文字  canvas.drawText("可以实现线段特殊的虚线效果",560,1350,mTextPaint);  RectF dotRectF = new RectF(0,0,50,50);  //把画笔置为默认值  mMiterJoinPaint.reset();  Path rectPaht = new Path();  rectPaht.addRect(dotRectF,Path.Direction.CW);  mMiterJoinPaint.setPathEffect(new PathDashPathEffect(rectPaht,dotRectF.width() * 1.5f,0,PathDashPathEffect.Style.TRANSLATE));  mMiterJoinPaint.setStyle(Paint.Style.STROKE);  mMiterJoinPaint.setColor(0xfff04598);  mMiterJoinPaint.setStrokeWidth(30);  //绘制连接处为直角的线  Path pathDashEffect = new Path();  pathDashEffect.moveTo(600,1450);  pathDashEffect.lineTo(960,1450);  canvas.drawPath(pathDashEffect,mMiterJoinPaint);复制代码
  • 实现PathDashPathEffect实现特殊的虚线效果(子弹)

    //绘制文字 canvas.drawText("绘制分割线--子弹型",50,50,mTextPaint); RectF dotRectF = new RectF(0,0,50,50); Path bulletPath = new Path(); bulletPath.lineTo(dotRectF.centerX(),dotRectF.top); bulletPath.addArc(dotRectF,-90,180); bulletPath.lineTo(dotRectF.left,dotRectF.bottom); bulletPath.lineTo(dotRectF.left,dotRectF.top); //绘制连接处为直角的线 Path pathDashEffect = new Path(); pathDashEffect.moveTo(50,82); mPaint.setPathEffect(new PathDashPathEffect(bulletPath,dotRectF.width() * 1.5f,0,PathDashPathEffect.Style.ROTATE)); pathDashEffect.lineTo(460,83); canvas.drawPath(pathDashEffect,mPaint);复制代码
  • 实现PathDashPathEffect实现特殊的虚线效果(五角星)

    /*  * 绘制五角星的原理就是把一个圆等分出5分,分别找出这5个等分点,从第一个点连接第三个点  * 再连接第五个点,再连接第二个点,再连接第四个点,再连接第一个点,就是一个五角星了。  */  RectF dotRectF = new RectF(0,0,50,50);  //绘制文字  canvas.drawText("绘制分割线--五角星",650,50,mTextPaint);  Path ovalPath = new Path();  //这个表示绘制椭圆,因为定义的dotRectF是一个正方形,所以最终绘制出来的是个圆  ovalPath.addOval(dotRectF, Path.Direction.CW);  /*  * PathMeasure类似一个Path坐标计算器,使用它可以求出path上一些点的坐标  * ovalPath 传入的待求的path  * false表示这个path不要求闭合,true表示path是闭合的,即使path不是闭合的,它也会给补上最后一条线  * 给闭合  */  PathMeasure pathMeasure = new PathMeasure(ovalPath,false);  //这个这个圆(ovalPath)的长度  float length = pathMeasure.getLength();  //把这个圆平均分成五段,获取每段的长度  float split = length/5;  //表示把圆平均分成5段的上面的5个点的坐标  //比如startPos[1]表示第一个点的横坐标,startPos[2]表示第一个点的纵坐标,startPos[3]表示第二个点的横坐标,startPos[4]表示第二个点的纵坐标,依次类推  float[] starPos = new float[10];  //表示每个点的横纵坐标  float[] pos = new float[2];  //表示这段圆弧切点的横纵坐标  float[] tan = new float[2];  //一个for循环,对每段圆弧进行处理  for (int i = 0; i < 5; i++) {  	//求每段圆弧的起点坐标和切点坐标分别存储在pos和tan中      pathMeasure.getPosTan(split * i,pos,tan);      //把每段圆弧起点的横纵坐标赋值给starPos      starPos[i*2 + 0] = pos[0];      starPos[i*2 + 1] = pos[1];  }  //定义五角星线  Path starPath = new Path();  //移动到圆的第一个点  starPath.moveTo(starPos[0],starPos[1]);  //圆的第一个点和第第三个点相连  starPath.lineTo(starPos[4],starPos[5]);  //再连圆的第五个点  starPath.lineTo(starPos[8],starPos[9]);  //再连圆的第二个点  starPath.lineTo(starPos[2],starPos[3]);  //再连第四个点  starPath.lineTo(starPos[6],starPos[7]);  //再连第一个点  starPath.lineTo(starPos[0],starPos[1]);  //定义一个矩阵  Matrix matrix = new Matrix();  //表示反向旋转90度操作  matrix.postRotate(-90,dotRectF.centerX(),dotRectF.centerY());  //执行对五角星反向旋转90度  starPath.transform(matrix);  //定义一条path  Path starLinePath = new Path();  starLinePath.moveTo(650,82);  //设置画笔属性,使画笔画出来的虚线线是五角星,因为PathDashPathEffect添加了我们刚才定义的五角星  mStarPaint.setPathEffect(new PathDashPathEffect(starPath,75,0,PathDashPathEffect.Style.TRANSLATE));  starLinePath.lineTo(960,83);  //绘制五角星虚线  canvas.drawPath(starLinePath,mStarPaint);复制代码
  • 饼状图实现

    //画笔属性设置为默认值 mPaint.reset(); //设置画笔颜色 mPaint.setColor(0xffff0000); //设置画笔为填充 mPaint.setStyle(Paint.Style.FILL); //绘制文字 canvas.drawText("绘制饼状图",50,250,mTextPaint); //定义一个矩形 RectF rectF = new RectF(300,300,600,600); //绘制第一个扇形(圆弧) canvas.drawArc(rectF,0,40,true,mPaint); //改变画笔颜色 mPaint.setColor(0xff0a6586); //绘制第二个扇形 //recfF表示扇形所在的区域,40是startAngle圆弧的起始角度,60是sweepAngle,表示圆弧扫过的角度 canvas.drawArc(rectF,40,60,true,mPaint); //改变画笔颜色 mPaint.setColor(0xffa04586); //绘制第三个扇形 canvas.drawArc(rectF,100,20,true,mPaint); //改变画笔颜色 mPaint.setColor(0xf06f0ac6); //绘制第四个扇形 canvas.drawArc(rectF,120,30,true,mPaint); //改变画笔颜色 mPaint.setColor(0xff9a450f); //绘制第五个扇形 canvas.drawArc(rectF,150,90,true,mPaint); //改变画笔颜色 mPaint.setColor(0xfa6759c6); //绘制第六个扇形 canvas.drawArc(rectF,240,100,true,mPaint); //改变画笔颜色 mPaint.setColor(0xff8b65a0); //绘制第七个扇形,整个饼状图就绘制完毕了 canvas.drawArc(rectF,340,20,true,mPaint); //绘制饼状图的表示 //定义一个矩形,四个参数分别表示left,top,right,bottom RectF colorRectF = new RectF(700,450,750,470); //给画笔设置颜色 mPaint.setColor(0xffff0000); //绘制小矩形 canvas.drawRect(colorRectF,mPaint); //绘制文字,770表示文字最左边的位置,475表示文字最底部位置 canvas.drawText("棉花",770,475,mTextPaint); RectF colorRectF1 = new RectF(700,410,750,430); mPaint.setColor(0xff0a6586); canvas.drawRect(colorRectF1,mPaint); canvas.drawText("小麦",770,435,mTextPaint); RectF colorRectF2 = new RectF(700,490,750,510); mPaint.setColor(0xffa04586); canvas.drawRect(colorRectF2,mPaint); canvas.drawText("大豆",770,515,mTextPaint); RectF colorRectF3 = new RectF(700,530,750,550); mPaint.setColor(0xf06f0ac6); canvas.drawRect(colorRectF3,mPaint); canvas.drawText("花生",770,555,mTextPaint); RectF colorRectF4 = new RectF(700,570,750,590); mPaint.setColor(0xff9a450f); canvas.drawRect(colorRectF4,mPaint); canvas.drawText("甘蔗",770,595,mTextPaint); RectF colorRectF5 = new RectF(700,610,750,630); mPaint.setColor(0xfa6759c6); canvas.drawRect(colorRectF5,mPaint); canvas.drawText("油菜",770,635,mTextPaint); RectF colorRectF6 = new RectF(700,650,750,670); canvas.drawText("玉米",770,675,mTextPaint); mPaint.setColor(0xff8b65a0);canvas.drawRect(colorRectF6,mPaint);复制代码

转载地址:http://otxax.baihongyu.com/

你可能感兴趣的文章
从图像中检测人脸
查看>>
javascript高级编程学习笔记(二)——继承
查看>>
Thinking in "++i" and "i++"
查看>>
spring整合hibernate事务编程中错误分析
查看>>
安装并使用Strut放映impress.js生成的ppt
查看>>
Alipay Direct Bankpay 支付宝网银支付 (For OpenCart 2.x)
查看>>
SDWebImage点滴
查看>>
edite not the main type
查看>>
commons-fileupload 的详细介绍与使用
查看>>
Hessian HTTP POST访问时,Nginx返回411问题
查看>>
gradle学习(19)-log系统
查看>>
SpringAop通知
查看>>
推荐几本jquery书
查看>>
impala里面断言的用法
查看>>
JAVA来读取大文本文件
查看>>
《Genesis-3D游戏引擎系列教程-入门篇》九:发布到移动平台
查看>>
Service小结
查看>>
mysql的事物隔离机制?
查看>>
FreeMarker基本操作(二)
查看>>
数据结构与算法之KMP算法中Next数组代码原理分析
查看>>