Canvas---文字的绘制

文字

1.与Paint相关的设置

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

//样式设置  
paint.setFakeBoldText(true);//设置是否为粗体文字  
paint.setUnderlineText(true);//设置下划线  
paint.setTextSkewX((float) -0.25);//设置字体水平倾斜度,普通斜体字是-0.25  
paint.setStrikeThruText(true);//设置带有删除线效果  

//其它设置  
paint.setTextScaleX(2);//只会将水平方向拉伸,高度不会变  

下面是一些常见的效果:

1.绘图方式的区别:

  Paint paint1=new Paint();
        paint1.setStrokeWidth(5);
        paint1.setColor(Color.RED);
        paint1.setTextSize(80);
        paint1.setStyle(Paint.Style.STROKE);
        String msg="你说你有点难追";
        canvas.drawText(msg,50,100,paint1);
        paint1.setStyle(Paint.Style.FILL);
        canvas.drawText(msg,50,200,paint1);
        paint1.setStyle(Paint.Style.FILL_AND_STROKE);
        canvas.drawText(msg,50,300,paint1);

2.文字样式的设置以及正负倾斜区别

 paint1.setStyle(Paint.Style.FILL);

        //文字样式设置
        paint1.setUnderlineText(true);  //下划线
        paint1.setStrikeThruText(true);  //删除
        paint1.setFakeBoldText(true); //粗体


        //设置字体水平倾斜度,普通斜体字是-0.25,可见往左斜
        paint1.setTextSkewX((float)-0.25);
        canvas.drawText(msg,50,400,paint1);

        //设置字体水平倾斜度,普通斜体字是0.25,可见往右斜
        paint1.setTextSkewX((float)0.25);
        canvas.drawText(msg,50,500,paint1);

3.水平拉伸设置

//文字拉伸样式设置

        //未变字体
        canvas.drawText(msg,50,600,paint1);

        //在x轴方向拉伸
        paint1.setTextScaleX(2);
        canvas.drawText(msg,50,700,paint1);

        //重置字体
        paint1.setTextScaleX(1);
        canvas.drawText(msg,50,800,paint1);

        //在相同的位置换一种颜色显示字体  看看在x轴拉伸之后,是否会变形
        paint1.setTextScaleX(2);
        paint1.setColor(Color.YELLOW);
        canvas.drawText(msg,50,800,paint1);

看一下上述操作的效果:
这里写图片描述

Canvas绘图方式

1.普通水平绘制

void drawText (String text, float x, float y, Paint paint)
void drawText (CharSequence text, int start, int end, 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)

这里,需要注意的就是:charSequence是可以利用spannableString来构造有图片的字符串的,那这里是不是可以画出带有图片的字符串来呢 ,实际证明,canvas画图是不支持Span替换的。所以这里的charSequence跟普通的String没有任何区别的。

 //绘制文字 char[]方式:字符数组、开始位置、长度、开始显示的横坐标、纵坐标、绘图的画笔
        char c[]={'K','o','b','e','B','r','y','a','n','t'};
        canvas.drawText(c,0,c.length,400,50,mPaint);

        //绘制文字
        //1.从某个位置显示指定长度的子字符串
        String msg="Kobe Bryant";
        canvas.drawText(msg,0,4,400,120,mPaint);

        //2.显示整个字符串
        String msg2="James";
        canvas.drawText(msg2,400,200,mPaint);

        //只要是实现CharSequence接口的类,都可以使用下面的方式绘制字符串
        StringBuffer sb=new StringBuffer();
        sb.append("Kobe");
        sb.append(" James");
        canvas.drawText(sb,0,sb.length(),400,300,mPaint);

        StringBuilder sb2=new StringBuilder();
        sb2.append("Jorden");
        sb2.append(" Malon");
        canvas.drawText(sb2,0,sb2.length(),400,400,mPaint);

2.指定每个文字的位置

