安卓开发中TextView的常见用法(总结)

主要有以下几种样式:

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 + "个人觉得很赞");
    }
}

猜你喜欢

转载自blog.csdn.net/lpcrazyboy/article/details/80666659
今日推荐