跨平台动漫应用 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 环境

安装步骤

  1. 克隆仓库:

    git clone https://github.com/open-ani/ani.git
    
  2. 安装依赖项:

    # macOS
    brew install cmake ninja llvm swig openssl
    
    # Linux (Debian/Ubuntu)
    apt install android-sdk unzip curl
    
  3. 设置 Android SDK:

    export ANDROID_HOME=/usr/lib/android-sdk
    export ANDROID_SDK_ROOT=$ANDROID_HOME
    
  4. 构建项目:

    ./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智能小助手)
公众号二维码

posted @ 2025-07-07 20:01  qife  阅读(25)  评论(0)    收藏  举报