void drawPosText (char[] text, int index, int count, float[] pos, Paint paint)
void drawPosText (String text, float[] pos, Paint paint)
        float []pt={50,900,50,1000,50,1100,50,1200};
        float []ptt={150,900,150,1000,150,1100,150,1200};
        canvas.drawPosText("我要快乐",pt,paint1);

        char []c={'我','要','快','乐'};
        canvas.drawPosText(c,0,4,ptt,paint1);

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这两个形参
hOffset:与路径起始点的偏移量
vOffset:与路径中心的垂直偏移量

   Path circlePath=new Path();
        Path circlePath2=new Path();
        circlePath.addCircle(500,1400,200, Path.Direction.CCW);
        circlePath2.addCircle(800,1400,200, Path.Direction.CCW);

        String msg2="你说你有点难追";

        canvas.drawPath(circlePath,paint1);
        canvas.drawPath(circlePath2,paint1);

        canvas.drawTextOnPath(msg2,circlePath,0,0,paint1);
        canvas.drawTextOnPath(msg2,circlePath2,30,30,paint1);

下一下效果:
这里写图片描述

字体样式设置
在paint中设置字体的方式:paint.setTypeface(typeface)
可以指定系统的字体样式,也可以从指定的自定义的样式文件中获取。

创建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)//创建默认字体

1.使用系统字体

使用系统自带的字体有如下两种方式:

Typeface    defaultFromStyle(int style)//创建默认字体
 Typeface   create(String familyName, int style) //直接通过指定字体名来加载系统中自带的文字样式
 //使用defaultFromStyle这种方式
        Typeface f1=Typeface.defaultFromStyle(Typeface.BOLD);
        paint.setTypeface(f1);
        canvas.drawText("I love you",50,100,paint);

        //android系统默认支持三种字体,分别为:“sans”,“serif”,“monospace”。
        Typeface f2=Typeface.create("monospace",Typeface.NORMAL);
        paint.setTypeface(f2);
        canvas.drawText("I love you",50,200,paint);

2.自定义字体

自定义字体就是从外部文件中加载需要的字体,有如下3个构造函数:

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

一般都都是从asset下加载自定义字体文件,首先在Asset下建一个文件夹,命名为Fonts,然后将字体文件jian_luobo.ttf 放入其中。

//使用外部的自定义的字体
        AssetManager mgr=context.getAssets();//得到AssetManager
        Typeface typeface=Typeface.createFromAsset(mgr, "font/jian_luobo.ttf");//根据路径得到Typeface
        paint.setTypeface(typeface);
        canvas.drawText("菜鸟的Android",50,300, paint);//两个构造函数

效果图如下:
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来为您讲解canvas绘制立体文字(2)的实现方法。 首先,我们需要在HTML中创建一个canvas元素,并设置其宽高,如下所示: ```html <canvas id="myCanvas" width="600" height="400"></canvas> ``` 然后,我们需要在JavaScript中获取到这个canvas元素,并获取其2D绘图上下文对象,代码如下: ```javascript const canvas = document.getElementById('myCanvas'); const ctx = canvas.getContext('2d'); ``` 接下来,我们定义绘制立体文字的函数,代码如下: ```javascript function drawText(text, x, y, depth, angle) { // 设置字体样式 ctx.font = 'bold 80px Arial'; // 计算文字在x、y方向上的偏移量 const xOffset = Math.cos(angle) * depth; const yOffset = Math.sin(angle) * depth; // 绘制底部文字 ctx.fillStyle = 'rgba(0, 0, 0, 0.2)'; ctx.fillText(text, x + xOffset, y + yOffset); // 绘制顶部文字 ctx.fillStyle = '#fff'; ctx.fillText(text, x - xOffset, y - yOffset); } ``` 该函数接受5个参数: - `text`:要绘制文字内容; - `x`:文字的x坐标; - `y`:文字的y坐标; - `depth`:文字的深度,即立体效果的大小; - `angle`:文字倾斜的角度。 我们先使用`ctx.font`设置字体样式,然后根据深度和角度计算出文字在x、y方向上的偏移量。 接着,我们先绘制底部文字,填充颜色为半透明的黑色,然后再绘制顶部文字,填充颜色为白色。 最后,我们在页面加载完成后调用该函数,传入相应的参数进行绘制,如下所示: ```javascript window.onload = function() { drawText('立体文字', 200, 200, 30, Math.PI / 4); }; ``` 运行代码,即可在canvas绘制出立体效果的文字。效果如下图所示: ![canvas绘制立体文字(2)](https://img-blog.csdnimg.cn/20210730165541198.png)

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值