跨平台动漫应用 Ani - 多平台支持的开源项目
项目标题与描述
Ani 是一个跨平台的动漫应用项目,采用现代 Kotlin 和 Jetpack Compose 技术构建。项目支持多平台部署,包括:
- Windows (x64)
- macOS (x64 和 aarch64)
- Android (多种架构)
- iOS
项目采用 GNU AGPLv3 开源协议,代码托管在 GitHub 上。
功能特性
- 多平台支持:一套代码可构建多个平台的应用程序
- 本地化支持:内置多语言支持,包括简体中文、繁体中文等
- 现代化 UI:基于 Jetpack Compose 构建的响应式用户界面
- 拖拽排序功能:支持列表项的拖拽重新排序
- 多媒体支持:集成 libvlc 进行视频播放
- 多数据源:支持 Bangumi.tv 和 Ikaros 等动漫数据源
安装指南
系统要求
- JDK 11 或更高版本
- Android SDK (用于 Android 构建)
- Xcode (用于 iOS 构建)
- Kotlin Multiplatform 环境
安装步骤
-
克隆仓库:
git clone https://github.com/open-ani/ani.git
-
安装依赖项:
# macOS brew install cmake ninja llvm swig openssl # Linux (Debian/Ubuntu) apt install android-sdk unzip curl
-
设置 Android SDK:
export ANDROID_HOME=/usr/lib/android-sdk export ANDROID_SDK_ROOT=$ANDROID_HOME
-
构建项目:
./gradlew build
使用说明
基础使用
项目使用 Kotlin Multiplatform 和 Compose 构建,主要代码位于 common
模块中。
拖拽排序示例
@Composable
fun VerticalReorderList() {
val data = remember { mutableStateOf(List(100) { "Item $it" }) }
val state = rememberReorderableLazyListState(onMove = { from, to ->
data.value = data.value.toMutableList().apply {
add(to.index, removeAt(from.index))
}
})
LazyColumn(
state = state.listState,
modifier = Modifier
.reorderable(state)
.detectReorderAfterLongPress(state)
) {
items(data.value, { it }) { item ->
ReorderableItem(state, key = item) { isDragging ->
val elevation = animateDpAsState(if (isDragging) 16.dp else 0.dp)
Column(
modifier = Modifier
.shadow(elevation.value)
.background(MaterialTheme.colors.surface)
) {
Text(item)
}
}
}
}
}
本地化支持
项目支持多语言本地化,字符串资源位于:
app-lang/src/androidMain/res/values/strings.xml
app-lang/src/androidMain/res/values-zh-rCN/strings.xml
app-lang/src/androidMain/res/values-zh-rTW/strings.xml
在代码中使用本地化字符串:
stringResource(Lang.xxx) // Compose 中使用
getString(Lang.xxx) // 非 Compose 代码中使用
核心代码
拖拽排序状态管理
/**
* 记住并创建可重排序的懒列表状态
* @param onMove 当项目移动时的回调函数
*/
@Composable
fun rememberReorderableLazyListState(
onMove: (from: ItemPosition, to: ItemPosition) -> Unit
): ReorderableLazyListState {
val state = remember { ReorderableLazyListState() }
state.onMove = onMove
return state
}
/**
* 可重排序的列表项组件
* @param state 状态管理
* @param key 项目的唯一键
* @param content 内容组件,接收是否正在拖拽的状态
*/
@Composable
fun ReorderableItem(
state: ReorderableLazyListState,
key: Any,
content: @Composable (isDragging: Boolean) -> Unit
) {
// 实现细节...
}
macOS 清理脚本
#!/bin/zsh
# 清理临时文件
find $TARGET_DIR -type f -name "*.kn*.tmp" -exec rm {} + -print 2>/dev/null | wc -l
# 清理 Xcode 相关文件
sudo rm -rf /Applications/Xcode.app/Contents/Developer/Platforms/AppleTVOS.platform/Developer/SDKs/
sudo rm -rf /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS16.4.sdk
# 清理 Java 环境
rm -rf "$JAVA_HOME_11_arm64" || true
rm -rf "$JAVA_HOME_17_arm64" || true
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码