自定义View基础(三)View的绘图篇

   把自己整理的一些Api发出来,具体练习Demo见自定义View绘制练习Demo

  1. Canvas––Android中的UI,都是由Canvas绘制的

     //整个区域设置背景颜色
    canvas.drawColor(Color.BLUE); 
    canvas.drawRGB(255, 255, 0);     
       
    drawLines(@Size(min=4,multiple=2) float[] pts, int offset, int count, Paint paint)
    drawLines(@Size(min=4,multiple=2) @NonNull float[] pts, @NonNull Paint paint)
                  参数:
                  pts : 是点的集合且大小最小为4而且是2的倍数。表示每2个点连接形成一条直线,pts 的组织方
                        式为{x1,y1,x2,y2⋯.}
                  offset : 集合中跳过的数值个数,注意不是点的个数!一个点是两个数值
                  count : 参与绘制的数、值的个数,指pts[]里数值个数,而不是点的个数,因为一个点是两个数值
    drawLine(float startX, float startY, float stopX, float stopY, Paint paint)//画线,
                  参数一起始点的x轴位置,
                  参数二起始点的y轴位置,
                  参数三终点的x轴水平位置,
                  参数四终点y轴垂直位置,
                  参数五为Paint画刷对象。   
      
    drawPoint(float x, float y, Paint paint) //画点,参数一二表示一个点,第三个参数为Paint对象。
    drawPoints(@Size(multiple=2) @NonNull float[] pts, @NonNull Paint paint)
      
    drawRect(RectF rect, Paint paint) //绘制区域,RectF坐标系是浮点型;Rect坐标系是整形。
    //绘制圆矩形
    drawRoundRect(@NonNull RectF rect, float rx, float ry, @NonNull Paint paint)
                     //rx生成圆角的椭圆X轴半径
                     //ry生成圆角的椭圆Y轴的半径
    
    drawCircle(float cx, float cy, float radius, @NonNull Paint paint)//画圆,圆心坐标,半径
    drawOval(@NonNull RectF oval, @NonNull Paint paint)//椭圆
    drawArc(@NonNull RectF oval, float startAngle, float sweepAngle, boolean 
             useCenter,@NonNull Paint paint)//圆弧
                      oval : 生成椭圆的矩形
                      startAngle : 弧开始的角度 (X轴正方向为0度,顺时针弧度增大)
                      sweepAngle : 绘制多少弧度 (注意不是结束弧度)
                      useCenter : 是否有弧的两边 true有两边 false无两边
              
      void drawPath(Path path, Paint paint) //绘制一个路径,参数一为Path路径对象                       
                                           
    drawBitmap(Bitmap bitmap, Matrix m, Paint paint); 
      void drawBitmap(@NonNull Bitmap bitmap, float left, float top, @Nullable Paint paint) //left为距左边的距离,top为距顶部的距离                                                                                   
     
    绘制文字: 
    drawText(String text, float x, float y, Paint paint)//渲染文本,xy为左下角靠的比较近的一个坐标
    drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)//在路  
                  径上绘制文本, hOffset 和 vOffset。它们是文字相对于 Path 的水平偏移量和竖直偏移量,      
                  例如你设置 hOffset 为 5, vOffset 为 10,文字就会右移 5 像素和下移 10 像素。 
    StaticLayout:支持换行,它既可以为文字设置宽度上限来让文字自动换行,也会在 \n 处主动换行。
                 StaticLayout(CharSequence source,
                             TextPaint paint, 
                             int width,//是文字区域的宽度,文字到达这个宽度后就会自动换行;
                             Layout.Alignment align, //对齐方式
                             float spacingmult, //行间距的倍数,正常填1
                             float spacingadd, //行间距的额外附加值
                             boolean includepad)//是否在文字上下添加额外的空间,防止过高的字符越界
         //StaticLayout使用
         String text1 = "Lorem Ipsum is simply dummy text of industry.";  
         StaticLayout staticLayout1 = new StaticLayout(text1, paint, 600,  
                              Layout.Alignment.ALIGN_NORMAL, 1, 0, true);                         
         staticLayout1.draw(canvas);                    
     
    translate(float x,float y);//移动canvas绘制的原点,将画布的坐标原点向左右方向移动x,向上下方向移
     动y.canvas的默认位置是在(0,0),注意:是移动xy距离,不是移动到(x,y)坐标
     
    rotate(float degrees, float px, float py);//旋转,degrees顺时针旋转角度,px,py轴心的位置
    save():保存当前canvas的状态
    restore():用来恢复canvas save之前的状态。
  2. Paint类:画笔类

 (1)颜色
 Paint 设置颜色的方法有两种:一种是直接用 Paint.setColor/ARGB() 来设置颜色,另一种是使用 Shader 来指定着色方案。
   
 setColor(int color)  //直接设置颜色
 setShader(Shader shader) //着色器,当设置了Shader之后,setColor所设置的颜色就不再起作用。
     Shader的几个子类:
     ①LinearGradient线性渐变
      LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, 
                     Shader.TileMode tile) 。
      //x0 y0 x1 y1渐变的两个端点的位置
      //color0 color1 端点的颜色
      //Shader.TileMode:CLAMP(延续), MIRROR(镜像) 和 REPEAT(重复)。
      
     ②RadialGradient辐射渐变-从中心向周围辐射状的渐变
      RadialGradient(float centerX, float centerY, float radius, int centerColor, int 
                     edgeColor, TileMode tileMode)。
      //centerX,centerY 辐射中心点
      //radius 辐射半径
      //centerColor edgeColor 中心与边缘的颜色
      //title:辐射范围之外的颜色
      
     ③SweepGradient 扫描渐变
       SweepGradient(float cx, float cy, int color0, int color1)//扫描中心点, 开始颜色,结
                                                                  束颜色
     ④BitmapShader
       BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY)
    
     ⑤ComposeShader 
       ComposeShader(Shader shader1,Shader shader2, PorterDuff.Mode mode);  

 setColorFilter(ColorFilter colorfilter)//为绘制设置颜色过滤
 setAlpha(int a)  设置alpha不透明度,范围为0~255
 setAntiAlias(boolean aa)  //是否抗锯齿,边缘更清晰一些,锯齿痕迹不会那么明显。但会消耗较大资
                                  源,绘制图形速度会变慢。 
 setStrokeWidth(float width) //设置描边画笔宽度
 setDither(boolean dither);//设定是否使用图像抖动处理,会使绘制出来的图片颜色更加平滑和饱
                                   满,图像更加清晰  
 setFilterBitmap(true); //优化bitmap放大绘制的效果                                   
 setStyle(Paint.Style style); //Style.FILL: 填充  
                                STROKE:描边  
                                FILL_OR_STROKE: 填充且描边 
 setShadowLayer(float radius, float dx, float dy, int shadowColor) 设置阴影
                                    radius : 表示阴影的模糊范围
                                    dx : 水平偏移量
                                    dy : 垂直位移
                                    shadowColor : 阴影颜色
 //处理Path绘制的连接处  为圆弧
 setStrokeJoin(Paint.Join.ROUND);
  //画笔的笔触为圆角
 setStrokeCap(Paint.Cap.ROUND);
 //处理文本 
 setFakeBoldText(boolean fakeBoldText)  //设置粗体文本
 setTextAlign(Paint.Align align)  //设置文本对齐方式,一共有三个值:LEFT(默认)CETNER和RIGHT。
 setTextScaleX(float scaleX)  //设置文本横向收缩,1.0f为原始
 setTextSize(float textSize)  //设置字体大小 
 setLetterSpacing(float letterSpacing);//设置字符间距
 setUnderlineText(boolean underlineText)  //设置下划线  
 setStrikeThruText(boolean flag);//是否加删除线
 setTypeface(Typeface.createFromAsset(getContext().getAssets(), "Satisfy-
                              Regular.ttf")); //设置字体 
 
 //得到TextView的矩形区域
 mBound = new Rect();  
 mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound);              
 mBound.width();//矩形区域的宽
 mBound.height()//矩形区域的高
  
 measureText(String text);//返回text文本的长度
 
 reset(): 恢复Paint所有的默认值,相当与重新New一个
 setPathEffect(PathEffect effect);//设置路径效果
      CornerPathEffect(float ratio):把所有拐角边圆角
      DiscretePathEffect(float ratio):把线条进行随机的偏离,让轮廓变得乱七八糟。乱七八糟的方式和程度由参数决定。
      DashPathEffect:使用虚线来绘制线条。
      PathDashPathEffect:它是使用一个 Path 来绘制「虚线 Path可以是任何形状
      SumPathEffect:就是分别按照两种 PathEffect 分别对目标进行组合绘制。
      ComposePathEffect:它是先对目标 Path 使用一个 PathEffect,然后再对这个改变后的 Path 使用另
                        一个 PathEffect。                             

  1. Path类详解:

     moveTo(float x,float y)移动起点    移动下一次操作的起点位置
     lineTo(float x,float y)连接上一个点到当前点之间的直线
     setLastPoint(float x,float y) 设置终点     重置最后一个点的位置
     close()    闭合路劲    从最后一个点连接最初的一个点,形成一个闭合区域
     rMoveTo,rlineTo,rQuadTo,rCubicTo   rXxx方法  不带r的方法是基于原点坐标系(偏移量),带r的基于       
                                         当前绘制点坐标(偏移量)
     
     addRect(float left, float top, float right, float bottom, Direction dir)添加矩形到当前 
                                                                      Path
     addRoundRect(RectF rect, float rx, float ry, Direction dir)    添加圆角矩形到当前Path
     addOval(float left, float top, float right, float bottom, Direction dir)添加椭圆到当前
                                                                             Path
     
     addCircle(float x,float y,float radius,Direction d)添加圆到当前Path;
            Direction表示画圆的路径 Direction.CW表示顺时针,CCW表示逆时针                                     
     
     addPath    添加路劲到当前Path
     addArc(RectF oval, float startAngle, float sweepAngle)     添加圆弧到当前Path
     arcTo(RectF oval, float startAngle, float sweepAngle,boolean forceMoveTo)  绘制圆弧,
                             forceMoveTo表示是否留下移动的痕迹
                             arcTo和addArc的区别:addArc是forceMoveTo=true的arcTo
                             
     isEmpty()  是否为空    判定Path是否为空
     isRect()   是否为矩形   判定Path是否是一个矩形
     set  替换路劲  用新的路劲替换当前路劲的所有内容
     reset,rewind   重置路劲 清除Path中的内容(reset相当于new Path , rewind 会保留Path的数据结构)
     
     setFillType 设置Path的填充模式
              setFillType(Path.FillType ft)
                  FillType.WINDING  取path所有所在区域 默认值
                  FillType.EVEN_ODD     取path所在并不相交区域
                  FillType.INVERSE_WINDING  取path所有未占区域
                  FillType.INVERSE_EVEN_ODD     取path未占或相交区域
                  
     offset 偏移路劲    对当前的路劲进行偏移
            public void offset(float dx, float dy)
            public void offset(float dx, float dy, Path dst)
            如果dx为正数则向右平移,反之向左平移;如果dy为正则向下平移,反之向上平移
            
     incReserve     提示方法    提示Path还有多少个点等待加入
     computeBounds  计算边界    计算Path的路劲
     
     quadTo     贝塞尔曲线   二次贝塞尔曲线的方法
            public void quadTo(float x1, float y1, float x2, float y2)
            (x1,y1) 为控制点,(x2,y2)为结束点。
            
     cubicTo 贝塞尔曲线  三次贝塞尔曲线的方法
             public void cubicTo(float x1, float y1, float x2, float y2, float x3, float y3);//(x1,y1) 为控制点,(x2,y2)为控制点,(x3,y3) 为结束点。  
  1. Matrix

    Matrix 做常见变换的方式:
    
        1.创建 Matrix 对象;
        2.调用 Matrix 的 pre/postTranslate/Rotate/Scale/Skew() 方法来设置几何变换;
        3.使用 Canvas.setMatrix(matrix) 或 Canvas.concat(matrix) 来把几何变换应用到 Canvas。
  1. Camera三维变换
    旋转:
      camera.save();// 保存 Camera 的状态  
      rorate(x,y,z);
      rotateX(int deg);
      rotateY(int deg);
      rotateZ(int deg);
      applyToCanvas(Canvas canvas);//把Camera的投影应用到Canvas上
      camera.restore();// 恢复 Camera 的状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值