自定义view之Text文本

           慢慢的开始接触自定义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);

好了,其实自己敲一遍很快的,源码就不贴出来了,很简单的,继承textview,然后重写ondraw方法就可以了。最后把效果图贴出来:
自定义view之Text文本_第1张图片






 
  





你可能感兴趣的:(Android控件学习)