Jectpack Compse

678 阅读4分钟

TextField

Compose 中的TextField,是文本输入框控件,样式为Android现有库中的EditText的样式,具体用法中会涉及到状态的使用

TextField 属性列表
属性作用示例
value输入框内容"hello"
onValueChange输入框内容改变事件{ //it 为改变后的文本}
placeholderhint提示语"请输入xxxxx"
backgroundColor背景颜色Color.Yellow
visualTransformation输入内容的格式PasswordVisualTransformation()//密码样式
leadingIcon前面的图标{ Icon(Icons.Filled.AccountBox) }
trailingIcon后面的图标{ Icon(Icons.Filled.AccountCircle)}
keyboardOptions暂时不知道怎么用KeyboardOptions(keyboardType = KeyboardType.Phone, imeAction =ImeAction.Done//ime行为)//设置了没有发现效果
代码实例
class TextFieldActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ShowTextField()
        }
    }

    @Composable
    fun ShowTextField() {
        var text by savedInstanceState { "" }
        TextField(
            value = text,
            onValueChange = {
                text = it
            },//文本改变监听

            modifier = Modifier
                .padding(10.dp)
                .fillMaxWidth(),
//            label = { Text(text = "标签") },//顶部的提示语
            placeholder = { Text(text = "请输入内容") },//hint提示语
            backgroundColor = Color.Yellow,//背景颜色
            visualTransformation = PasswordVisualTransformation(),//输入样式
            leadingIcon = { Icon(Icons.Filled.AccountBox) },//前面的图标
            trailingIcon = {
                Icon(
                    Icons.Filled.AccountCircle,
                    modifier = Modifier.clickable(onClick = {
                        text = ""
                    })
                )
            },//后面的图标
            keyboardOptions = KeyboardOptions(
                keyboardType = KeyboardType.Phone,
                imeAction = ImeAction.Done//ime行为
            )
        )

    }
}
运行效果:

device-2021-02-03-215535.png

目前发现此控件在输入第一个字符和删除最后一个字符的时候,控件的高度会发生小距离的变化

Button

Compose 中的Button,对标Button ,是一个具有点击事件的一个控件,跟Android现有库中的Button的区别在于没有文本属性,这是因为,Compose 的设计理念在于组合优于继承,既然你需要显示文本,就给Compose的Button设置一个Text作为子控件就可以了,所以Android现有库中的Button相当于Compose中的Button+Text

Button属性列表
属性作用示例
onClick点击事件{}
contentbutton的内容Text()
contentPadding内容与边界的距离PaddingValues(100.dp)
enabledtrue设置按钮是否可用
fontWeight字体粗细FontWeight.Medium
shape设置按钮形状CutCornerShape(30) 切角形状 /RoundedCornerShape(50)圆角形状
elevation按钮可点击状态下的阴影目前Alpha10版本无法正常导包
disabledElevation按钮不可用状态下的elevation目前Alpha10版本无法正常导包
代码实例
class ButtonActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ShowButton()
        }
    }

    @Preview
    @Composable
    fun ShowButton() {
        Button(
                onClick = {
                    toast(ButtonActivity::class.java.simpleName)
                },//点击事件
                modifier = Modifier
                        .padding(10.dp)
                        .fillMaxWidth()
                        .background(Color.Transparent),//修饰
                border =
//            BorderStroke(2.dp, Color.White),//边框颜色
                BorderStroke(
                        10.dp,
                        Brush.radialGradient(listOf(Color.White, Color.Black))
                ),//边框颜色 Brush 中的方法对应
                content = { Text(text = "Hell-ppppppppppppppppppppppffffffffffffffpppppp") },//内容
                contentPadding = PaddingValues(100.dp),//当内容过长的时候才会有效,
                enabled = true,//设置按钮是否可用
                shape = CutCornerShape(30), //切角按钮
//            RoundedCornerShape(50),//RoundedCornerShape修改按钮形状 如果参数是dp就是修改角度大小 如果是int是百分比
//        elevation ,按钮可点击状态下的 elevation
//        disabledElevation 按钮不可用状态下的elevation
        )
    }
}
运行效果:

device-2021-02-02-225022.png

OutlinedButton TextButton 这两个控件目前没有发现与Button有什么区别

Text

Compose 中的Text ,对标TextView

Text属性列表

属性作用示例
text文本内容"普通文本"
fontSize字体大小20.sp
fontFamily字体FontFamily.SasSerif
fontStyle字体样式FontStyle.Italic(斜体)
fontWeight字体粗细FontWeight.Medium
letterSpacing字符间距TextUnit.Sp(10)
textAligntext显示样式TextAlign.Justify(拉伸填充整个容器)
maxLines最大显示行数10
textDecoration划线样式TextDecoration.Underline(下划线),TextDecoration.LineThrough(中划线)
styletext样式TextStyle.Default
onTextLayout文本计算完成回调{}
overflow文本溢出样式TextOverflow.Ellipsis

上述属性中text除了可以直接设置一个字符串,还可以通过AnnotatedString类来进行构建文本内容实现一个Text中显示不同大小字体和不同颜色的文本

AnnotatedString代码示例:

AnnotatedString.Builder().run {
                pushStyle(
                    SpanStyle(
                        color = Color.Blue,
                        fontSize = 30.sp,
                        fontStyle = FontStyle.Italic,
                        fontFamily = FontFamily.Cursive
                    )
                )
                append("四大名著")
                pop()//取消上面修改的样式对下文本的影响
                append("水浒传")
                append("三国演义")
                append("红楼梦")
                append("西游记")
                toAnnotatedString()
            }

Text 代码示例:

class TextActivity : ComponentActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            ShowText()
        }
    }

    @Composable
    fun ShowText() {
        Text(
            fontStyle = FontStyle.Italic,//设置字体 Normal 是正常,Italic 斜体
            text = AnnotatedString.Builder().run {
                pushStyle(
                    SpanStyle(
                        color = Color.Blue,
                        fontSize = 30.sp,
                        fontStyle = FontStyle.Italic,
                        fontFamily = FontFamily.Cursive
                    )
                )
                append("四大名著")
                pop()//取消上面修改的样式对下文本的影响
                append("水浒传")
                append("三国演义")
                append("红楼梦")
                append("西游记")
                toAnnotatedString()
            }, //显示的内容
            color = Color.Yellow,   //text颜色
            modifier = Modifier
                .padding(10.dp)
                .fillMaxWidth()
                .height(100.dp)
                .background(color = Color.Red)
                .alpha(1f)
                .clickable(onClick = {
                    toast("hello")
                }),
            fontSize = 20.sp,//字体大小
            fontFamily = FontFamily.SansSerif,//修改字体
            fontWeight = FontWeight.Medium,//修改字重(字体粗细)
            letterSpacing = TextUnit.Sp(10),//字符间距

            textAlign = TextAlign.Justify,//Justify 拉伸填充整个容器, Start Left 左对齐  End  Right 右对齐
            maxLines = 10,//最大行数
            textDecoration = TextDecoration.Underline,//LineThrough 中间划线 Underline 下划线
            style = TextStyle.Default,//text样式
            onTextLayout = {

            },//计算完成回调

            overflow = TextOverflow.Ellipsis

        )

    }
}

效果展示:

Mi8 屏幕指纹版 MIUI12 稳定版(显示效果符合预期)

device-2021-01-31-172609.png

Mi8 MIUI12 开发版(显示效果FontStyle.Italic,字体倾斜无效)

device-2021-01-31-173046.png