Android开发中的简单控件(跟着动脑学院学习记录)

3.1 文本显示——使用TextView控件

3.1.1 设置文本的内容

TextView控件的文本内容可以通过XML属性android:text直接在布局文件中设置,也可以在Activity的Java/Kotlin代码中通过调用setText方法来动态设置。例如,在XML中设置文本为"Hello, World!"的代码片段如下:

<TextView
    android:id="@+id/tv_hello"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello, World!" />

在Java代码中设置同样的文本内容则可以使用:

TextView tvHello = findViewById(R.id.tv_hello);
tvHello.setText("Hello, World!");

 android:text="Hello, World!"采用的是硬编码方式,Android Studio不推荐在XML布局文件里直接写字符串,因为可能有好几个页面都显示“Hello,World”,若想把这句话换成“你吃饭了吗?”,就得一个一个XML 文件改过去,无疑费时费力。故而Android Studio推荐把字符串放到专门的地方管理,这个名为@string 的地方位于res/values目录下的strings.xml,打开该文件发现它的初始内容如下所示:

<resources>
    <string name="app_name">chapter03</string>
</resources>

strings.xml定义了一个名为“app_name”的字符串常量,其值为“chapter03”。那么在此添加新的字 符串定义,字符串名为“hello”,字符串值为“你好,世界”,添加之后的strings.xml内容如下所示: 

<resources>
<string name="app_name">chapter03</string>
<string name="hello">你好,世界</string>
</resources>

添加完新的字符串定义,回到XML布局文件,将android:text属性值改为“@string/字符串名”这般,也就 是“@string/hello”,修改之后的TextView标签示例如下:

<TextView
android:id="@+id/tv_hello"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello" />

若要在Java代码中引用字符串资源,则调用setText方法时填写形如“R.string.字符串名”的参数,就本例 而言填入“R.string.hello”,修改之后的Java代码示例如下:

// 获取名为tv_hello的文本视图
TextView tv_hello = findViewById(R.id.tv_hello);
tv_hello.setText(R.string.hello); // 设置tv_hello的文字内容

至此不管XML文件还是Java代码都从strings.xml引用字符串资源,以后想把“你好,世界”改为其他文字 的话,只需改动strings.xml一个地方即可。

activity_main.xml完整代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tv_hello"
        android:text="@string/hello"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

</LinearLayout>

MainActivity.java完整代码

package com.example.apptest;

import android.os.Bundle;
import android.widget.TextView;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 当前的页面布局采用的是res/layout/activity_main.xml
        setContentView(R.layout.activity_main);
        // 获取名叫tv_hello的TextView控件
        TextView tv_hello=findViewById(R.id.tv_hello);
        // 设置TextView控件的文字内容
        tv_hello.setText(R.string.hello);
    }
}

 效果图:

 3.1.2 设置文本的大小

设置文本大小,在Java代码中调用setTextSize方法,即可指定文本 大小,就像以下代码这样:

// 从布局文件中获取名叫tv_sp的文本视图
TextView tv_sp = findViewById(R.id.tv_sp);
tv_sp.setTextSize(30); // 设置tv_sp的文本大小

 这里的大小数值越大,则看到的文本也越大;大小数值越小,则看到的文本也越小。

在XML文件中则通 过属性android:textSize指定文本大小,可是如果给TextView标签添加“android:textSize="30"”,数字马 上变成红色如图所示,鼠标移过去还会提示错误无法解析 这个符号。

原来文本大小存在不同的字号单位,XML文件要求在字号数字后面写明单位类型,常见的字号单位主要 有px、dp、sp 3种,分别介绍如下。

1.px px是手机屏幕的最小显示单位,它与设备的显示屏有关。一般来说,同样尺寸的屏幕(比如6英寸手 机),如果看起来越清晰,则表示像素密度越高,以px计量的分辨率也越大。

