Jetpack Compose 实用指南 - .9图与launchEffect与添加/编辑/复用原生AndroidView

本文详细介绍了在Jetpack Compose中如何处理.9图,包括使用 Coil 库加载失败的问题,以及通过 AndroidView 添加和管理.9图的方法。重点讨论了使用launchEffect避免在多个组件间共享同一AndroidView时出现的错误,并强调了在添加和移除AndroidView时遵循Android的要求和Compose的规则的重要性。
摘要由CSDN通过智能技术生成

开头感谢我的粉丝头子 (这位同学拒绝提供博客地址)提供的水群话题
不多说废话,直接进入正题

Compose中显示.9图

现在有.9图如下——
.9图示意

总所周知,compose中加载图片用Image()
image 的第一个参数:painter,
大家一般用自带的,或者官方推荐的coil

当前文章使用的两者API版本分别为compose 1.2.0-alpha02coil-compose:1.4.0

于是我们加载图片试试
  • 前者使用painterResource(),会报错——

java.lang.IllegalArgumentException: Only VectorDrawables and rasterized asset types are supported ex. PNG, JPG

简直是滑天下之大稽!我这个图是不是png我自己心里没点数?

  • 后者使用rememberImagePainter()倒是能够加载图片出来,来,我们一步步试试看。

    • 首先,很自然的一个想法:coil库支持直接填入类型为int的ResIdDrawable,我们直接——
Image(
		rememberImagePainter(R.drawable.xxx), //
						"testFor.9",
                     	Modifier.size(300.dp, 50.dp),
                       	contentScale = ContentScale.FillBounds //拉伸图片以填充
               )

得到图片如下——
典型的被拉伸
显然是玩崩了,这个.9图片失去了它的特性,变成了普通的PNG图片

然后我们想到,在传统ImageView直接使用Drawable其实也会被警告并推荐使用ContextCompat.getDrawable(context , @ResId resId)方法。
那我们这里试试看——

Image(
		rememberImagePainter(
   								ContextCompat.getDrawable(context R.drawable.xxx)
   						), 
						"testFor.9",
                     	Modifier.size(300.dp, 50.dp),//设置一个与图片明显不符的宽高测试
                       	contentScale = ContentScale.FillBounds //拉伸图片以填充
               )

得到图片如下——
正常显示的.9png
wow~ awesome!

但显然大部分人会蹉跎这么一个小小的操作,根本想不到这里去,并认为compose不支持.9图,起码目前不支持

这时候大家就会想到——我添加一个AndroidView,里面展示.9图,岂不美哉!

添加AndroidView

语法很简单,直接看代码——

AndroidView({
    it:Context -> //传入了一个context供你初始化该view
//AndroidView中第一个参数默认返回一个传统View
//在这里进行view的初始化,它只会被调用一次,且保证在UI线程上被调用
                Image
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于Jetpack Compose 组件androidx.compose.material3.Button点击和长按同时监听代码示例,可以参考以下示例代码: ``` import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.background import androidx.compose.foundation.gestures.detectTapAndLongPress import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.* import androidx.compose.runtime.* import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import com.example.myapp.viewmodel.CounterViewModel import kotlinx.coroutines.launch @ExperimentalFoundationApi @Composable fun ButtonClickListener() { val scaffoldState = rememberScaffoldState() var counterViewModel = viewModel<CounterViewModel>() Scaffold( scaffoldState = scaffoldState, modifier = Modifier.fillMaxSize(), content = { Column( modifier = Modifier .padding(top = 10.dp, start = 16.dp, end = 16.dp) .fillMaxWidth(), horizontalAlignment = Alignment.CenterHorizontally ) { Text(text = "点击或长按按钮可触发计数") Spacer(modifier = Modifier.height(16.dp)) MyButton( onClick = { counterViewModel.incrementCount() }, onLongClick = { counterViewModel.decrementCount() } ) Spacer(modifier = Modifier.height(16.dp)) Text( text = "当前计数:${counterViewModel.count}", style = MaterialTheme.typography.h4 ) } }, bottomBar = { BottomAppBar(cutoutShape = RoundedCornerShape(topStart = 16.dp)) { IconButton(onClick = { }) { Icon(Icons.Default.Save, contentDescription = "Save") } Spacer(Modifier.weight(1f, true)) IconButton(onClick = { }) { Icon(Icons.Default.Share, contentDescription = "Share") } } } ) } @ExperimentalFoundationApi @Composable fun MyButton(onClick: () -> Unit, onLongClick: () -> Unit) { Surface( modifier = Modifier .padding(16.dp) .pointerInput(Unit) { detectTapAndLongPress(onLongClick = onLongClick, onTap = onClick) }, shape = MaterialTheme.shapes.small, color = MaterialTheme.colors.primary ) { Text( text = "Click or long press me", style = MaterialTheme.typography.button, color = Color.White, modifier = Modifier.padding( start = 16.dp, top = 8.dp, end = 16.dp, bottom = 8.dp ) ) } } ``` 这个示例使用了一个自定义的 MyButton 组件,通过 pointerInput() 来同时监听点击和长按事件,并在这两种事件发生时调用不同的回调函数。 另外,这个示例还使用了 Jetpack Compose 中的一些组件,如 Scaffold、Column、Text、BottomAppBar 等,并结合了 ViewModel 来管理计数器的状态,实现了点击或长按按钮可触发计数的效果。 希望这个示例能够对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值