主要有以下几种样式:
1、带有阴影的TextView。
2、带有边框的TextView。(捎带做一个带有边框的EditText)
3、带有图标的TextView。
4、带有autoLink的TextView。(比如,链接百度等)
5、解析HTML标签的TextView。
6、解析SpannableString的TextView。(部分字体颜色、大小等变化)
7、带有跑马灯效果的TextView。
效果图如下:
activity_main.xml的代码如下:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:id="@+id/main_lLayoutMain"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
xmlns:android="http://schemas.android.com/apk/res/android">
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="vertical">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/main_tvWithShadow"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="带有阴影的TextView"
android:textColor="@color/colorPrimaryDark"
android:textSize="16dp"
android:textStyle="bold"
android:shadowColor="@color/colorAccent"
android:shadowDx="5"
android:shadowDy="5"
android:shadowRadius="3"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/main_tvWithBorder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="normal"
android:textSize="16dp"
android:text="带有边框的TextView"
android:background="@drawable/style_textview_border"
android:layout_margin="10dp"/>
<EditText
android:id="@+id/main_etWithBorder"
android:layout_width="match_parent"
android:layout_height="30dp"
android:textStyle="normal"
android:textSize="14dp"
android:singleLine="true"
android:hint="带有边框的EditText"
android:background="@drawable/style_textview_border"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/main_tvWithIcon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="normal"
android:gravity="center_horizontal"
android:textSize="12dp"
android:text="收藏"
android:padding="5dp"
android:drawableTop="@mipmap/collect"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/main_tvWithLink"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="normal"
android:gravity="center_horizontal"
android:textSize="16dp"
android:text="http://www.baidu.com"
android:autoLink="web"
android:layout_margin="10dp"/>
<TextView
android:id="@+id/main_tvWithHTML"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="normal"
android:textSize="16dp"
android:gravity="center_horizontal"
android:text="html"
android:layout_margin="10dp"/>
<!--android:lineSpacingExtra:设置行间距-->
<TextView
android:id="@+id/main_tvWithSpannableString"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textStyle="normal"
android:textSize="16dp"
android:text=""
android:lineSpacingExtra="10dp"
android:layout_margin="10dp"/>
<!-- android:ellipsize=”marquee”–以横向滚动方式显示(需获得当前焦点时) "start":省略号显示在开头 -->
<TextView
android:id="@+id/main_tvWithRuning"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textStyle="normal"
android:textSize="16dp"
android:text="这是一个跑马灯效果的TextView这是一个跑马灯效果的TextView这是一个跑马灯效果的TextView这是一个跑马灯效果的TextView这是一个跑马灯效果的TextView"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:layout_margin="10dp"/>
</LinearLayout>
</ScrollView>
</LinearLayout>
style_textview_border.xml 边框样式如下(改变组件外观固定样式的话,用shape):
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<!--设置背景颜色-->
<solid android:color="@color/color_white" />
<!--这个是设置边框的粗细,以及边框颜色的-->
<stroke android:width="1dp" android:color="@color/color_black" />
<!--这个是设置边距的-->
<padding
android:bottom="5dp"
android:left="5dp"
android:right="5dp"
android:top="5dp" />
<!-- 设置四个圆角的半径 -->
<corners
android:bottomLeftRadius="10px"
android:bottomRightRadius="10px"
android:topLeftRadius="10px"
android:topRightRadius="10px" />
<!-- 渐变 -->
<!--这个是设置渐变色的,可选属性有: startColor:起始颜色 endColor:结束颜色 centerColor:中间颜色
angle:方向角度,等于0时,从左到右,然后逆时针方向转,当angle = 90度时从下往上 type:设置渐变的类型-->
<gradient
android:angle="270"
android:endColor="#C0C0C0"
android:startColor="#FCD209"
android:type="linear"/>
</shape>
MainActivity.java的代码如下:
package com.deepreality.textviewdemo;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import java.lang.reflect.Field;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EditText editText = findViewById(R.id.main_etWithBorder);
editText.setFocusable(false);
/*//手动设置带有图标的图标大小
TextView tvWithIcon = (TextView) findViewById(R.id.main_tvWithIcon);
Drawable[] drawable = tvWithIcon.getCompoundDrawables();
// 数组下表0~3,依次是:左上右下
drawable[1].setBounds(100, 0, 200, 200);
tvWithIcon.setCompoundDrawables(null, drawable[1], null,
null);*/
//以下代码实现带有HTML标签的解析
//<font>:设置颜色和字体。
//<big>:设置字体大号
//<small>:设置字体小号
//<i><b>:斜体粗体
//<a>:连接网址
//<img>:图片
TextView tvWithHTML = findViewById(R.id.main_tvWithHTML);
String htmlWithImg = "<font color='blue'><b>百度一下,你就知道~:</b></font><br />图片:<img src = 'collect'/><br>";
//String html = "<font color='blue'><b>百度一下,你就知道~:</b></font><br /><a href = 'http://www.baidu.com'>百度</a>";
//调用Html.fromHtml()方法将字符串转换为CharSequence接口
//tvWithHTML.setText(Html.fromHtml(html));
//tvWithHTML.setMovementMethod(LinkMovementMethod.getInstance());
tvWithHTML.setText(Html.fromHtml(htmlWithImg, imageGetter, null));
TextView tvWithSpannableString = findViewById(R.id.main_tvWithSpannableString);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 20; i++) {
sb.append("好友" + (i + 1) + ",");
}
String likeUsers = sb.substring(0, sb.lastIndexOf(",")).toString();
tvWithSpannableString.setMovementMethod(LinkMovementMethod.getInstance());
tvWithSpannableString.setText(addClickPart(likeUsers), TextView.BufferType.SPANNABLE);
}
Html.ImageGetter imageGetter = new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Drawable draw = null;
Field field = null;
try {
field = R.drawable.class.getField(source);
int resourceId = Integer.parseInt(field.get(null).toString());
draw = getResources().getDrawable(resourceId);
draw.setBounds(0, 0, draw.getIntrinsicWidth(), draw.getIntrinsicHeight());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return draw;
}
};
//定义一个点击每个部分文字的处理方法
private SpannableStringBuilder addClickPart(String str) {
//赞的图标,这里没有素材,就找个笑脸代替下~
ImageSpan imgspan = new ImageSpan(MainActivity.this, R.mipmap.collect);
SpannableString spanStr = new SpannableString("p.");
spanStr.setSpan(imgspan, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//创建一个SpannableStringBuilder对象,连接多个字符串
SpannableStringBuilder ssb = new SpannableStringBuilder(spanStr);
ssb.append(str);
String[] likeUsers = str.split(",");
if (likeUsers.length > 0) {
for (int i = 0; i < likeUsers.length; i++) {
final String name = likeUsers[i];
final int start = str.indexOf(name) + spanStr.length();
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, name,
Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
//设置字体颜色,删除下划线
ds.setColor(getResources().getColor(R.color.colorPrimaryDark));
//ds.setUnderlineText(false);
}
}, start, start + name.length(), 0);
}
}
return ssb.append("等" + likeUsers.length + "个人觉得很赞");
}
}