如何在基于Jetpack Compose的Android应用中使用Lets-Plot?
在Jetpack Compose Android应用中使用Lets-Plot的可行方案
一、应用模块build.gradle.kts依赖配置
将以下配置添加到app模块的build.gradle.kts文件中:
plugins { id("com.android.application") id("org.jetbrains.kotlin.android") } android { namespace = "com.example.letsplotdemo" compileSdk = 34 defaultConfig { applicationId = "com.example.letsplotdemo" minSdk = 24 targetSdk = 34 versionCode = 1 versionName = "1.0" // 适配so库架构,避免找不到.so文件的问题 ndk { abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } buildTypes { release { isMinifyEnabled = false proguardFiles( getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro" ) } } compileOptions { sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } buildFeatures { compose = true } composeOptions { kotlinCompilerExtensionVersion = "1.5.11" } } dependencies { // Jetpack Compose基础依赖 implementation("androidx.core:core-ktx:1.12.0") implementation("androidx.lifecycle:lifecycle-runtime-ktx:2.7.0") implementation("androidx.activity:activity-compose:1.8.2") implementation(platform("androidx.compose:compose-bom:2024.02.00")) implementation("androidx.compose.ui:ui") implementation("androidx.compose.ui:ui-graphics") implementation("androidx.compose.ui:ui-tooling-preview") implementation("androidx.compose.material3:material3") // Lets-Plot Compose Android依赖(自动包含所需.so库) implementation("org.jetbrains.lets-plot:lets-plot-compose-android:4.2.0") }
二、MainActivity.kt极简示例
以下是生成基础散点图的Compose示例:
package com.example.letsplotdemo import android.os.Bundle import androidx.activity.ComponentActivity import androidx.activity.compose.setContent import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.ui.Modifier import org.jetbrains.letsPlot.Geom import org.jetbrains.letsPlot.ggplot import org.jetbrains.letsPlot.label.ggtitle import org.jetbrains.letsPlot.letsPlot import org.jetbrains.letsPlot.intern.layer.geom.PointAesthetics import org.jetbrains.letsPlot.compose.LetsPlotCompose class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContent { MaterialTheme { Surface( modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { // 准备绘图数据 val data = mapOf( "x" to listOf(1, 2, 3, 4, 5), "y" to listOf(3, 1, 4, 1, 5) ) // 创建Plot对象 val plot = letsPlot(data) + Geom.point(PointAesthetics(color = "blue", size = 5.0)) + ggtitle("Jetpack Compose + Lets-Plot 示例") // 在Compose中渲染绘图 LetsPlotCompose(plot = plot, modifier = Modifier.fillMaxSize()) } } } } }
三、常见问题解决
- lets-plot-compose-android使用方法:核心是通过
LetsPlotCompose组件将Lets-Plot生成的Plot对象嵌入到Compose布局中,传入plot参数和布局修饰符即可完成渲染。 - 本地.so库找不到:当前版本的
lets-plot-compose-android依赖已自动包含各架构的预编译.so文件,无需手动添加。只需在defaultConfig中配置ndk.abiFilters适配主流架构即可。 - ggsave导致应用崩溃:Android端无法直接使用桌面版的
ggsave方法,需改用Android平台的文件保存逻辑。可以通过LetsPlotCompose的onPlotCreated回调获取绘图的Bitmap,再通过Android文件API保存:LetsPlotCompose( plot = plot, modifier = Modifier.fillMaxSize(), onPlotCreated = { bitmap -> // 这里处理Bitmap保存逻辑,例如保存到相册(需申请存储权限) // val outputStream = contentResolver.openOutputStream(contentUri) // bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) // outputStream?.close() } )
内容的提问来源于stack exchange,提问作者PsyToolkit
相关产品推荐
相关产品推荐

