学习Android的第六天

目录

Android TextView 文本框

TextView 基础属性

范例

带阴影的TextView

范例

带边框的TextView

范例

带图片(drawableXxx)的TextView

范例1

范例2

使用autoLink属性识别链接类型

范例

TextView 显示简单的 HTML

范例1

范例2

SpannableString & SpannableStringBuilder 定制文本

范例1

范例2

跑马灯效果的 TextView

范例

TextView 的几个重要属性 

参考文档


Android TextView 文本框

Android 中的 TextView 是用来显示不需要编辑的文本的基本 UI 元素。它非常适合用于显示静态文本内容,比如标题、描述、指导信息等。TextView 具有很强的自定义能力,可以通过 XML 中的属性或者在代码中动态设置属性来改变文本的外观和样式,比如字体大小、颜色、对齐方式等。TextView 还支持富文本,可以显示不同样式的文本,如粗体、斜体、下划线等。

除了显示简单的文本内容外,TextView 也可以显示一些基本的 HTML 标记文本,比如超链接、图像等。这使得它在显示一些富有表现力的文本内容时非常有用。

总的来说,TextView 是 Android 开发中常用的一个重要控件,用来展示各种类型的静态文本信息,使得应用界面更加丰富和易读。

TextView 基础属性

1、android:id:为 TextView 设置一个唯一的组件 id,方便在 Java 或 Kotlin 代码中通过 findViewById() 方法获取到该对象,从而对其进行操作。

2、android:layout_width 和 android:layout_height:分别设置 TextView 的宽度和高度。常用的值有:

  • wrap_content:控件显示的内容有多大,控件就有多大。
  • match_parent(或 fill_parent):填满该控件所在的父容器。
  • 也可以设置成特定的大小,比如 200dp。

3、android:gravity:设置控件中内容的对齐方向,可以控制文本在 TextView 中的水平和垂直方向上的位置。该属性与布局中的 gravity 相同。

4、android:text:设置显示的文本内容。一般建议将字符串写入 strings.xml 文件,然后通过 @string/xxx 来引用,以便进行国际化和易于维护。

5、android:textColor:设置字体颜色。通常将颜色写入 colors.xml 文件,然后通过 @color/xxx 来引用。

6、android:textStyle:设置字体风格,可以使用竖线 | 叠加多个值。常见的值包括:

  • normal:正常字体风格(无效果)。
  • bold:加粗。
  • italic:斜体。

7、android:textSize:设置字体大小,单位一般使用 sp(与 dp 类似,但会根据用户的字体大小首选项进行缩放)。

8、android:background:设置 TextView 的背景颜色,也可以是图片或者其他 drawable 资源。

范例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:padding="16dp">

    <!-- 一个简单的 TextView 显示静态文本内容 -->
    <TextView
        android:id="@+id/simpleTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello, World!"
        android:textSize="20sp"
        android:textColor="@android:color/black"/>

    <!-- 另一个 TextView 设置不同的文本和样式 -->
    <TextView
        android:id="@+id/styledTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="@string/email"
        android:textSize="16sp"
        android:textColor="#ED0F0F"
        android:textStyle="bold|italic"
        android:gravity="center_horizontal"
        android:paddingTop="8dp"
        android:paddingBottom="8dp"/>

</LinearLayout>

运行结果如下

带阴影的TextView

这些是设置 TextView 阴影效果时常用的属性,简要总结如下:

  • android:shadowColor:设置阴影颜色。需要与shadowRadius一起使用。
  • android:shadowRadius:设置阴影的模糊程度,建议使用大于 0 的值,通常推荐使用 3.0。
  • android:shadowDx:设置阴影在水平方向的偏移,即阴影在水平方向开始的位置。
  • android:shadowDy:设置阴影在竖直方向的偏移,即阴影在竖直方向开始的位置。

这些属性一起使用可以为 TextView 创建出具有阴影效果的文本显示。

范例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/shadowTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Shadow Text"
        android:textSize="30sp"
        android:textColor="#EA0D0D"
        android:shadowColor="#000000"
        android:shadowRadius="3.0"
        android:shadowDx="10.0"
        android:shadowDy="10.0"/>

</LinearLayout>

运行结果如下

带边框的TextView

想要创建一个带有边框的 TextView,可以使用 ShapeDrawable 资源文件。

ShapeDrawable 资源文件定义了形状绘制的样式,以下是常用节点和属性的简单说明:

1、<solid>:设置背景颜色。

  • android:color:指定背景颜色。

