Paint画笔Canvas画布汇总1

作者: Small_Cake | 来源:发表于2019-08-14 18:33 被阅读0次

    1.画笔 Paint

    • paint.setAntiAlias(true);//抗锯齿
    • paint.setColor(Color.RED); //画笔颜色
    • paint.setStyle(Style.FILL);//填充样式
      • Paint.Style.FILL //填充内部
      • Paint.Style.FILL_AND_STROKE //填充内部和描边
      • Paint.Style.STROKE //仅描边
    • paint.setStrokeWidth(3);//画笔宽度
    • paint.setShadowLayer(8, 16, 16, Color.GRAY);//阴影
      • setShadowLayer (float radius, float dx, float dy, int color) 添加阴影
        radius阴影的倾斜度dx水平位移dy垂直位移

    2.画布 Canvas

    • canvas.drawColor(Color.BLUE);//画布背景颜色
    • canvas.drawRGB(255, 255, 0); //画布背景颜色

    用画布画各种几何图形https://blog.csdn.net/harvic880925/article/details/38875149

    • void drawCircle(float cx, float cy, float radius, @NonNull Paint paint)【画圆】
      cx圆心点X轴坐标 cy圆心点Y轴坐标radius圆的半径

    • void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)【画直线】
      设置paint.setStrokeCap(Paint.Cap.ROUND);:画笔为圆头,【画圆角直线】

    • void drawLines (float[] pts, Paint paint)
      void drawLines (float[] pts, int offset, int count, Paint paint)【画多条直线】
      pts:是点的集合,四个点形成一条线,前两个点为画直线起始位置的x,y,后两个点为结束位置的x,y,所以pts应该是个数应该是的倍增数量。

    • void drawPoint (float x, float y, Paint paint)【画点】

    • void drawPoints (float[] pts, Paint paint)
      void drawPoints (float[] pts, int offset, int count, Paint paint)【画多点】
      pts:是点的集合,的倍增数量,offset:集合中跳过的数值个数,注意不是点的个数!一个点是两个数值;count:参与绘制的数值的个数,指pts[]里人数值个数,而不是点的个数,因为一个点是两个数值

    • void drawRect (float left, float top, float right, float bottom, Paint paint)
      void drawRect (RectF rect, Paint paint)
      void drawRect (Rect r, Paint paint)【画矩形】

    //RectF
    RectF()
    RectF(float left, float top, float right, float bottom)
    RectF(RectF r)
    RectF(Rect r)
    //Rect
    Rect()
    Rect(int left, int top, int right, int bottom)
    Rect(Rect r)
    
    • void drawRoundRect (RectF rect, float rx, float ry, Paint paint)【画圆角矩形】
      rx:生成圆角的椭圆的X轴半径ry:生成圆角的椭圆的Y轴半径
    • void drawOval (RectF oval, Paint paint)【画椭圆】
    • void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)【画弧】
      oval:生成椭圆的矩形
      startAngle:弧开始的角度,以X轴正方向为0度
      sweepAngle:弧持续的角度
      useCenter是否有弧的两边,true,有两边,false,只有一条弧
      设置paint.setStrokeCap(Paint.Cap.ROUND);:画笔为圆头,【画圆角弧度】

    3.路径Path

    用画布画路径及文字https://blog.csdn.net/harvic880925/article/details/38926877

    • void drawPath (Path path, Paint paint)【画直线路径】
      Path 方法:
    1.直线路径
    • void moveTo (float x1, float y1):直线的开始点;即将直线路径的绘制点定在(x1,y1)的位置;
    • void lineTo (float x2, float y2):直线的结束点,又是下一次绘制直线路径的开始点;lineTo可以一直用;
    • void close ():如果连续画了几条直线,但没有形成闭环,调用Close()会将路径首尾点连接起来,形成闭环,实验后不调用也可以闭环
    2.矩形路径
    • void addRect (float left, float top, float right, float bottom, Path.Direction dir)
      void addRect (RectF rect, Path.Direction dir)
      Path.Direction.CCW是counter-clockwise缩写,指创建逆时针方向的矩形路径;
      Path.Direction.CW是clockwise的缩写,指创建顺时针方向的矩形路径;
    3.圆角矩形路径
    • void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
      可以定制每个角的圆角大小,radii必须传入8个数值,分四组
    • void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
      只能构建统一圆角大小
    4.圆形路径

    void addCircle (float x, float y, float radius, Path.Direction dir)
    x:圆心X轴坐标
    y:圆心Y轴坐标
    radius:圆半径

    5.椭圆路径

    void addOval (RectF oval, Path.Direction dir)

    6.弧形路径
    • void addArc (RectF oval, float startAngle, float sweepAngle)
      oval:弧是椭圆的一部分,这个参数就是生成椭圆所对应的矩形;
      startAngle:开始的角度,X轴正方向为0度
      sweepAngel:持续的度数;
    7.线段轨迹
    • void quadTo (float x1, float y1, float x2, float y2)
      x1 二次曲线上控制点的X坐标
      y1 二次曲线上控制点的Y坐标
      x2 二次曲线上终点的X坐标
      y2 二次曲线上终点的Y坐标
      lineTo很像,但是它对不是折线的过渡更加平滑,类似于心电图和波纹图的区别,可以理解为赛贝尔曲线。 x1 y1相当于一个牵引力的着力点
      红点为控制点

    4.文字 Paint+Path+Canvas

    画笔Paint的设置

    1.普通设置

    paint.setStrokeWidth (5);//设置画笔宽度
    paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
    paint.setStyle(Paint.Style.FILL);//绘图样式,对于设文字和几何图形都有效
    paint.setTextAlign(Align.CENTER);//设置文字对齐方式,取值:align.CENTERalign.LEFTalign.RIGHT
    paint.setTextSize(12);//设置文字大小

    2.样式设置

    paint.setFakeBoldText(true);//粗体
    paint.setUnderlineText(true);//下划线
    paint.setTextSkewX((float) -0.25);//字体水平倾斜度,普通斜体字是-0.25
    paint.setStrikeThruText(true);//删除线
    paint.setTextScaleX(2);//只会将水平方向拉伸,高度不会变
    paint.setStrokeCap(Paint.Cap.BUTT)//划过的线条和路径

    画布Canvas的绘图方式

    1.普通水平绘制

    void drawText (String text, float x, float y, Paint paint)//常规绘制
    void drawText (String text, int start, int end, float x, float y, Paint paint)//截取文字绘制
    void drawText (char[] text, int index, int count, float x, float y, Paint paint)//截取数组文字绘制
    void drawText (CharSequence text, int start, int end, float x, float y, Paint paint)//多媒体文字绘制,但这里的text并不支持复杂的多媒体文字绘制,只是支持这种类型而已,所以Span创建的特效是没有用的。

    2.指定单个文字位置绘制,由于不支持glyph的合成【已过时】
    • void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
      text要绘制的文字数组
      index第一个要绘制的文字的索引
      count要绘制的文字的个数,用来算最后一个文字的位置,从第一个绘制的文字开始算起
      pos每个字体的位置,同样两两一组,如{x1,y1,x2,y2,x3,y3……}
    • void drawPosText (String text, float[] pos, Paint paint)
    3.沿路径绘制

    void drawTextOnPath (String text, Path path, float hOffset, float vOffset, Paint paint)
    void drawTextOnPath (char[] text, int index, int count, Path path, float hOffset, float vOffset, Paint paint)
    hOffset 与路径起始点的高度偏移距离,为负会导致起始文字重叠
    vOffset 与路径中心的垂直偏移量

    字体样式Typeface在Paint中设置字体样式:paint.setTypeface(typeface);

    1.创建Typeface
    • 使用系统中的字体
      Typeface create(String familyName, int style)//直接通过指定字体名来加载系统中自带的文字样式
      Typeface create(Typeface family, int style) //通过其它Typeface变量来构建文字样式
    • 自字义字体
      Typeface createFromAsset(AssetManager mgr, String path) //通过从Asset中获取外部字体来显示字体样式
      Typeface createFromFile(String path)//直接从路径创建
      Typeface createFromFile(File path)//从外部路径来创建字体样式
      Typeface defaultFromStyle(int style)//创建默认字体
    • style的枚举值如下:
      Typeface.NORMAL //正常体
      Typeface.BOLD //粗体
      Typeface.ITALIC //斜体
      Typeface.BOLD_ITALIC //粗斜体

    5.区域 Range

    参考:https://blog.csdn.net/harvic880925/article/details/39056701

    1、基本构造函数

    public Region() //创建一个空的区域 ,需要配合其它函数使用
    public Region(Region region) //复制一个region的区域
    public Region(Rect r) //创建一个矩形的区域 ,通过矩形
    public Region(int left, int top, int right, int bottom) //创建一个矩形的区域,通过左上右下

    • public Region()创建一个空的区域后,通过下面的操作方法构建一个区域
      public void setEmpty() //置空:从某种意义上讲置空也是一个构造函数,即将原来的一个区域变量变成了一个空变量,要再利用其它的Set方法重新构造区域
      public boolean set(Region region) //利用新的区域值来替换原来的区域
      public boolean set(Rect r) //利用矩形所代表的区域替换原来的区域
      public boolean set(int left, int top, int right, int bottom) //根据左上右下四点构造出矩形区域来替换原来的区域值
      public boolean setPath(Path path, Region clip)//根据路径的区域与某区域的交集,构造出新区域
    2、矩形集枚举区域——RegionIterator类

    由于在Canvas中没有直接绘制Region的函数,我们想要绘制一个区域,就只能通过利用RegionIterator构造矩形集来逼近的显示区域。用法如下

        private void drawRegion(Canvas canvas, Region region, Paint paint) {
            RegionIterator iter = new RegionIterator(region);
            Rect rect = new Rect();
            while (iter.next(rect)) canvas.drawRect(rect, paint);
            //或者其他可以用Rect来绘制的方法:
           //while (iter.next(rect)) canvas.drawOval(new RectF(rect), paint);
        }
    
    drawRect和drawOval
    3、区域的合并、交叉等操作

    public final boolean union(Rect r)
    public boolean op(Rect r, Op op)
    public boolean op(int left, int top, int right, int bottom, Op op)
    public boolean op(Region region, Op op)
    public boolean op(Rect rect, Region region, Op op)

    • Op的参数
      DIFFERENCE(0)//最终区域为region1 与 region2不同的区域
      INTERSECT(1) // 最终区域为region1 与 region2相交的区域
      UNION(2) //最终区域为region1 与 region2组合一起的区域
      XOR(3) //最终区域为region1 与 region2相交之外的区域
      REVERSE_DIFFERENCE(4) //最终区域为region2 与 region1不同的区域
      REPLACE(5) //最终区域为为region2的区域

    例如两个矩形取交集:

            //初始化画笔
            Paint paint = new Paint();
            paint.setColor(Color.RED);
            paint.setStyle(Paint.Style.STROKE);
            paint.setStrokeWidth(2);
            //构造两个矩形
            Rect rect1 = new Rect(100,100,400,200);
            Rect rect2 = new Rect(200,0,300,300);
            //构造两个Region
            Region region = new Region(rect1);
            Region region2= new Region(rect2);
            //取两个区域的交集
            region.op(region2, Region.Op.INTERSECT);
            //绘制两个空的矩形
            canvas.drawRect(rect1, paint);
            canvas.drawRect(rect2, paint);
            //交集用绿色绘制
            Paint paint_fill = new Paint();
            paint_fill.setColor(Color.MAGENTA);
            paint_fill.setStyle(Paint.Style.FILL);
            drawRegion(canvas, region, paint_fill);
    
    两个矩形取交集
    drawRect全部参数展示
    drawOval全部参数展示
    4、其它一些方法
    /**几个判断方法*/  
    public native boolean isEmpty();//判断该区域是否为空  
    public native boolean isRect(); //是否是一个矩阵  
    public native boolean isComplex();//是否是多个矩阵组合  
      
      
    /**一系列的getBound方法,返回一个Region的边界*/  
    public Rect getBounds()   
    public boolean getBounds(Rect r)   
    public Path getBoundaryPath()   
    public boolean getBoundaryPath(Path path)   
      
      
    /**一系列的判断是否包含某点 和是否相交*/  
    public native boolean contains(int x, int y);//是否包含某点  
    public boolean quickContains(Rect r)   //是否包含某矩形
    public native boolean quickContains(int left, int top, int right,  
                                            int bottom) //是否没有包含某矩阵形 
     public boolean quickReject(Rect r) //是否没和该矩形相交  
     public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交  
     public native boolean quickReject(Region rgn);  //是否没和该矩形相交  
      
    /**几个平移变换的方法*/  
    public void translate(int dx, int dy)   
    public native void translate(int dx, int dy, Region dst);  
    public void scale(float scale) //hide  
    public native void scale(float scale, Region dst);//hide  /**几个判断方法*/  
    public native boolean isEmpty();//判断该区域是否为空  
    public native boolean isRect(); //是否是一个矩阵  
    public native boolean isComplex();//是否是多个矩阵组合  
      
      
    /**一系列的getBound方法,返回一个Region的边界*/  
    public Rect getBounds()   
    public boolean getBounds(Rect r)   
    public Path getBoundaryPath()   
    public boolean getBoundaryPath(Path path)   
      
      
    /**一系列的判断是否包含某点 和是否相交*/  
    public native boolean contains(int x, int y);//是否包含某点  
    public boolean quickContains(Rect r)   //是否包含某矩形
    public native boolean quickContains(int left, int top, int right,  
                                            int bottom) //是否没有包含某矩阵形 
     public boolean quickReject(Rect r) //是否没和该矩形相交  
     public native boolean quickReject(int left, int top, int right, int bottom); //是否没和该矩形相交  
     public native boolean quickReject(Region rgn);  //是否没和该矩形相交  
      
    /**几个平移变换的方法*/  
    public void translate(int dx, int dy)   
    public native void translate(int dx, int dy, Region dst);  
    public void scale(float scale) //hide  
    public native void scale(float scale, Region dst);//hide  
    

    相关文章

      网友评论

        本文标题:Paint画笔Canvas画布汇总1

        本文链接:https://www.haomeiwen.com/subject/ptnbjctx.html