Som*_*one 13 android android-jetpack-compose
我到处搜索,但没有找到有关在 Jetpack Compose 中裁剪图像的文档
如何在 Jetpack Compose 中裁剪图像?
eHe*_*ero 12
实际上,您可以使用那些较旧的 Android 库,没有问题。
我用的是这个: https: //github.com/CanHub/Android-Image-Cropper
项目构建.gradle:
allprojects {
repositories {
google()
mavenCentral()
maven(url = "https://jitpack.io")
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序构建.gradle:
implementation("com.github.CanHub:Android-Image-Cropper:4.0.0")
Run Code Online (Sandbox Code Playgroud)
用法(CropImageContract是上面提供的):
@Composable
fun ImageSelectorAndCropper() {
var imageUri by remember {
mutableStateOf<Uri?>(null)
}
val context = LocalContext.current
val bitmap = remember {
mutableStateOf<Bitmap?>(null)
}
val imageCropLauncher = rememberLauncherForActivityResult(CropImageContract()) { result ->
if (result.isSuccessful) {
// use the cropped image
imageUri = result.uriContent
} else {
// an error occurred cropping
val exception = result.error
}
}
val imagePickerLauncher = rememberLauncherForActivityResult(contract = ActivityResultContracts.GetContent()) { uri: Uri? ->
val cropOptions = CropImageContractOptions(uri, CropImageOptions())
imageCropLauncher.launch(cropOptions)
}
if (imageUri != null) {
if (Build.VERSION.SDK_INT < 28) {
bitmap.value = MediaStore.Images.Media.getBitmap(context.contentResolver, imageUri)
} else {
val source = ImageDecoder.createSource(context.contentResolver, imageUri!!)
bitmap.value = ImageDecoder.decodeBitmap(source)
}
Button(onClick = { imagePickerLauncher.launch("image/*") }) {
Text("Pick image to crop")
}
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我还必须将其添加到清单中,以便 CropActivity 选择一个主题
<activity android:name="com.canhub.cropper.CropImageActivity"
android:theme="@style/Base.Theme.AppCompat"/>
Run Code Online (Sandbox Code Playgroud)
我为 Jetpack Compose 构建了一个,可以使用静态、动态叠加动画、自定义形状和许多自定义选项进行裁剪。
它现已准备好投入生产,但仍有一些功能正在进行中和待办事项如果您想测试它,帮助解决问题,这里是链接
https://github.com/SmartToolFactory/Compose-Cropper
@Composable
private fun MainContent(
cropProperties: CropProperties,
cropStyle: CropStyle,
onSelectionPageMenuClicked: (SelectionPage) -> Unit
) {
val imageBitmapLarge = ImageBitmap.imageResource(
LocalContext.current.resources,
R.drawable.landscape1
)
var imageBitmap by remember { mutableStateOf(imageBitmapLarge) }
var croppedImage by remember { mutableStateOf<ImageBitmap?>(null) }
var crop by remember { mutableStateOf(false) }
var showDialog by remember { mutableStateOf(false) }
var isCropping by remember { mutableStateOf(false) }
Box(
modifier = Modifier
.fillMaxSize()
.background(Color.DarkGray),
contentAlignment = Alignment.Center
) {
Column(modifier = Modifier.fillMaxSize()) {
ImageCropper(
modifier = Modifier.fillMaxWidth().weight(1f),
imageBitmap = imageBitmap,
contentDescription = "Image Cropper",
cropStyle = cropStyle,
cropProperties = cropProperties,
crop = crop,
onCropStart = {
isCropping = true
}
) {
croppedImage = it
isCropping = false
crop = false
showDialog = true
}
}
BottomAppBar(
modifier = Modifier.align(Alignment.BottomStart),
actions = {
IconButton(
onClick = {
onSelectionPageMenuClicked(SelectionPage.Properties)
}
) {
Icon(
Icons.Filled.Settings,
contentDescription = "Settings",
)
}
IconButton(
onClick = {
onSelectionPageMenuClicked(SelectionPage.Style)
}
) {
Icon(Icons.Filled.Brush, contentDescription = "Style")
}
IconButton(
onClick = { crop = true }) {
Icon(Icons.Filled.Crop, contentDescription = "Crop Image")
}
},
floatingActionButton = {
ImageSelectionButton(
elevation = FloatingActionButtonDefaults.elevation(defaultElevation = 0.dp),
onImageSelected = { bitmap: ImageBitmap ->
imageBitmap = bitmap
}
)
}
)
if (isCropping) {
CircularProgressIndicator()
}
}
if (showDialog) {
croppedImage?.let {
ShowCroppedImageDialog(imageBitmap = it) {
showDialog = !showDialog
croppedImage = null
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10526 次 |
| 最近记录: |