TextView

TextView的常用属性:

  • text:文本内容,在java代码中设置为setText();
  • textSize:文本字体大小,在java代码中设置为setTextSize();
  • textColor:文本颜色,在java代码中设置为setTextColor();
  • textStyle:字体风格,在java代码中设置为setTextStyle();
  • gravity:文字在一行中的位置,在java代码中设置为setGravity();
  • hint:提示文本内容,在java代码中设置为setHint();
  • textColorHint:提示文本颜色,在java代码中设置为setTextColorHint();
  • singleLine:是否单行显示,在java代码中设置为setSingleLine();
  • maxLength:最大字数;
  • maxLines:最大行数;
  • background:背景颜色;
  • shadowColor:阴影颜色;
  • shadowDx:阴影水平位移;
  • shadowDy:阴影垂直位移;
  • shadowRadius:阴影范围;
  • drawableLeft:文本左边显示图片;
  • drawableRight:文本右边显示图片;
  • drawableTop:文本上边显示图片;
  • drawableBottom:文本下边显示图片;
  • drawablePadding:文本和显示的图片之间的距离;
  • textStyle:文本风格;
  • ellipsize:文本的缩略方式;

TextView的常见用法:

  • text:设置文本;
android:text="xxx"
mTextView.setText("xxx")
  • textSize:设置文本字体大小,单位可以是sp、dp、px,默认大小是15px。sp单位会随着设置的系统的字体大小而改变,但是dp单位不会随着系统的字体大小改变,项目中很少会用px作为TextView的单位,不过最终sp和dp都是转换为px单位的;
android:textSize="20sp"
android:textSize="20dp"
android:textSize="20px"
mTextView.setTextSize(float size)
mTextView.setTextSize(int unit,float size)
//其实,setTextSize(float size)方法是调用了setTextSize(TypedValue.COMPLEX_UNIT_SP,float size)这个方法;
//源码如下;
public void setTextSize(float size) {
    setTextSize(TypedValue.COMPLEX_UNIT_SP, size);
}

public void setTextSize(int unit, float size) {
    if (!isAutoSizeEnabled()) {
        setTextSizeInternal(unit, size, true /* shouldRequestLayout */);
    }
}

private void setTextSizeInternal(int unit, float size, boolean shouldRequestLayout) {
    Context c = getContext();
    Resources r;
    if (c == null) {
        r = Resources.getSystem();
    } else {
        r = c.getResources();
    }
    setRawTextSize(TypedValue.applyDimension(unit, size, r.getDisplayMetrics()),shouldRequestLayout);
}

private void setRawTextSize(float size, boolean shouldRequestLayout) {
    if (size != mTextPaint.getTextSize()) {
        mTextPaint.setTextSize(size);
        if (shouldRequestLayout && mLayout != null) {
            // Do not auto-size right after setting the text size.
            mNeedsAutoSizeText = false;
            nullLayouts();
            requestLayout();
            invalidate();
        }
    }
}
  • typeStyle:字体风格
属性 代码 解释
normal android:textStyle="normal"
mTextView.setTypeface(Typeface.xxx,Typeface.NORMAL)
正常
bold android:textStyle=""
mTextView.setTypeface(Typeface.xxx,Typeface.BOLD)
粗体
italic android:textStyle=""
mTextView.setTypeface(Typeface.xxx,Typeface.ITALIC)
斜体
bold|italic android:textStyle="bold|italic"
mTextView.setTypeface(Typeface.xxx,Typeface.BOLD_ITALIC)
粗体同时也是斜体textStyle

没有专门的一个方法来设置textStyle,需要在setTypeface()方法中设置第二个参数来设置;

  • typeface字体类型:系统自带了四种类型的字体:normal、serif、sans和monospace,默认为normal字体;
属性 代码 解释
normal android:typeface="normal"
mTextView.setTypeface(Typeface.DEFAULT)
mTextView.setTypeface(Typeface.DEFAULT,Typeface.xxx)
普通字体
monospace android:typeface="monospace"
mTextView.setTypeface(Typeface.MONOSPACE)
mTextView.setTypeface(Typeface.MONOSPACE,Typeface.xxx)
等宽字体
sans android:typeface="sans"
mTextView.setTypeface(Typeface.SANS_SERIF)
mTextView.setTypeface(Typeface.SANS_SERIF,Typeface.xxx)
非衬线字体
serif android:typeface="serif"
mTextView.setTypeface(Typeface.SERIF)
mTextView.setTypeface(Typeface.SERIF,Typeface.xxx)
衬线字体

