慢慢的开始接触自定义view了,刚开始接触有很多基础是需要整理一下的,比如说Paint的用法,有多少?cavans又有多少方法?如何自定义viewgroup?等等,所以需要一点点开始,今天先记录一下Paint的一些关于文本的用法。
自定义view其实和盖房子一样的道理,首先你需要确定绘制什么样的view,也就是你想盖什么样的房子,是平房还是洋楼,也就是定样,然后你要确定在屏幕的那个位置绘制你的view,对于盖房子就是你要在哪里盖,是北京还是上海,也就是定位,这个都确定好了,你就要开始绘制你的view,开始盖你的美丽房子了,也就是定型。那么在view中的方法中,onMeasure()方法就是开始确定尺寸大小,onLayout()确定位置(子view的位置),onDraw()就是定型了。所以以上三个方法最重要了。
今天由于刚开始接触,所以自定义view不是继承View,而是继承自TextView,这样我们就可以直接定型了,而暂时忽略掉定位。
1.Paint 的一些常规设置以及含义(没什么好解释的,自己敲一遍代码就都理解了)
mPaint = new Paint();
mPaint.setColor(Color.GREEN);//设置画笔的颜色
mPaint.setAntiAlias(true);//设置抗锯齿,否则斜线等会有锯齿
mPaint.setStyle(Paint.Style.STROKE);//Paint.Style.FILL 填充内部 Paint.Style.FILL_AND_STROKE 填充内部并描边(和前一个没有什么区别) Paint.Style.STROKE描边
详解 http://blog.csdn.net/harvic880925/article/details/38875149
mPaint.setAlpha(100);//这只透明度 0到255
mPaint.setARGB(12, 23, 44, 66);//设置颜色,A透明度 R红色 G绿色 B蓝色
mPaint.setStrokeWidth(100);//设置画笔的宽度
mPaint.reset();//画笔重置
2.Paint中与文本有关的一些设置方法
mPaint.setLinearText(true);//设置文本缓存,如果设置为true就不进行缓存(不知有乱用)
mPaint.setFakeBoldText(true);//设置字体是否加粗,textview中有对应的属性
mPaint.setSubpixelText(true);//设置亚像素,可以让文字更加清晰明显,对文本设置的一种优化
mPaint.setUnderlineText(true);//文字是否设置下划线
mPaint.setStrikeThruText(true);//设置文字删除线
mPaint.setLetterSpacing(10); //设置行间距,默认为0
mPaint.setShadowLayer(10, 10, 10, Color.GREEN);//设置字体阴影效果 参数依次为阴影倾斜度 水平位移 垂直位移 阴影颜色
mPaint.setTextAlign(Paint.Align.RIGHT);//设置文字对齐方式 Paint.Align.LEFT左对齐 Paint.Align.RIGHT 右对齐 还有居中显示
Typeface t = Typeface.create(Typeface.SANS_SERIF, Typeface.BOLD);//Typeface.BOLD 粗体 Typeface.BOLD_ITALIC 粗斜体 Typeface.ITALIC 斜体 Typeface.NORMAL 常规 详见:http://blog.csdn.net/ljb_blog/article/details/10150871
mPaint.setTypeface(t);//设置字体 Typeface.DEFAULT 常规字体类型 Typeface.DEFAULT_BOLD 黑体字体类型 Typeface.MONOSPACE 等宽字体类型 Typeface.SANS_SERIF sans serif字体类型 Typeface.SERIF serif字体类型
mPaint.setTextLocale(Locale.getDefault());//设置地理位置,这里如果你要使用,直接传入Locale.getDefault()即可。它用来设置文本的区域比如中文、日文等。
mPaint.setTextScaleX(1);//将文本沿X轴水平缩放,默认值为1,当值大于1会沿X轴水平放大文本,当值小于1会沿X轴水平缩放文本
mPaint.setTextSize(20);//设置字体大小
mPaint.setTextSkewX(20);//设置字体在水平方向的倾斜官方建议为0到25,如果为负数则为向右倾斜
float aaaa = mPaint.measureText("aaaa", 0, 1);//获取字符串的宽度
mPaint.getTextBounds("0000", 0, 3, new Rect());//获取字符串的宽高信息,具体信息存放在rect矩形中
mPaint.breakText("aaaaaaaaaaaa", 0, 10, true, 100, null);//剪切显示,就是大于maxWidth的时候只截取指定长度的显示,[code]text 表示我们的字符串;start 表示从第几个字符串开始测量;end 表示从测量到第几个字符串为止;measureForwards 表示向前还是向后测量;
// maxWidth 表示一个给定的最大宽度在这个宽度内能测量出几个字符;measuredWidth 为一个可选项,可以为空,不为空时返回真实的测量值
mPaint.ascent();//返回上坡度的值
mPaint.descent();//返回下坡度的值
3.具体每种效果实际中应用如下:
3.1)介绍canvas中的方法drawText()
//设置画笔的样式 fill为填充 stroke为空心
mPaint.setStyle(Paint.Style.FILL);
//设置画笔的颜色
mPaint.setColor(Color.GREEN);
//设置填充的宽度
mPaint.setStrokeWidth(1);
//设置是否抗锯齿
mPaint.setAntiAlias(true);
//设置字体的大小 需要将sp单位转为px
mPaint.setTextSize(DensityUtils.sp2px(getContext(),25));
char[] c=new char[]{'我','回','家'};
//参数含义:字符串 开始 长度 左下角x y坐标 画笔
// canvas.drawText(char[] text, int index, int count, float x, float y, @NonNull Paint paint);
Rect charBound=new Rect();
mPaint.getTextBounds(c,0,c.length,charBound);
height=charBound.height();
canvas.drawText(c,0,3,0,height,mPaint);
//参数含义: 文本 左下角坐标x y 画笔 (文本的绘制比较特殊,图形绘制是从左上角开始计算绘制的,但是文本的绘制基准点为左下角)
// canvas.drawText( String text, float x, float y, @NonNull Paint paint);
String s="最简单的一个文本";
Rect bounds=new Rect();
mPaint.setColor(Color.BLUE);
mPaint.getTextBounds(s,0,s.length(),bounds);//得到绘制文本的边界
height+=bounds.height()+10;
canvas.drawText(s,0,height,mPaint);
//参数含义:文本 从第几个开始 到哪个结束 左下角坐标x y 画笔
// canvas.drawText(String text, int start, int end, float x, float y, Paint paint);
// canvas.drawText(CharSequence text, int start, int end, float x, float y,Paint paint)
mPaint.setColor(Color.BLACK);
Rect subTextBound=new Rect();
mPaint.getTextBounds(s,1,s.length(),subTextBound);
height+=subTextBound.height()+10;
canvas.drawText(s,1,s.length(),0,height,mPaint);
3.2)改变画笔的填充效果
s="空心文本";
mPaint.setStyle(Paint.Style.STROKE);
height+=subTextBound.height()+10;
canvas.drawText(s,20,height,mPaint);
3.3)设置字体为倾斜 参数值为正数时表示向左倾斜,负数为向右倾斜,参数值不必太大
s="倾斜的文字";
mPaint.setTextSkewX((float) -0.2);
mPaint.setStyle(Paint.Style.FILL);
mPaint.setColor(Color.GRAY);
height+=subTextBound.height()+10;
canvas.drawText(s,20,height,mPaint);
3.4)设置透明度 参数值为0到255 参数值越小越透明 并且此方法必须在设置颜色后面调用否则无效
s="设置一定的透明度";
mPaint.setColor(Color.GREEN);
mPaint.setAlpha(100);
mPaint.setTextSkewX(0);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.5)文本加粗显示,默认为不加粗
s="加粗文本";
mPaint.setAlpha(255);
mPaint.setFakeBoldText(true);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.6)设置文本亚像素,字体更清晰,优化(不过没什么可以看到的效果)
s="设置亚像素,字体更清晰";
mPaint.setFakeBoldText(false);
mPaint.setSubpixelText(true);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.7)设置下划线
s="设置下划线";
mPaint.setSubpixelText(false);
mPaint.setUnderlineText(true);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.8)设置对齐方式,默认为左对齐,还有居中对齐和右对齐,注意设置对齐方式后左下角文本开始的坐标
s="改变对齐的方式";
mPaint.setUnderlineText(false);
mPaint.setTextAlign(Paint.Align.CENTER);
height+=subTextBound.height()+10;
canvas.drawText(s,subTextBound.width()/2,height,mPaint);//注意这里改变了绘制起点
3.9)记录文本的位置信息,主要可以获取国家 语言等信息
s="记录位置信息";
mPaint.setTextAlign(Paint.Align.LEFT);
mPaint.setTextLocale(Locale.getDefault());
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
Locale textLocale = this.getTextLocale();
Log.e("TAG", "onDraw: " + textLocale.getLanguage());
3.10)字体的横向缩放 参数值0-1表示字体缩小 1表示正常 大于1表示方法
s="字体横向缩放";
mPaint.setTextScaleX((float) 1.5);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.11)设置删除线
s="设置删除线";
mPaint.setTextScaleX(1);
mPaint.setStrikeThruText(true);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.12)设置字体间距,参数含义为多少倍字体宽度的间距
s="设置字体间距";
mPaint.setStrikeThruText(false);
mPaint.setLetterSpacing((float) 0.5);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.13)设置阴影效果 第一个参数为阴影宽度(半径),值越大越模糊阴影 第二三个参数为偏移量 第四个为颜色值
s="设置阴影效果";
mPaint.setLetterSpacing(0);
mPaint.setShadowLayer(5,15,15,Color.RED);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
3.14)改变字体
s="改变字体";
mPaint.setShadowLayer(0,0,0,Color.GREEN);
mPaint.setTypeface(Typeface.DEFAULT);
height+=subTextBound.height()+10;
canvas.drawText(s,0,height,mPaint);
mPaint.setTypeface(Typeface.DEFAULT_BOLD);//粗体
s="粗体";
canvas.drawText(s,subTextBound.width()/3*2,height,mPaint);