开发了一个综合影视字幕或音乐歌词的android单词学习软件

谢谢建议:)
媒体库目前做得确实比较简陋,只面向一次性导入媒体文件和字幕文件的场景(比如一个季度的影片,一张专辑里的歌曲)。重新扫描文件夹的功能后面可以加上。
单击查词这个问题我最近也遇到了。应该会增加一些选项,比如你说的开关选项,还有循环播放当前例句的选项。
查词跳转其它辞典应用暂时没有计划做。感觉如果只是在其它辞典中录入生词就有点背离这个app的初衷了 :thinking:

太好啦!感谢!期待之后的更新;P

想加外部词典的弹窗,主要还是感觉论坛里大家分享的很多词典的词条和释义要更详尽一些。要是能打通,就能把这些资源也充分利用起来了。
不过现有的网络词典虽然相对精简一点,但也像提示卡一样一览无余,可以方便快速反应,用来复习还挺好用的。感觉也是各有所长。(这也许是因为我在这里看的都是英文视频?)

借Gemini的帮助单独调整了一下PlayerWordBottomSheet函数,用欧路弹窗替代原本的弹窗(同时自动静默加入应用内的生词本),自用暂时是没有问题了。弹窗可以自由拖动和调整大小,调好以后感觉内容观感还不错。

效果是这样:

具体是在PlayerWordBottomSheet.kt里新增了:

import android.content.Intent
import android.net.Uri
import androidx.compose.ui.platform.LocalContext

然后把PlayerWordBottomSheet函数改成了:

@Composable
internal fun PlayerWordBottomSheet(
    onDismiss: () -> Unit,
    viewModel: PlayerWordViewModel = koinViewModel()
) {
    val route = viewModel.route
    val wordContextUiState by viewModel.wordContextUiState.collectAsStateWithLifecycle()
    val wordQueryUiState by viewModel.wordQueryUiState.collectAsStateWithLifecycle()
    val context = LocalContext.current

    var hasLaunchedEudic by remember(route.word) { mutableStateOf(false) }
    var hasFinished by remember(route.word) { mutableStateOf(false) }

    LaunchedEffect(route.word) {
        if (!hasLaunchedEudic) {
            try {
                val uri = Uri.parse("eudic://peek/${route.word}")
                val intent = Intent(Intent.ACTION_VIEW, uri)
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                context.startActivity(intent)
            } catch (e: Exception) {
            }
            hasLaunchedEudic = true
        }
    }

    LaunchedEffect(wordContextUiState) {
        if (wordContextUiState is WordContextUiState.Existed && !hasFinished) {
            hasFinished = true
            onDismiss()
        }
    }

    LaunchedEffect(wordQueryUiState) {
        if (!hasFinished) {
            when (val query = wordQueryUiState) {
                is WordQueryUiState.ResultDb -> {
                    val wordInfo = query.word.asWordInfo()
                    if (wordInfo.isNotEmpty()) {
                        viewModel.insertWordWithContext(wordInfo)
                        hasFinished = true
                        onDismiss()
                    }
                }
                is WordQueryUiState.ResultWeb -> {
                    val firstTrans = query.translations.firstOrNull()
                    val infoState = firstTrans?.infoState
                    if (infoState is RemoteWordInfoState.Single) {
                        viewModel.insertWordWithContext(infoState.info)
                        hasFinished = true
                        onDismiss()
                    } else if (infoState is RemoteWordInfoState.Multiple && infoState.infos.isNotEmpty()) {
                        viewModel.insertWordWithContext(infoState.infos.first())
                        hasFinished = true
                        onDismiss()
                    }
                }
                WordQueryUiState.NoTranslatorError -> {
                    viewModel.insertWordWithContext(null)
                    hasFinished = true
                    onDismiss()
                }
                else -> {} 
            }
        }
    }

    LaunchedEffect(route.word) {
        kotlinx.coroutines.delay(2500) 
        if (!hasFinished) {
            viewModel.insertWordWithContext(null) 
            hasFinished = true
            onDismiss() 
        }
    }
}

不过还不太知道该怎么处理那些文档间相互关联着的内容,比如新设相关的界面开关/选项之类的。还要再慢慢学习一下 :sneezing_face:

1 个赞