Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Jetpack合成中的图像梯度_Android_Gradient_Android Jetpack Compose - Fatal编程技术网

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