主要有以下几种样式:
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 + "个人觉得很赞"); } }