瞎扯
TextView
.個(gè)人認(rèn)為是android開(kāi)發(fā)中用的最頻繁的一個(gè)控件了.
非常強(qiáng)大,絕不是只簡(jiǎn)單的顯示文字而已.
常見(jiàn)的幾種寫(xiě)法,效果:
1.圖片加文字的條目
image.png
是不是一個(gè)控件就搞定了一個(gè)條目.
<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.上下結(jié)構(gòu)icon,帶省略號(hào):
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.能夠點(diǎn)擊,顯示超鏈接的
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>
是不是很強(qiáng)大.但TextView
并不是沒(méi)有缺點(diǎn)
實(shí)際寫(xiě)起來(lái)你就會(huì)發(fā)現(xiàn).不能控制icon的大小.
不過(guò)這沒(méi)什么,git上有可以控制drawable大小的自定義TextView.
支持html格式解析.
這也是TextView的一大亮點(diǎn)
Html.ImageGetter imgGetter = new Html.ImageGetter() {
public Drawable getDrawable(String source) {
//這里加載圖片資源.
return drawable;
}
};
Spanned text = Html.fromHtml(htmlStr, imgGetter, null);
textView.setText(text);
然后就可以愉快的圖文混排了.
當(dāng)然,webview
也是可以做到的.而且不用操作圖片加載的問(wèn)題.這個(gè)就看個(gè)人選擇了.
強(qiáng)大的Spanned
這個(gè)東西非常厲害,為啥厲害呢?
看個(gè)效果圖,就拿簡(jiǎn)書(shū)的來(lái)說(shuō)
image.png
如果是新手,寫(xiě)這個(gè).肯定是
<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>
我相信肯定,肯定有人會(huì)這樣寫(xiě),然后調(diào)大小,調(diào)邊距....然后如果很多地方都有這種
就每個(gè)xmlcopy,copy.
實(shí)際上呢.
這個(gè)效果只需要一個(gè)TextView就足夠了.
然后再寫(xiě)個(gè)工廠,生成一下.不管哪里用到都一行代碼搞定.
如下:
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();
//添加鉆石圖標(biāo)
int i = text.indexOf("#1");//這個(gè)#1,相當(dāng)于一個(gè)占位符
int iLength = "#1".length();//拿到占位符的長(zhǎng)度.
ImageSpan star = getImageSpan((int) textSize, resources.getDrawable(R.drawable.ic_star_black_24dp));
//這里就是把對(duì)應(yīng)的#1占位符替換成icon圖標(biāo)
//需要4個(gè)參數(shù),ImageSpan,替換的起點(diǎn),終點(diǎn),替換模式.
spannableBuilder.setSpan(star, i, i + iLength, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//設(shè)置紅色
spannableBuilder.setSpan(new ForegroundColorSpan(resources.getColor(R.color.colorAccent)), i + iLength,
str0.length() + i + iLength, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
//添加眼睛圖標(biāo)及數(shù)量
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);
//添加評(píng)論圖標(biāo)及數(shù)量
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);
//添加心圖標(biāo)及數(shù)量
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();
}
}
看起來(lái)很麻煩.對(duì)不對(duì).封裝一下.就很簡(jiǎn)單了
交流群:493180098,這是個(gè)很少吹水,交流學(xué)習(xí)的群.