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