Jetpack Compose-icon和iconbutton

举报
坚果的博客 发表于 2022/05/28 13:55:08 2022/05/28
【摘要】 IconIcon 组件用于帮助开发者显示一系列的小图标。Icon 组件支持三种不同类型的图片设置:@Composablefun Icon( imageVector: ImageVector, //矢量图 contentDescription: String?, modifier: Modifier = Modifier, tint: Color) ​@Composab...

Icon

Icon 组件用于帮助开发者显示一系列的小图标。Icon 组件支持三种不同类型的图片设置:

@Composable
fun Icon(
    imageVector: ImageVector, //矢量图
    contentDescription: String?,
    modifier: Modifier = Modifier,
    tint: Color
) 
​
@Composable
fun Icon(
    bitmap: ImageBitmap, //位图
    contentDescription: String?,
    modifier: Modifier = Modifier,
    tint: Color
) 
​
@Composable
fun Icon(
    painter: Painter, // 画笔
    contentDescription: String?,
    modifier: Modifier = Modifier,
    tint: Color
) 


  • ImageVector:矢量图对象,可以显示 SVG 格式的图标

  • ImageBitmap:位图对象,可以显示 JPG,PNG 等格式的图标

  • Painter:代表一个自定义画笔,可以使用画笔在 Canvas 上直接绘制图标 我们除了直接传入具体类型的实例,也可以通过 res/ 下的图片资源来设置图标:

Icon(imageVector = ImageVector.vectorResource(
    id = R.drawable.ic_svg, contentDescription = "矢量图资源")
  
Icon(bitmap = ImageBitmap.imageResource(
    id = R.drawable.ic_png), contentDescription = "图片资源")
    
Icon(painter = painterResource(
    id = R.drawable.ic_both), contentDescription = "任意类型资源")


如上,ImageVector 和 ImageBitmap 都提供了对应的加载 Drawable 资源的方法,vectorResource 用来加载一个矢量 XML,imageResource 用来加载 jpg 或者 png 图片。painterResource 对以上两种类型的 Drawable 都支持,内部会根据资源的不同类型创作对应的画笔进行图标的绘制。

接下来,我们使用 Icon 组件显示一个具体的图标:

@Composable
fun IconSample() {
  Icon(
    imageVector = Icons.Filled.Favorite,
    contentDescription = null,
    tint = Color.Red
  )
}


image-20220527141116081

上述代码中我们直接使用了 Material 包预置的 Favorite 矢量图标,是一个心形图标。

contentDescription 参数服务于系统的无障碍功能,其中的文字会转换为语言供视障人士听取内容时使用,这个参数没有默认值,必须手动设置, 也是官方有意为之,提醒开发者重视应用对于残障人士的关怀。但是 contentDescription 允置空。

例子中的 Favorite 是一个 Filled 风格的图标,Material 包每个图标都提供了五种风格可供使用,除了 Filled,还包括 Outlined,Rounded,Sharp,Two tone 等,都可以通过 Icons.xxx.xxx 的方式调用。这五种风格在一些设计上的侧重点不同,如下图所示:

Icon 类型 特点 代表示例
Outlined 勾勒轮廓 img
Filled 图形填充 img
Rounded 端点均为圆角 img
Sharp 端点均为尖角 img
TwoTone 双色搭配 img
补充提示

Icon 组件不仅仅可以加载 Material 包里自带的图标,也能加载网络下载第三方图标。谷歌也提供了专门的图标库。在这里我们可以从上面下载更多图标使用。

Material 自带的包仅有一些常用的图标,如需使用其他所有的 Material 图标,可以添加依赖项

implementation "androidx.compose.material:material-icons-extended:$compose_version"

IconButton

@Composable
fun IconButton(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    content: @Composable () -> Unit
)

IconButton 可以帮助我们生成一个可点击的图标按钮

IconButton 是一个可点击的图标,用于表示动作(复制,粘贴,保存,等等)。IconButton 的整体最小触摸目标尺寸为 48 x 48dp,以满足无障碍准则。content 会在 IconButton 内居中。

这个组件通常用于应用栏内的导航图标/动作。

content 通常应该是一个图标,使用 androidx.compose.material.icons.Icons 中的一个图标。如果使用自定义图标,请注意内部图标的典型尺寸是 24 x 24 dp

@Composable
fun IconButtonDemo() {
​
    Row{
        IconButton(onClick = { /*TODO*/ }) {
            Icon(Icons.Filled.Search, null)
        }
        IconButton(onClick = { /*TODO*/ }) {
            Icon(Icons.Filled.ArrowBack, null)
        }
        IconButton(onClick = { /*TODO*/ }) {
            Icon(Icons.Filled.Done, null)
        }
    }
​
}


img

取消波纹

有些时候我们想要取消按钮点击所产生的波纹要怎么办?

IconButton 的源码中其实将 Box 里的 modifier.clickable 参数 Indication 设置成波纹了

@Composable
fun IconButton(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    content: @Composable () -> Unit
) {
    Box(
        modifier = modifier
            .clickable(
                onClick = onClick,
                enabled = enabled,
                role = Role.Button,
                interactionSource = interactionSource,
                indication = rememberRipple(bounded = false, radius = RippleRadius)
            )
            .then(IconButtonSizeModifier),
        contentAlignment = Alignment.Center
    ) { content() }
}


那我们只需要复制源码的代码添加到自己的项目中,并且将 indication 设置为 null 就好了

@Composable
fun MyIconButton(
    onClick: () -> Unit,
    modifier: Modifier = Modifier,
    enabled: Boolean = true,
    interactionSource: MutableInteractionSource = remember { MutableInteractionSource() },
    content: @Composable () -> Unit
) {
    // 这也是源码的一部分
    val IconButtonSizeModifier = Modifier.size(48.dp)
    Box(
        modifier = modifier
            .clickable(
                onClick = onClick,
                enabled = enabled,
                role = Role.Button,
                interactionSource = interactionSource,
                indication = null
            )
            .then(IconButtonSizeModifier),
        contentAlignment = Alignment.Center
    ) { content() }
}
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。