2、<stroke>:设置边框的样式。

  • android:width:指定边框的粗细。
  • android:color:指定边框的颜色。

3、<padding>:设置内容与边界的边距。

  • android:left:左边距。
  • android:top:上边距。
  • android:right:右边距。
  • android:bottom:下边距。

4、<corners>:设置圆角。

  • android:radius:指定圆角的半径。

5、<gradient>:设置渐变色。

  • android:startColor:起始颜色。
  • android:endColor:结束颜色。
  • android:centerColor:中间颜色。
  • android:angle:方向角度,从起始颜色到结束颜色的方向。0 度表示从左到右,90 度表示从下到上。
  • android:type:渐变的类型,如线性渐变、径向渐变等。

这些节点和属性可以根据需求组合使用,来创建各种形状和样式的背景。

范例

1、首先,在 res/drawable 目录下创建两个 XML 文件,比如 border_bg.xml和border_fillet.xml,用于定义 ShapeDrawable 资源:

<?xml version="1.0" encoding="utf-8"?>
<!--    border_bg.xml-->
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <!-- 设置一个黑色边框 -->
    <stroke android:width="2px" android:color="#000000"/>
    <!-- 渐变 -->
    <gradient
        android:angle="270"
        android:endColor="#C0C0C0"
        android:startColor="#FCD209" />
    <!-- 设置一下边距,让空间大一点 -->
    <padding
        android:left="5dp"
        android:top="5dp"
        android:right="5dp"
        android:bottom="5dp"/>

</shape>
<?xml version="1.0" encoding="utf-8"?>
<!--    border_fillet-->
<shape xmlns:android="http://schemas.android.com/apk/res/android">

    <!-- 设置透明背景色 -->
    <solid android:color="#87CEEB" />

    <!-- 设置一个黑色边框 -->
    <stroke
        android:width="2px"
        android:color="#000000" />
    <!-- 设置四个圆角的半径 -->
    <corners
        android:bottomLeftRadius="50px"
        android:bottomRightRadius="50px"
        android:topLeftRadius="50px"
        android:topRightRadius="50px" />
    <!-- 设置一下边距,让空间大一点 -->
    <padding
        android:bottom="5dp"
        android:left="5dp"
        android:right="5dp"
        android:top="5dp" />

</shape>

 2、然后,在布局文件中使用这两个 ShapeDrawable 资源作为 TextView 的背景:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/borderTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="矩形边框的TextView"
        android:textSize="20sp"
        android:textColor="#000000"
        android:background="@drawable/border_bg"/>
    <TextView
        android:id="@+id/txtTwo"
        android:layout_width="200dp"
        android:layout_height="64dp"
        android:layout_marginTop="10dp"
        android:textSize="18sp"
        android:gravity="center"
        android:background="@drawable/border_fillet"
        android:text="圆角边框的TextView" />

</LinearLayout>

带图片(drawableXxx)的TextView

基本用法:

设置图片的核心其实就是:drawableXxx;

可以设置四个方向的图片:drawableTop(上),drawableButtom(下),drawableLeft(左),drawableRight(右) 另外,你也可以使用drawablePadding来设置图片与文字间的间距!

范例1

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/imageTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="带图像的文本"
        android:textSize="18sp"
        android:textColor="#000000"
        android:drawableLeft="@drawable/meimei"
        android:drawablePadding="8dp"/>


</LinearLayout>

运行效果图: 

 

问题: 我们这样设置的drawable并不能自行设置大小,在XML是无法直接设置的,所以我们采用

范例2的方法设置带图片的TextView

范例2

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/imageTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="带图像的文本"
        android:textSize="18sp"
        android:textColor="#000000"
        android:drawablePadding="8dp"/>


</LinearLayout>
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewAnimator;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 获取图像资源
        Drawable drawable = getResources().getDrawable(R.drawable.meimei);
        TextView textView = findViewById(R.id.imageTextView);
        // 将图像资源转换为 BitmapDrawable
        BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
        // 设置图像资源的大小
        bitmapDrawable.setBounds(0, 0, 100, 100); // 设置宽高为 100 像素
        // 将设置后的 BitmapDrawable 设置给 TextView
        textView.setCompoundDrawables(bitmapDrawable, bitmapDrawable, bitmapDrawable, null);//可以将其他的bitmapDrawable换成null看看效果
        // 设置 TextView 的文本
        textView.setText("Hello World!");
    }
}

运行效果图:

使用autoLink属性识别链接类型

