2019日更挑战(三),android-聊聊TextView
2019-01-03 本文已影响35人
Jlanglang
瞎扯
TextView
.个人认为是android开发中用的最频繁的一个控件了.
非常强大,绝不是只简单的显示文字而已.
常见的几种写法,效果:
1.图片加文字的条目
image.png是不是一个控件就搞定了一个条目.
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ff0"
android:drawableLeft="@mipmap/ic_launcher"
android:drawableRight="@drawable/ic_arrow_forward_black_24dp"
android:drawablePadding="8dp"
android:gravity="left"
android:padding="8dp"
android:text="1111111" />
2. 带选择器的,选中效果的
image.png <TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginTop="10dp"
android:background="#0ff"
android:drawableLeft="@drawable/ic_check_circle_black_24dp"
android:drawableRight="@drawable/ic_arrow_forward_black_24dp"
android:drawablePadding="8dp"
android:gravity="center_vertical"
android:enabled="true"
android:padding="8dp"
android:text="22222" />
3.上下结构icon,带省略号:
image.png <TextView
android:layout_width="90dp"
android:layout_height="wrap_content"
android:background="#edf"
android:drawableTop="@drawable/ic_home_black_24dp"
android:drawablePadding="8dp"
android:ellipsize="end"
android:gravity="center"
android:lines="1"
android:padding="8dp"
android:text="3333333333" />
4.能够点击,显示超链接的
image.png <TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:autoLink="all"
android:background="#dfe"
android:drawableTop="@mipmap/ic_launcher"
android:drawablePadding="8dp"
android:gravity="center"
android:lines="1"
android:padding="8dp"
android:text="http://www.baidu.com " />
5.展示多行的
image.png <RelativeLayout
android:layout_marginTop="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/tv_4"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="#dfe"
android:drawableTop="@mipmap/ic_launcher"
android:drawablePadding="8dp"
android:gravity="left"
android:padding="8dp"
android:text="444\n44444444" />
<TextView
android:layout_marginLeft="8dp"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_toRightOf="@+id/tv_4"
android:background="#dfe"
android:drawableLeft="@mipmap/ic_launcher"
android:drawablePadding="8dp"
android:padding="8dp"
android:text="555\n55555\n55555555555\n555555555555555" />
</RelativeLayout>
是不是很强大.但TextView
并不是没有缺点
实际写起来你就会发现.不能控制icon的大小.
不过这没什么,git上有可以控制drawable大小的自定义TextView.
支持html格式解析.
这也是TextView的一大亮点
Html.ImageGetter imgGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
//这里加载图片资源.
return drawable;
}
};
Spanned text = Html.fromHtml(htmlStr, imgGetter, null);
textView.setText(text);
然后就可以愉快的图文混排了.
当然,webview
也是可以做到的.而且不用操作图片加载的问题.这个就看个人选择了.
强大的Spanned
这个东西非常厉害,为啥厉害呢?
看个效果图,就拿简书的来说
image.png
如果是新手,写这个.肯定是
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
我相信肯定,肯定有人会这样写,然后调大小,调边距....然后如果很多地方都有这种
就每个xmlcopy,copy.
实际上呢.
这个效果只需要一个TextView就足够了.
然后再写个工厂,生成一下.不管哪里用到都一行代码搞定.
如下:
image.png
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
parseText((TextView) findViewById(R.id.tv_6), "哈哈", "0.173", 11, 22, 33);
}
public void parseText(TextView textView, String name, String str0, int str1, int str2, int str3) {
float textSize = textView.getTextSize();
String text = "#1" + str0 + "\t" + name + "\t#2" + str1 + "\t#3" + str2 + "\t#4" + str3;
SpannableStringBuilder spannableBuilder = new SpannableStringBuilder(text);
Resources resources = getResources();
//添加钻石图标
int i = text.indexOf("#1");//这个#1,相当于一个占位符
int iLength = "#1".length();//拿到占位符的长度.
ImageSpan star = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_star_black_24dp));
//这里就是把对应的#1占位符替换成icon图标
//需要4个参数,ImageSpan,替换的起点,终点,替换模式.
spannableBuilder.setSpan(star, i, i + iLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//设置红色
spannableBuilder.setSpan(new ForegroundColorSpan(resources.getColor(R.color.colorAccent)), i + iLength,
str0.length() + i + iLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
//添加眼睛图标及数量
int i2 = text.indexOf("#2");
ImageSpan eye = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_remove_red_eye_black_24dp));
spannableBuilder.setSpan(eye, i2, i2 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//添加评论图标及数量
int i3 = text.indexOf("#3");
ImageSpan sms = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_sms_black_24dp));
spannableBuilder.setSpan(sms, i3, i3 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//添加心图标及数量
int i4 = text.indexOf("#4");
ImageSpan favorite = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_favorite_black_24dp));
spannableBuilder.setSpan(favorite, i4, i4 + 2, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
textView.setText(spannableBuilder);
}
@NonNull
private ImageSpan getImageSpan(int textSize, Drawable drawable) {
drawable.setBounds(0, 0, textSize, textSize);
return new CenterAlignImageSpan(drawable);
}
}
居中显示的ImageSpan
/**
* 居中显示的ImageSpan
**/
public class CenterAlignImageSpan extends ImageSpan {
public CenterAlignImageSpan(Drawable drawable) {
super(drawable);
}
public CenterAlignImageSpan(Bitmap b) {
super(b);
}
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) {
Drawable b = this.getDrawable();
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;
canvas.save();
canvas.translate(x, (float) transY);
b.draw(canvas);
canvas.restore();
}
}
看起来很麻烦.对不对.封装一下.就很简单了
日更第三天,就这样吧
您的喜欢与回复是我最大的动力-_-
交流群:493180098