Typeface类中的常量:

类型 常量 解释
int Typeface.NORMAL
Typeface.BOLD
Typeface.ITALIC
Typeface.BOLD_ITALIC
textStyle的属性值
Typeface Typeface.DEFAULT
Typeface.DEFAULT_BOLD
Typeface.MONOSPACE
Typeface.SANS_SERIF
Typeface.SERIF
typeface的属性值
//这两行代码所设置的是一样的效果;
mTextViewFontActivityTv8.setTypeface(Typeface.DEFAULT_BOLD, Typeface.NORMAL);
mTextViewFontActivityTv9.setTypeface(Typeface.DEFAULT, Typeface.BOLD);

除了系统的这四种字体,我们还可以使用第三方的字体
(1).在res下的文件夹assets(如果没有就新建文件夹assets)下,新建一个文件夹如fonts,将需要的.ttf字体资源放在fonts文件夹下;

//字体资源文件为11.ttf;
AssetManager assetManager = getAssets();
Typeface typeface = Typeface.createFromAsset(assetManager, "fonts/11.ttf");
mTextView.setTypeface(typeface);

(2).在res下的文件夹assets(如果没有就新建文件夹assets)下,也可以直接把.ttf字体资源放在assets文件夹下;

//字体资源文件为11.ttf;
AssetManager assetManager = getAssets();
Typeface typeface2 = Typeface.createFromAsset(assetManager,"11.ttf");
mTextView.setTypeface(typeface2);

(3).在res下的文件夹font(如果没有就新建文件夹font)下,把.ttf字体文件放在这里,调用的使用使用属性android:fontFamily="@font/xxx"。注意,这里的字体资源文件名字需要开头为字母;

//字体资源文件为a55.ttf;
android:fontFamily="@font/a55"
  • 文本中的链接:比如文本中的手机号码、网址、邮箱的链接的点击跳转;
    1.在xml文件的TextView设置android:autoLink=""这个属性,可取的值有all、phone、web、email、map、none;这样会自动匹配文本中的网址、手机号等,被匹配的文字可以被点击进行相应页面的跳转,比如跳转到打电话页面。
    但是也会有一个问题,就是文本颜色是系统默认的颜色以及被匹配的文字下面会有下划线,以及单击和长按事件的冲突,长按事件会出发单击事件;
    我们可以自己定义一个Span继承自系统的URLSpan,来实现文本颜色,是否有下划线以及点击事件的自定义;其中手机号码自动链接时,会有一个匹配最小长度的数字,我在某些手机上有看到需要至少五个数字才会认为是手机号码。我看了源码,里面是写要大于等于五个数字才会被认为是手机号码,可能不同的手机厂商对此数字长度又有自己的定制吧。
    相应的问题在别人的文章中已经指明了:TextView autoLink小技巧 - 从源码的角度理解并解决autoLink的所有大坑

    实现自动链接,有如下几种方法:
    1.在xml文件中声明android:autoLink=""属性;
    2.在代码中使用TextView的setMovementMethod(LinkMovementMethod.getInstance())方法;
    3.使用Html.fromHtml()方法;
    4.使用SpannableString来实现复杂的文字效果;

    我也跟着在demo中模仿着写了关于autoLink属性的代码,demo地址:https://github.com/loveyoyo/SimpleDemo/blob/master/app/src/main/java/com/kang/demo/widget/TextViewURLSpanActivity.java

  • 旋转的TextView作为右上角标签
    就是使用android:rotation=""这个属性来设置旋转,可能还需要配合android:transformPivotX=""和android:transformPivotY=""这两个属性来进行位置的微调。还需要注意的是旋转的文本的背景色,可以通过相邻的控件进行遮盖就实现了。代码在demo地址:https://github.com/loveyoyo/SimpleDemo/blob/master/app/src/main/java/com/kang/demo/widget/TextViewRotateActivity.java