autoLink 属性可以用于在 TextView 中自动识别并链接特定类型的文本,比如电话号码、网址、电子邮件地址等。当用户点击这些链接时,系统会启动相关的应用来处理这些链接,比如拨打电话、打开浏览器等。

autoLink 属性支持的值:

  • web:表示要识别和链接网址。
  • none:不进行链接识别。
  • phone:识别并链接电话号码。
  • email:识别并链接电子邮件地址。
  • map:识别并链接地图地址(如经纬度)。
  • all:识别并链接所有类型的链接。

范例

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:gravity="center"
    android:padding="16dp">

    <TextView
        android:id="@+id/linkTextView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是一个csdn的链接: https://www.csdn.net/"
        android:autoLink="web"/>

</LinearLayout>

TextView 显示简单的 HTML

除了显示普通文本外,TextView 还预定义了一些类似于 HTML 的标签,通过这些标签,我们可以使 TextView 显示不同的字体颜色,大小,字体,甚至是显示图片,或者链接等

当然,并不是支持所有的 HTML 标签,常用的有下述这些

支持的标签说明
<font>设置颜色和字体
<big>设置字体大号
<small>设置字体小号
<i><b>斜体粗体
<a>连接网址
<img>图片

范例1

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_centerInParent="true" />

</RelativeLayout>
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewAnimator;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView hello = (TextView)findViewById(R.id.hello);

        //创建要显示的 HTML 文本
        String s1 = "<font color='blue'><b>CSDN</b></font><br>";
        s1 += "<a href = 'https://www.csdn.net/'>https://www.csdn.net/</a>";

        // 调用 HTML.fromHTML() 方法创建 HTML 格式文本
        // 调用 setText() 方法将 HTML 格式文本显示到 TextView
        hello.setText(Html.fromHtml(s1));

        // 设置点击会跳转到默认处理的 APP
        hello.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

范例2

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_centerInParent="true" />

</RelativeLayout>
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewAnimator;

