美文网首页
Android 路径及文字(二)

Android 路径及文字(二)

作者: as_pixar | 来源:发表于2020-06-02 18:00 被阅读0次

    要随时牢记在心中:决心取得成功比任何一件事情都重要。——林肯

    上一篇文章

    在 Android 中,Path 类就代表路径。在 Canvas 中绘制路径的方法如下:

    void drawPath(Path path, Paint paint) 
    

    直线路径

    画一条直线路径,一般涉及下面三个函数。

    void moveTo(float x1, float y1) 
    void lineTo(float x2, float y2) 
    void close() 
    

    (x1,y1)是直线的起始点,即将直线路径的绘制点定在(x1,y1)位置。(x2,y2)是直线的终点,又是下一次绘制直线路径的起始点;lineTo()函数可以一直使用。如果连续画了几条直线,但没有形成闭环,那么调用 close()函数会将路径首尾点连接起来,形成闭环。
    示例:画一个三角形。

    Paint paint=new Paint();
    paint.setColor(Color.RED); //设置画笔颜色
    paint.setStyle(Paint.Style.STROKE); //填充样式改为描边
    paint.setStrokeWidth(5); //设置画笔宽度
    
    Path path = new Path();
    path.moveTo(10, 10); //设定起始点
    path.lineTo(10, 100); //第一条直线的终点,也是第二条直线的起始点
    path.lineTo(300, 100); //画第二条直线
    path.close(); //闭环
    canvas.drawPath(path, paint); 
    

    我们先沿逆时针方向画了两条直线,分别是从(10, 10)到(10, 100)和从(10, 100)到(300,100),然后利用path.close()函数将路径闭合,路径的终点(300,100)就会自行向路径的起始点(10,10)画一条闭合线,所以最终我们看到的是一个路径闭合的三角形。


    矩形路径

    void addRect (float left, float top, float right, float bottom, Path.Direction dir)
    void addRect (RectF rect, Path.Direction dir)
    

    这里Path类创建矩形路径的参数与上篇canvas绘制矩形差不多,唯一不同的一点是增加了Path.Direction参数
    Path.Direction有两个值:
    Path.Direction.CCW:是counter-clockwise缩写,指创建逆时针方向的矩形路径;
    Path.Direction.CW:是clockwise的缩写,指创建顺时针方向的矩形路径;

            //先创建两个大小一样的路径
            //第一个逆向生成
            Path ccwRectPath = new Path();
            RectF rect1 = new RectF(50, 50, 240, 200);
            ccwRectPath.addRect(rect1, Path.Direction.CCW);
    
            //第二个顺向生成
            Path cwRectPath = new Path();
            RectF rectF2 = new RectF(290, 50, 480, 200);
            cwRectPath.addRect(rectF2, Path.Direction.CW);
    
            //先画出这两个路径 
            canvas.drawPath(ccwRectPath, paint);
            canvas.drawPath(cwRectPath, paint);
    

    那生成方式有什么区别呢?
    依据生成方向排版的文字!文字是可以依据路径排版的,文字的行走方向就是依据路径的生成方向。

            //先创建两个大小一样的路径
            //第一个逆向生成
            Path ccwRectPath = new Path();
            RectF rect1 = new RectF(50, 50, 240, 200);
            ccwRectPath.addRect(rect1, Path.Direction.CCW);
    
            //第二个顺向生成
            Path cwRectPath = new Path();
            RectF rectF2 = new RectF(290, 50, 480, 200);
            cwRectPath.addRect(rectF2, Path.Direction.CW);
    
            //先画出这两个路径 
            canvas.drawPath(ccwRectPath, paint);
            canvas.drawPath(cwRectPath, paint);
    
    
            //依据路径写出文字
            String text = "锲而舍之,朽木不折";
            paint.setColor(Color.GRAY);
            paint.setTextSize(34);
            canvas.drawTextOnPath(text, ccwRectPath, 0, 20, paint);
            canvas.drawTextOnPath(text, cwRectPath, 0, 20, paint);
    

    圆角矩形路径

    void addRoundRect (RectF rect, float[] radii, Path.Direction dir)
    void addRoundRect (RectF rect, float rx, float ry, Path.Direction dir)
    

    第一个构造函数:可以定制每个角的圆角大小:
    float[] radii:必须传入8个数值,分四组,分别对应每个角所使用的椭圆的横轴半径和纵轴半径,如{x1,y1,x2,y2,x3,y3,x4,y4},其中,x1,y1对应第一个角的(左上角)用来产生圆角的椭圆的横轴半径和纵轴半径,其它类推……
    第二个构造函数:只能构建统一圆角大小
    float rx:所产生圆角的椭圆的横轴半径;
    float ry:所产生圆角的椭圆的纵轴半径;

    Path path = new Path();
    RectF rect1 =  new RectF(50, 50, 240, 200);
    path.addRoundRect(rect1, 10, 15 , Direction.CCW);
     
    RectF rect2 =  new RectF(290, 50, 480, 200);
    float radii[] ={10,15,20,25,30,35,40,45};
    path.addRoundRect(rect2, radii, Direction.CCW);
     
    canvas.drawPath(path, paint);
    

    圆形路径

    void addCircle (float x, float y, float radius, Path.Direction dir)
    

    float x:圆心X轴坐标
    float y:圆心Y轴坐标
    float radius:圆半径

           //圆形路径
            Path path = new Path();
            path.addCircle(200, 200, 100, Path.Direction.CCW);
            canvas.drawPath(path, paint);
    

    椭圆路径

    void addOval (RectF oval, Path.Direction dir)    //生成椭圆所对应的矩形
    
            //椭圆矩形
            Path path = new Path();
            RectF rectF = new RectF(50, 50, 240, 200);
            path.addOval(rectF, Path.Direction.CCW);
            canvas.drawPath(path, paint);
    

    弧形路径

    void addArc (RectF oval, float startAngle, float sweepAngle)
    RectF oval:弧是椭圆的一部分,这个参数就是生成椭圆所对应的矩形;
    float startAngle:开始的角度,X轴正方向为0度
    float sweepAngel:持续的度数;
    
            //弧形路径
            Path path = new Path();
            RectF rect = new RectF(50, 50, 240, 200);
            path.addArc(rect, 0, 120);
    
            canvas.drawPath(path, paint);//画出路径
    

    文字样式设置及倾斜度正负区别

            Paint paint = new Paint();
            paint.setColor(Color.RED);  //设置画笔颜色
    
            paint.setStrokeWidth(5);//设置画笔宽度
            paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
            paint.setTextSize(40);//设置文字大小
            paint.setStyle(Paint.Style.FILL);//绘图样式,设置为填充
    
            //样式设置
            paint.setFakeBoldText(false);//设置是否为粗体文字
            paint.setUnderlineText(true);//设置下划线
            paint.setStrikeThruText(true);//设置带有删除线效果
    
            //设置字体水平倾斜度,普通斜体字是-0.25,可见往右斜
            paint.setTextSkewX((float) -0.25);
            canvas.drawText("乐观的人在每个危机里看到机会", 10, 100, paint);
    
            //水平倾斜度设置为:0.25,往左斜
            paint.setTextSkewX((float) 0.25);
            canvas.drawText("悲观的人在每个机会里看见危机", 10, 200, paint);
    

    水平字体拉伸设置

    写三行字,第一行,水平未拉伸的字体;第二行,水平拉伸两倍的字体;第三行,水平未拉伸和水平拉伸两部的字体写在一起,可以发现,仅是水平方向拉伸,高度并未改变;

            Paint paint = new Paint();
            paint.setColor(Color.RED);  //设置画笔颜色
    
            paint.setStrokeWidth(5);//设置画笔宽度
            paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
            paint.setTextSize(60);//设置文字大小
            paint.setStyle(Paint.Style.FILL);//绘图样式,设置为填充
    
            //变通样式字体
            canvas.drawText("欢迎光临", 10, 100, paint);
    
            //水平方向拉伸两倍
            paint.setTextScaleX(2);//只会将水平方向拉伸,高度不会变
            canvas.drawText("欢迎光临", 10, 200, paint);
    
            //写在同一位置,不同颜色,看下高度是否看的不变
            paint.setTextScaleX(1);//先还原拉伸效果
            canvas.drawText("欢迎光临", 10, 300, paint);
    
            paint.setColor(Color.GREEN);
            paint.setTextScaleX(2);//重新设置拉伸效果
            canvas.drawText("欢迎光临", 10, 300, paint);
    

    指定每个文字位置绘制

    void drawPosText (char[] text, int index, int count, float[] pos, Paint paint) //第一个构造函数:实现截取一部分文字绘制;
    void drawPosText (String text, float[] pos, Paint paint)
    

    char[] text:要绘制的文字数组
    int index::第一个要绘制的文字的索引
    int count:要绘制的文字的个数,用来算最后一个文字的位置,从第一个绘制的文字开始算起
    float[] pos:每个字体的位置,同样两两一组,如{x1,y1,x2,y2,x3,y3……}

            Paint paint = new Paint();
            paint.setColor(Color.RED);  //设置画笔颜色
    
            paint.setStrokeWidth(5);//设置画笔宽度
            paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
            paint.setTextSize(70);//设置文字大小
            paint.setStyle(Paint.Style.FILL);//绘图样式,设置为填充
            float[] pos = {50, 100, 50, 200, 50, 300, 50, 400};
            canvas.drawPosText("欢迎光临", pos, paint);
    

    沿路径绘制文本

    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) //与路径中心的垂直偏移量
    
            Paint paint = new Paint();
            paint.setColor(Color.RED);  //设置画笔颜色
    
            paint.setStrokeWidth(5);//设置画笔宽度
            paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
            paint.setTextSize(45);//设置文字大小
            paint.setStyle(Paint.Style.STROKE);//绘图样式,设置为填充
    
            String string = "决心取得成功比任何一件事情都重要。";
    
            //先创建两个相同的圆形路径,并先画出两个路径原图
            Path circlePath = new Path();
            circlePath.addCircle(220, 200, 180, Path.Direction.CCW);//逆向绘制
            canvas.drawPath(circlePath, paint);//绘制出路径原形
    
    
            Path circlePath2 = new Path();
            circlePath2.addCircle(320, 700, 180, Path.Direction.CCW);
            //第二个路径,改变hoffset、voffset参数值
            canvas.drawPath(circlePath2, paint);
    
    
            paint.setColor(Color.GREEN);
    
    
            //hoffset、voffset参数值全部设为0,看原始状态是怎样的
            canvas.drawTextOnPath(string, circlePath, 0, 0, paint);
    
            //第二个路径,改变hoffset、voffset参数值
            canvas.drawTextOnPath(string, circlePath2, 100, 50, paint);
    

    字体样式设置(Typeface)

     paint.setTypeface(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变量,Style的枚举值如下:
     Typeface.NORMAL  //正常体
     Typeface.BOLD //粗体
     Typeface.ITALIC //斜体
     Typeface.BOLD_ITALIC //粗斜体
    

    自字义字体

    我们就需要从外部字体文件加载我们所需要的字体的,从外部文件加载字体所使用的Typeface构造函数如下面三个:

     Typeface createFromAsset(AssetManager mgr, String path) //通过从Asset中获取外部字体来显示字体样式
     Typeface createFromFile(String path)//直接从路径创建
     Typeface createFromFile(File path)//从外部路径来创建字体样式
    

    后面两个从路径加载难度不大,用的少,这里我们说说从assets目录中中加载;首先在assets下建一个文件夹,命名为fonts,然后将字体文件jian_luobo.ttf 放入其中

            //自定义字体  迷你简罗卜
            Paint paint = new Paint();
            paint.setColor(Color.RED);  //设置画笔颜色
    
            paint.setStrokeWidth(5);//设置画笔宽度
            paint.setAntiAlias(true); //指定是否使用抗锯齿功能,如果使用,会使绘图速度变慢
            paint.setTextSize(60);//设置文字大小
            paint.setStyle(Paint.Style.FILL);//绘图样式,设置为填充
    
            // 这种方式用的多些
            AssetManager assetManager = getContext().getAssets();//得到AssetManager
            Typeface typeface = Typeface.createFromAsset(assetManager, "fonts/jian_luobo.ttf");//根据路径得到Typeface
            paint.setTypeface(typeface);
            Log.v("msg", typeface.toString());
            canvas.drawText("欢迎光临", 10, 100, paint);//两个构造函数
    

    恭喜你这篇博客学习完成了,下一篇文章

    相关文章

      网友评论

          本文标题:Android 路径及文字(二)

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