2.dp dp有时也写作dip,指的是与设备无关的显示单位,它只与屏幕的尺寸有关。一般来说,同样尺寸的屏 幕以dp计量的分辨率是相同的,比如同样是6英寸手机,无论它由哪个厂家生产,其分辨率换算成dp单 位都是一个大小。

3.sp sp的原理跟dp差不多,但它专门用来设置字体大小。手机在系统设置里可以调整字体的大小(小、标 准、大、超大)。设置普通字体时,同数值dp和sp的文字看起来一样大;如果设置为大字体,用dp设置 的文字没有变化,用sp设置的文字就变大了。

字体大小采用不同单位的话,显示的文字大小各不相同。例如,30px、30dp、30sp这3个字号,在不同 手机上的显示大小有所差异。有的手机像素密度较低,一个dp相当于两个px,此时30px等同于15dp; 有的手机像素密度较高,一个dp相当于3个px,此时30px等同于10dp。假设某个App的内部文本使用字 号30px,则该App安装到前一部手机的字体大小为15dp,安装到后一部手机的字体大小为10dp,显然 后一部手机显示的文本会更小。 

sp才是Android推荐的字号单位,XML文件要求android:textSize必须指定字号单位,而原来纯数字的setTextSize方法,内部默认字号单位为sp。

  <TextView
        android:id="@+id/tv_hello"
        android:text="@string/hello"
        android:textSize="30sp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

3.1.3 设置文本的颜色

        java代码


        // 获取名叫tv_hello的TextView控件
        TextView tv_hello=findViewById(R.id.tv_hello);
        // 设置tv_hello的文字颜色
        tv_hello.setTextColor(Color.GREEN);

 

  • 八位编码FFEEDDCC中,FF表示透明度,EE表示红色的浓度,DD表示 绿色的浓度,CC表示蓝色的浓度。透明度为FF表示完全不透明,为00表示完全透明。RGB三色的数值越 大,表示颜色越浓,也就越暗;数值越小,表示颜色越淡,也就越亮。RGB亮到极致就是白色,暗到极 致就是黑色。

  • 于六位十六进制编码,则有两种情况,它在XML文件中默认不透明(等价于透明度为FF)(0xff00ff00正常绿色);,而在代码 中默认透明(等价于透明度为00)(0x0000ff00透明绿色)。

 在XML文件中

可通过属性android:textColor设置文字颜色,但要给色值添加井号前缀“#”,设定好文本颜 色的TextView标签示例如下:

<TextView
android:id="@+id/tv_xml"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="布局文件设置六位文字颜色"
android:textColor="#00ff00"
android:textSize="17sp" />

像字符串资源那样,Android把颜色也当作一种资源

<TextView
android:id="@+id/tv_values"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="资源文件引用六位文字颜色"
android:textColor="@color/green"
android:textSize="17sp" />

在 res/values/colors.xml中添加

<color name="green">#00ff00</color>

不仅文字颜色,还有背景颜色也会用到上述的色值定义,在XML文件中通过属性android:background设 置控件的背景颜色。Java代码则有两种方式设置背景颜色,倘若色值来源于Color类或十六进制数,则调 用setBackgroundColor方法设置背景;倘若色值来源于colors.xml中的颜色资源,则调用 setBackgroundResource方法,以“R.color.颜色名称”的格式设置背景。下面是两种方式的背景设定代码 例子: 

// 从布局文件中获取名叫tv_code_background的文本视图
TextView tv_code_background = findViewById(R.id.tv_code_background);
// 将tv_code_background的背景颜色设置为绿色
tv_code_background.setBackgroundColor(Color.GREEN); // 在代码中定义的色值
tv_code_background.setBackgroundResource(R.color.green); // 颜色来源于资源文件

我这里用的颜色不一样 ,效果图大概这样

