Android Jetpack合成中的图像梯度
以下是我的组件:Android Jetpack合成中的图像梯度,android,gradient,android-jetpack-compose,Android,Gradient,Android Jetpack Compose,以下是我的组件: @Composable fun Cover( name: String, imageRes: Int, modifier: Modifier = Modifier.padding(16.dp, 8.dp) ) { Box(modifier) { Card( shape = RoundedCornerShape(4.dp), backgroundColor = MaterialThem
@Composable
fun Cover(
name: String,
imageRes: Int,
modifier: Modifier = Modifier.padding(16.dp, 8.dp)
) {
Box(modifier) {
Card(
shape = RoundedCornerShape(4.dp),
backgroundColor = MaterialTheme.colors.secondary,
elevation = 4.dp
) {
Stack {
Image(
imageResource(imageRes),
modifier = Modifier
.gravity(Alignment.Center)
.aspectRatio(2f),
contentScale = ContentScale.Crop,
)
Text(
text = name,
modifier = Modifier
.gravity(Alignment.BottomStart)
.padding(8.dp),
style = MaterialTheme.typography.h6
)
}
}
}
}
这就是它的样子:
我想在图像上和文本后面显示一个暗渐变,以便文本易于阅读。我想我将不得不使用LinearGradient或RadialGradient,但由于缺乏文档,我无法做到这一点
编辑:这是我正在尝试做的,但是用Jetpack撰写。哇,那一次花了几个小时 可以将Modifier.background与垂直渐变一起使用。我使用了一列来保存修改器,并进行了计算以获得图像大小,但您的解决方案可能不同,您可以以不同的方式计算或存储大小,然后将修改器放在其他地方。我在代码中留下了两个TODO,因此可以调整渐变
@Composable
fun Cover(
name: String,
imageRes: Int,
modifier: Modifier = Modifier.padding(16.dp, 8.dp)
) {
val density = DensityAmbient.current.density
val width = remember { mutableStateOf(0f) }
val height = remember { mutableStateOf(0f) }
Box(modifier) {
Card(
shape = RoundedCornerShape(4.dp),
backgroundColor = MaterialTheme.colors.secondary,
elevation = 4.dp
) {
Stack {
Image(
imageResource(imageRes),
modifier = Modifier
.gravity(Alignment.Center)
.aspectRatio(2f)
.onPositioned {
width.value = it.size.width / density
height.value = it.size.height / density
},
contentScale = ContentScale.Crop,
)
Column(
Modifier.size(width.value.dp, height.value.dp)
.background(
VerticalGradient(
listOf(Color.Transparent, Color.Black),
0f, // TODO: set start
500f, // TODO: set end
)
)
) {}
Text(
text = name,
modifier = Modifier.gravity(Alignment.BottomStart)
.padding(8.dp),
style = typography.h6,
)
}
}
}
}
以下是我的示例的外观:
哇,那一次花了几个小时 可以将Modifier.background与垂直渐变一起使用。我使用了一列来保存修改器,并进行了计算以获得图像大小,但您的解决方案可能不同,您可以以不同的方式计算或存储大小,然后将修改器放在其他地方。我在代码中留下了两个TODO,因此可以调整渐变
@Composable
fun Cover(
name: String,
imageRes: Int,
modifier: Modifier = Modifier.padding(16.dp, 8.dp)
) {
val density = DensityAmbient.current.density
val width = remember { mutableStateOf(0f) }
val height = remember { mutableStateOf(0f) }
Box(modifier) {
Card(
shape = RoundedCornerShape(4.dp),
backgroundColor = MaterialTheme.colors.secondary,
elevation = 4.dp
) {
Stack {
Image(
imageResource(imageRes),
modifier = Modifier
.gravity(Alignment.Center)
.aspectRatio(2f)
.onPositioned {
width.value = it.size.width / density
height.value = it.size.height / density
},
contentScale = ContentScale.Crop,
)
Column(
Modifier.size(width.value.dp, height.value.dp)
.background(
VerticalGradient(
listOf(Color.Transparent, Color.Black),
0f, // TODO: set start
500f, // TODO: set end
)
)
) {}
Text(
text = name,
modifier = Modifier.gravity(Alignment.BottomStart)
.padding(8.dp),
style = typography.h6,
)
}
}
}
}
以下是我的示例的外观:
对于1.0.0-beta04,您可以使用以下内容:
var sizeImage by remember { mutableStateOf(IntSize.Zero) }
val gradient = Brush.verticalGradient(
colors = listOf(Color.Transparent, Color.Black),
startY = sizeImage.height.toFloat()/3, // 1/3
endY = sizeImage.height.toFloat()
)
Box(){
Image(painter = painterResource(id = R.drawable.banner),
contentDescription = "",
modifier = Modifier.onGloballyPositioned {
sizeImage = it.size
})
Box(modifier = Modifier.matchParentSize().background(gradient))
}
原件:
之后:
还可以使用修改器和允许开发人员在布局内容之前或之后绘制的选项将渐变应用于图像
Image(painter = painterResource(id = R.drawable.conero),
contentDescription = "",
modifier = Modifier.drawWithCache {
val gradient = Brush.verticalGradient(
colors = listOf(Color.Transparent, Color.Black),
startY = size.height/3,
endY = size.height
)
onDrawWithContent {
drawContent()
drawRect(gradient,blendMode = BlendMode.Multiply)
}
}
)
使用1.0.0-beta04,您可以使用以下内容:
var sizeImage by remember { mutableStateOf(IntSize.Zero) }
val gradient = Brush.verticalGradient(
colors = listOf(Color.Transparent, Color.Black),
startY = sizeImage.height.toFloat()/3, // 1/3
endY = sizeImage.height.toFloat()
)
Box(){
Image(painter = painterResource(id = R.drawable.banner),
contentDescription = "",
modifier = Modifier.onGloballyPositioned {
sizeImage = it.size
})
Box(modifier = Modifier.matchParentSize().background(gradient))
}
原件:
之后:
还可以使用修改器和允许开发人员在布局内容之前或之后绘制的选项将渐变应用于图像
Image(painter = painterResource(id = R.drawable.conero),
contentDescription = "",
modifier = Modifier.drawWithCache {
val gradient = Brush.verticalGradient(
colors = listOf(Color.Transparent, Color.Black),
startY = size.height/3,
endY = size.height
)
onDrawWithContent {
drawContent()
drawRect(gradient,blendMode = BlendMode.Multiply)
}
}
)
最新答案
1.0.0-09
导入androidx.annotation.DrawableRes
导入安卓
导入AND
导入ANDROIDX。编写。基础。布局。*
导入安卓
导入androidx.compose.material.Card
导入androidx.compose.material.MaterialTheme
导入androidx.compose.material.Text
导入androidx.compose.runtime.Composable
导入androidx.compose.runtime.mutableStateOf
导入androidx.compose.runtime.memory
导入androidx.compose.ui.Alignment
导入androidx.compose.ui.Modifier
导入androidx.compose.ui.graphics.Brush
导入androidx.compose.ui.graphics.Color
导入androidx.compose.ui.layout.ContentScale
导入androidx.compose.ui.layout.OnGloballyPosited
导入androidx.compose.ui.platform.AmbientDensity
导入androidx.compose.ui.res.imageResource
导入androidx.compose.ui.unit.dp
导入tech.abd3lraouf.learn.compose.kombose.ui.theme.排版
@组合的
趣味封面
名称:String,
@DrawableRes imageRes:Int,
修饰语:修饰语=修饰语
{
val image=imageResourceimageRes
val密度=环境密度。电流密度
val宽度=记住{mutableStateOf0f}
val height=记住{mutableStateOf0f}
盒
修饰语
.填充16.dp,8.dp
{
卡片
形状=圆角拐角形状4.dp,
backgroundColor=材料Theme.colors.secondary,
标高=4.dp
{
盒子{
形象
形象
修饰语=修饰语
.aligning.Center
.aspectRatio2f
.ONGLOBALLYPOSITED{
width.value=it.size.width/density
height.value=it.size.height/density
},
contentScale=contentScale.Crop,
柱
修饰语
.sizewidth.value.dp,height.value.dp
出身背景
垂直梯度
颜色列表。透明,颜色。黑色,
图像高度*0.6F,
图像高度*1F
{}
文本
text=名称,
修饰语=修饰语
.alignAlignment.BottomStart
.padding8.dp,
样式=排版。正文2,
颜色=颜色。白色
}
}
}
}
另外,请注意渐变如何绘制其高度的控制
输出
最新答案
1.0.0-09
导入androidx.annotation.DrawableRes
导入安卓
导入AND
导入ANDROIDX。编写。基础。布局。*
导入安卓
导入androidx.compose.material.Card
导入androidx.compose.material.MaterialTheme
导入androidx.compose.material.Text
导入androidx.compose.runtime.Composable
导入androidx.compose.runtime.mutableSt
阿托夫
导入androidx.compose.runtime.memory
导入androidx.compose.ui.Alignment
导入androidx.compose.ui.Modifier
导入androidx.compose.ui.graphics.Brush
导入androidx.compose.ui.graphics.Color
导入androidx.compose.ui.layout.ContentScale
导入androidx.compose.ui.layout.OnGloballyPosited
导入androidx.compose.ui.platform.AmbientDensity
导入androidx.compose.ui.res.imageResource
导入androidx.compose.ui.unit.dp
导入tech.abd3lraouf.learn.compose.kombose.ui.theme.排版
@组合的
趣味封面
名称:String,
@DrawableRes imageRes:Int,
修饰语:修饰语=修饰语
{
val image=imageResourceimageRes
val密度=环境密度。电流密度
val宽度=记住{mutableStateOf0f}
val height=记住{mutableStateOf0f}
盒
修饰语
.填充16.dp,8.dp
{
卡片
形状=圆角拐角形状4.dp,
backgroundColor=材料Theme.colors.secondary,
标高=4.dp
{
盒子{
形象
形象
修饰语=修饰语
.aligning.Center
.aspectRatio2f
.ONGLOBALLYPOSITED{
width.value=it.size.width/density
height.value=it.size.height/density
},
contentScale=contentScale.Crop,
柱
修饰语
.sizewidth.value.dp,height.value.dp
出身背景
垂直梯度
颜色列表。透明,颜色。黑色,
图像高度*0.6F,
图像高度*1F
{}
文本
text=名称,
修饰语=修饰语
.alignAlignment.BottomStart
.padding8.dp,
样式=排版。正文2,
颜色=颜色。白色
}
}
}
}
另外,请注意渐变如何绘制其高度的控制
输出
直截了当地说:
Card(shape = RoundedCornerShape(8.dp)) {
Box {
Image(...)
Text(
text = "title",
modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth()
.background(Brush.verticalGradient(0F to Color.Transparent, .5F to Color.Red, 1F to Color.Red))
.padding(start = 8.dp, end = 8.dp, bottom = 8.dp, top = 16.dp),
color = Color.White,
style = MaterialTheme.typography.body1,
textAlign = TextAlign.Start
)
}
}
直截了当地说:
Card(shape = RoundedCornerShape(8.dp)) {
Box {
Image(...)
Text(
text = "title",
modifier = Modifier
.align(Alignment.BottomCenter)
.fillMaxWidth()
.background(Brush.verticalGradient(0F to Color.Transparent, .5F to Color.Red, 1F to Color.Red))
.padding(start = 8.dp, end = 8.dp, bottom = 8.dp, top = 16.dp),
color = Color.White,
style = MaterialTheme.typography.body1,
textAlign = TextAlign.Start
)
}
}
使用Modifier.DruckGround传递LinearGradient或RadialGradient@MohammadSianaki该函数现在称为just Modifier.background使用Modifier.trackground传递LinearGradient或RadialGradient@MohammadSianaki该函数现在称为just Modifier.background看起来很棒!但是为什么要用500f呢?我试了几个值,注意到不同的情况会有所不同,所以我只留下了500,在样本中看起来不错。我相信数字和颜色都会根据图像的大小和种类而变化,看起来很棒!但是为什么要用500f呢?我试了几个值,注意到不同的情况会有所不同,所以我只留下了500,在样本中看起来不错。我相信数字值和颜色都会根据图像的大小和类型而变化,但实际效果并不理想。这只会使图像更暗。也许我也做错了什么,我不明白startX,startY,endX,endY参数期望什么。为什么endY有size.width?“它不应该是尺寸。高度吗?”阿沙尔7回答正确。它应该是size.height我的错,尝试了一个正方形的代码。startX、startY、endX、endY是渐变的坐标。在上面的代码中,它们是通过size=this.size构建的。您也可以使用不同的BlendMode,但实际效果并不理想。这只会使图像更暗。也许我也做错了什么,我不明白startX,startY,endX,endY参数期望什么。为什么endY有size.width?“它不应该是尺寸。高度吗?”阿沙尔7回答正确。它应该是size.height我的错,尝试了一个正方形的代码。startX、startY、endX、endY是渐变的坐标。在上面的代码中,它们是通过size=this.size构建的。也可以使用不同的blendMode