import java.lang.reflect.Field;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView hello = (TextView) findViewById(R.id.hello);

        // 创建要显示的 HTML 文本
        String s1 = "<font color='blue'><b>CSDN</b></font><br>";
        s1 += "<a href = 'https://www.csdn.net/'>https://www.csdn.net/</a>";
        s1 += "<br/><br/>";
        s1 += "欢迎关注微信公众号:<br/>";
        s1 +=  "图片:<br/>";
        s1 +=  "<img src = 'meimei'/><br/>";

        // 调用 HTML.fromHTML() 方法创建 HTML 格式文本
        // 调用 HTML.Html.ImageGetter() 处理对 img 图片的处理
        // 调用 setText() 方法将 HTML 格式文本显示到 TextView
        hello.setText(Html.fromHtml(s1, new Html.ImageGetter() {
            @Override
            public Drawable getDrawable(String source) {
                Drawable draw = null;
                try {
                    Field 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 (Exception e) {
                    e.printStackTrace();
                }
                return draw;
            }
        }, null));

        // 设置点击会跳转到默认处理的 APP
        hello.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

SpannableString & SpannableStringBuilder 定制文本

SpannableString 和 SpannableStringBuilder 是 Android 中用于定制文本样式的类,它们允许你在文本中应用不同的样式和效果,比如设置字体颜色、背景色、下划线、删除线、点击事件等。

以下是 SpannableString 可用的一些子类及其说明:

  • BackgroundColorSpan: 设置背景色。
  • ClickableSpan: 使文本可点击,可设置点击事件。
  • ForegroundColorSpan: 设置文本颜色(前景色)。
  • MaskFilterSpan: 应用修饰效果,如模糊或浮雕。
  • RasterizerSpan: 应用光栅效果。
  • StrikethroughSpan: 给文本添加删除线(中划线)。
  • SuggestionSpan: 相当于占位符。
  • UnderlineSpan: 给文本添加下划线。
  • AbsoluteSizeSpan: 设置绝对大小(文本字体大小)。
  • DynamicDrawableSpan: 设置图片,可基于文本基线或底部对齐。
  • ImageSpan: 设置图片。
  • RelativeSizeSpan: 设置相对大小(文本字体相对于默认大小的倍数)。
  • ReplacementSpan: 父类,一般不直接使用。
  • ScaleXSpan: 在 x 轴方向上缩放文本。
  • StyleSpan: 设置字体样式,如粗体、斜体等。
  • SubscriptSpan: 设置下标(数学公式中会用到)。
  • SuperscriptSpan: 设置上标(数学公式中会用到)。
  • TextAppearanceSpan: 设置文本外观,包括字体、大小、样式和颜色。
  • TypefaceSpan: 设置文本字体。
  • URLSpan: 设置文本超链接。

范例1

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_centerInParent="true" />

</RelativeLayout>
package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.ViewAnimator;

import java.lang.reflect.Field;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView hello = (TextView) findViewById(R.id.hello);

        SpannableString span = new SpannableString("红色打电话斜体删除线绿色下划线图片:.");

        //1. 设置背景色,setSpan 时需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE (前后都不包括)
        span.setSpan(new ForegroundColorSpan(Color.RED), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //2. 用超链接标记文本
        span.setSpan(new URLSpan("tel:1234567890"), 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //3. 用样式标记文本(斜体)
        span.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //4. 用删除线标记文本
        span.setSpan(new StrikethroughSpan(), 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //5. 用下划线标记文本
        span.setSpan(new UnderlineSpan(), 10, 16, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        //6. 用颜色标记
        span.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 13,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        // 7. 获取 Drawable 资源
        Drawable d = getResources().getDrawable(R.drawable.meimei);
        //左上空出一点距离
        d.setBounds(16, 16, d.getIntrinsicWidth(), d.getIntrinsicHeight());

        //8. 创建 ImageSpan,然后用 ImageSpan 来替换文本
        ImageSpan imgspan = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
        span.setSpan(imgspan, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

        hello.setText(span);

        // 设置点击会跳转到默认处理的 APP
        hello.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

范例2

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <TextView
        android:id="@+id/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="20sp"
        android:layout_centerInParent="true" />

</RelativeLayout>

package com.example.myapplication;

import androidx.appcompat.app.AppCompatActivity;

import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ViewAnimator;

import java.lang.reflect.Field;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView hello = findViewById(R.id.hello);

        String[] likeUsers = generateLikeUsers(20);
        SpannableStringBuilder ssb = addClickPart(likeUsers);

        hello.setMovementMethod(LinkMovementMethod.getInstance());
        hello.setText(ssb, TextView.BufferType.SPANNABLE);
    }

    // 生成模拟的好友列表
    private String[] generateLikeUsers(int count) {
        String[] likeUsers = new String[count];
        for (int i = 0; i < count; i++) {
            likeUsers[i] = "好友" + i;
        }
        return likeUsers;
    }

    // 定义一个点击每个部分文字的处理方法
    private SpannableStringBuilder addClickPart(String[] likeUsers) {
        // 赞的图标
        SpannableString spanStr = new SpannableString("p");
        spanStr.setSpan(new ImageSpan(this, R.drawable.baseline_favorite_24), 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);

        // 创建一个 SpannableStringBuilder 对象,连接多个字符串
        SpannableStringBuilder ssb = new SpannableStringBuilder(spanStr);

        if (likeUsers.length > 0) {
            for (String name : likeUsers) {
                final int start = ssb.length();
                ssb.append(name);
                final int end = ssb.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(Color.BLUE);
                        ds.setUnderlineText(false);
                    }
                }, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
                ssb.append(",");
            }
            // 删除最后一个逗号
            ssb.delete(ssb.length() - 1, ssb.length());
        }
        // 添加点赞总数
        return ssb.append("等").append(String.valueOf(likeUsers.length)).append("个人觉得很赞");
    }
}

跑马灯效果的 TextView

要实现跑马灯效果的 TextView,你需要设置以下三个属性:

  • android:singleLine: 设置是否单行显示,需要将其设置为 true。
  • android:ellipsize: 设置文字超出控件宽度时的显示方式,需要将其设置为 marquee,表示跑马灯滚动显示。
  • android:marqueeRepeatLimit: 设置跑马灯重复次数,可以设置为 marquee_forever 表示无限重复,或者具体的数字,如 2 表示重复两次。

范例

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/marqueeTextView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="这是一个字幕文本视图示例。此文本将水平滚动。"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:marqueeRepeatLimit="marquee_forever"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:scrollHorizontally="true"
        android:padding="10dp"
        android:textColor="@android:color/black"
        android:textSize="18sp" >
        <requestFocus></requestFocus>
    </TextView>

</RelativeLayout>

TextView 的几个重要属性 

1、设置 TextView 字间距

要设置 TextView 的字间距,可以使用属性 android:textScaleX 来控制字体水平方向的缩放。默认情况下,android:textScaleX 的值为 1.0f,表示正常大小,类型值是 float。你可以设置它为其他值来增加或减少字间距。

例如,将字间距设置为原来的两倍,可以这样做:

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    android:textScaleX="2.0" />

或者在 Java 代码中动态设置:

TextView textView = findViewById(R.id.textView);
textView.setText("Hello World!");
textView.setScaleX(2.0f);

2、设置 TextView 行间距

要设置 TextView 的行间距,可以使用属性 android:lineSpacingExtra 和 android:lineSpacingMultiplier。android:lineSpacingExtra 用于设置固定的行间距,单位可以是 dp 或者 px;android:lineSpacingMultiplier 用于设置行间距的倍数,

例如设置为 1.2 表示行间距增加 20%。

<TextView
    android:id="@+id/textView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"
    android:lineSpacingExtra="10dp"
    android:lineSpacingMultiplier="1.2" />

或者在 Java 代码中动态设置:

TextView textView = findViewById(R.id.textView);
textView.setText("Hello World!");
textView.setLineSpacing(10, 1.2f);

3、自动换行

关于自动换行,可以通过设置 android:singleLine 属性来控制。将 android:singleLine 设置为 false 会启用自动换行功能,而设置为 true 则表示在一行内显示完,不进行换行。如果希望多行显示但不超过指定行数,可以结合使用 android:maxLines 属性。

<?xml version="1.0" encoding="utf-8" ?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="这是一个长文本,将自动换行为多行。这是一个长文本,将自动换行为多行。这是一
        个长文本,将自动换行为多行。这是一个长文本,将自动换行为多行。这是一个长文本,将自动换行为
        多行。这是一个长文本,将自动换行为多行。这是一个长文本,将自动换行为多行。这是一个长文本,
        将自动换行为多行。这是一个长文本,将自动换行为多行。这是一个长文本,将自动换行为多行。"
        android:singleLine="false"
        android:maxLines="6" />



</RelativeLayout>

在这个示例中,TextView 将在不超过 6 行的情况下自动换行显示文本。

参考文档

Android TextView 官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/382062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】链表OJ面试题5(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 给定一个链表&#xff0c;返回链表开始入环的第一个结点。 如果链表无环&#xff0c;则返回 NULLhttp://t.cs…

随机MM引流源码PHP开源版

引流源码最新随机MM开源版PHP源码&#xff0c;非常简洁好看的单页全解代码没任何加密 直接上传即可用无需数据库支持主机空间

《剑指 Offer》专项突破版 - 面试题 38、39 和 40 : 通过三道面试题详解单调栈(C++ 实现)

目录 面试题 38 : 每日温度 面试题 39 : 直方图最大矩形面积 方法一、暴力求解 方法二、递归求解 方法三、单调栈法 面试题 40 : 矩阵中的最大矩形 面试题 38 : 每日温度 题目&#xff1a; 输入一个数组&#xff0c;它的每个数字是某天的温度。请计算每天需要等几天才会…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

python+django高校活动报名场地管理系统l1ro4

校园活动管理平台程序的开发&#xff0c;在数据库的选择上面&#xff0c;选择功能强大的MySQL数据库进行数据的存放操作。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5…

tkinter-TinUI-xml实战(10)展示画廊

tkinter-TinUI-xml实战&#xff08;10&#xff09;展示画廊 引言声明文件结构核心代码主界面统一展示控件控件展示界面单一展示已有展示多类展示 最终效果在这里插入图片描述 ![](https://img-blog.csdnimg.cn/direct/286fcaa2fa5648a992a0ac79b4efad82.png) ………… 结语 引言…

大数据Flume--入门

文章目录 FlumeFlume 定义Flume 基础架构AgentSourceSinkChannelEvent Flume 安装部署安装地址安装部署 Flume 入门案例监控端口数据官方案例实时监控单个追加文件实时监控目录下多个新文件实时监控目录下的多个追加文件 Flume Flume 定义 Flume 是 Cloudera 提供的一个高可用…

《CSS 简易速速上手小册》第4章:视觉美学(2024 最新版)

文章目录 4.1 颜色理论在 CSS 设计中的应用&#xff1a;网页的调色盘4.1.1 基础知识4.1.2 重点案例&#xff1a;创建一个具有情感设计的登录页面4.1.3 拓展案例 1&#xff1a;使用颜色增强信息的可视化表示4.1.4 拓展案例 2&#xff1a;利用颜色创建网站的品牌身份 4.2 字体与文…

C#使用哈希表对XML文件进行查询

目录 一、使用的方法 1.Hashtable哈希表 2.Hashtable哈希表的Add方法 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;示例 3.XML文件的使用 二、实例 1.源码 2.生成效果 可以通过使用哈希表可以对XML文件进行查询。 一、使用的方法 1.Hashtable哈希表…

视觉开发板—K210自学笔记(三)

本期我们来遵循其他单片机的学习路线开始去做一位点灯大师—点亮一个LED。那么第一步还是先知道K210里面的硬件电路是怎么连接的&#xff0c;需要查看上一节的文档&#xff0c;看看开发板原理图到底是哪个LED跟哪个IO连在一起。 一、硬件电路 根据之前官方提供的assembly draw…

最简单的基于 FFmpeg 的音频编码器(PCM 编码为 AAC)

最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09; 最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09;正文结果工程文件下载其他参考链接 最简单的基于 FFmpeg 的音频编码器&#xff08;PCM 编码为 AAC&#xff09; 参考雷霄骅…

【小沐学GIS】基于Android绘制三维数字地球Earth(OpenGL)

&#x1f37a;三维数字地球系列相关文章如下&#x1f37a;&#xff1a;1【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第一期2【小沐学GIS】基于C绘制三维数字地球Earth&#xff08;OpenGL、glfw、glut&#xff09;第二期3【小沐学GIS】…

Java:常用API接上篇 --黑马笔记

一、 StringBuilder类 StringBuilder代表可变字符串对象&#xff0c;相当于是一个容器&#xff0c;它里面的字符串是可以改变的&#xff0c;就是用来操作字符串的。 好处&#xff1a;StringBuilder比String更合适做字符串的修改操作&#xff0c;效率更高&#xff0c;代码也更…

例36:打开文件读出文件内容

1.建立一个EXE工程&#xff0c;在主窗体上放一个按钮&#xff0c;如图32。 图32 在按钮的单击事件中输入代码&#xff1a; Sub Form1_Command1_BN_Clicked(hWndForm As hWnd, hWndControl As hWnd)Dim s as StringDim 文件 As CWSTR FF_OpenFileDialog(hWndForm,_"打开…

微信自动预约小程序开发指南:从小白到专家

在数字化时代&#xff0c;预约小程序已成为各类服务行业的必备工具。本文将指导你从零开始&#xff0c;通过第三方小程序制作平台&#xff0c;顺利开发出一款具有预约功能的实用小程序。 第一步&#xff1a;注册登录第三方小程序制作平台 首先&#xff0c;你需要选择一个适合你…

案例:三台主机实现 级联复制

介绍&#xff1a;级联复制架构 级联复制架构 是一种特殊的主从结构&#xff0c;之前聊到的几种主从结构都只有两层&#xff0c;但级联复制架构中会有三层&#xff0c;关系如下&#xff1a; 也就是在级联复制架构中&#xff0c;存在两层从库&#xff0c;这实际上属于一主多从架…

Hive-架构与设计

架构与设计 一、背景和起源二、框架概述1.设计特点 三、架构图1.UI交互层2.Driver驱动层3.Compiler4.Metastore5.Execution Engine 四、执行流程1.发起请求2.获取执行计划3.获取元数据4.返回元数据5.返回执行计划6.运行执行计划7.运行结果获取 五、数据模型1.DataBase数据库2.T…

fast.ai 机器学习笔记(四)

机器学习 1&#xff1a;第 11 课 原文&#xff1a;medium.com/hiromi_suenaga/machine-learning-1-lesson-11-7564c3c18bbb 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 来自机器学习课程的个人笔记。随着我继续复习课程以“真正”理解它&#xff0c;这些笔记将继续…

[office] Excel2019函数MAXIFS怎么使用?Excel2019函数MAXIFS使用教程 #知识分享#微信#经验分享

Excel2019函数MAXIFS怎么使用&#xff1f;Excel2019函数MAXIFS使用教程 Excel2019函数MAXIFS怎么使用&#xff1f;这篇文章主要介绍了Excel2019函数MAXIFS使用教程,需要的朋友可以参考下 在今年&#xff0c;Excel除了新版本Excel2019&#xff0c;其中有一个新功能MAXIFS函数&am…

python_django高校运动会成绩管理系统4o4c3

田径运动会报名管理系统就是给学生进行网上报名&#xff0c;管理员管理报名信息的一种通用管理平台&#xff0c;从而方便管理人员对运动会的日常报名工作的管理。本系统的前台功能模块包括系统的基本操作、最新公告、运动项目和报名项目&#xff1b;系统的后台功能模块包括系统…