注意属性android:background和setBackgroundResource方法,它俩用来设置控件的背景,不单单是 背景颜色,还包括背景图片。在设置背景图片之前,先将图片文件放到res/drawable目录***(以 drawable开头的目录,不仅仅是drawable目录),然后把android:background的属性值改为 “@drawable/不含扩展名的图片名称”,或者调用setBackgroundResource方法填入“R.drawable.不含扩 展名的图片名称”。 

   <TextView
        android:id="@+id/tv_hello"
        android:text="@string/hello"
        android:textSize="30sp"
        android:textColor="@color/text_color"
        android:background="@drawable/haha"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        />

 效果图:

3.1.4    设置字体样式

通过XML属性android:textStyle直接设置样式为normalbolditalic字体的样式(正常、粗体和斜体)

android:textStyle="italic"

3.1.5    设置文本对齐方式和行间距

设置文本对齐方式

通过android:textAlignment属性来实现。

  • center:居中对齐文本。
  • gravity:使文本根据重力属性对齐,通常是默认值。
  • inherit:继承父视图的对齐属性。
  • textEnd:对齐到段落的末尾,与ALIGN_OPPOSITE相对应。
  • textStart:对齐到段落的开始,与ALIGN_NORMAL相对应。
  • viewEnd:对齐到视图的末端,如果视图的布局方向是从左到右(LTR),则相当于ALIGN_RIGHT
  • viewStart:对齐到视图的起始端,如果视图的布局方向是从左到右(LTR),则相当于ALIGN_LEFT

例如,想要将文本水平居中对齐,可以在XML布局文件中将TextView的android:textAlignment属性设置为center

设置行间距

设置TextView的行间距,可以使用android:lineSpacingMultiplier属性,这个属性设置行间距的倍数,没有单位,值可以为任意浮点数。如果值大于1.0表示增加行间距,如果值小于1.0表示减少行间距。例如,如果您想要将行间距设置为原来的1.5倍,可以在XML布局文件中将TextView的android:lineSpacingMultiplier属性设置为1.5

另外,android:lineSpacingExtra属性可以设置额外的行间距数值,单位通常为dp,值可以为负数、小数和0。如果值为正数表示增加行间距;如果值为负数表示减少行间距;如果值为0,则没有变化。

在代码中,可以使用setLineSpacing(float add, float mult)方法来动态设置行间距,其中add表示要增加的间距数值,mult表示要增加的间距倍数.

3.1.6    实现文本的跑马灯效果

  1. 设置TextView属性

  • 确保TextViewlayout_width属性设置为match_parent或者固定的宽度,以便它能够适应屏幕宽度。
  • 确保文本内容的长度足以在一行内显示,但又超出屏幕宽度,这样跑马灯效果才能正常工作。
  • 设置TextViewsingleLine属性为true,以确保文本在一行内显示。
  • 设置TextViewellipsize属性为marquee,使文本在超出屏幕范围时显示跑马灯效果。
  • 设置TextViewmarqueeRepeatLimit属性为marquee_forever-1,以实现无限次循环滚动。
  • 设置TextViewfocusablefocusableInTouchMode属性为true,以确保跑马灯效果在TextView获得焦点时才能激活。
  1. 请求焦点
    在代码中调用 TextView.requestFocus() 方法,以确保TextView能够开始跑马灯效果。

 <TextView
        android:id="@+id/tv_hello"
        android:layout_width="match_content"
        android:layout_height="wrap_content"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:marqueeRepeatLimit="marquee_forever"
        android:scrollHorizontally="true"
        android:text="@string/hello" />

 java代码中添加

tv_hello.requestFocus();

 

跑马灯

 3.自定义TextView类(如果需要多个跑马灯效果共存):
        创建一个自定义的TextView类并重写 isFocused() 方法,使其始终返回 true,这样即使有多个跑马灯TextView,它们也都能独立工作。

4.动态设置跑马灯效果(可选):
如果您希望在代码中动态设置跑马灯效果,可以在Activity的 onCreate 方法中获取TextView实例,并调用 setSelected(true) 方法来启动跑马灯。

3.2 视图基础 

3.2.1 设置视图的宽高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值