- 博客(96)
- 资源 (3)
- 收藏
- 关注
原创 教你一招,如何正确的写AI剧本
当我们想要制作30s以上的短片,剧本是必不可少,总不能直接就出图出视频嘛,还是得有个剧本作为轴心线,我们按照这条线不断延伸才能做出一个完整的故事。废话不多说,我们一步步来开始制作。
2024-11-25 23:40:57
518
原创 教你一招,如何正确使用收尾帧
我们在制作收尾帧视频的时候,总是不知道该如何填写,所有总是留空或者简单写写“慢慢渐变过去”之类的,其实,这是因为我们掉入了一个思维陷阱,既然我们不懂,为什么不去找 AI 解决呢?
2024-11-23 16:37:50
921
原创 别再无脑刷图了!直接用它可以文案改图!
说实话,目前制作AI图片和AI视频的操作,最常用的就是不断点生成,一直点到生成满意的图片,即使有些图已经生成很不错了,但是总是有些地方不够满意,这时,我们的主角,SeedEdit 就登场了。SeedEdit 是字节......em...管它那么多干啥,直接上手,目前 SeedEdit 能在即梦和豆包中使用,下面我们分别在这两个平台实验下。
2024-11-16 09:29:20
594
原创 教你一招,让你的视频更顺滑!
在我们制作 AI 视频的时候,首尾帧技术是最常用的技术之一,因为它能使得 AI 视频生成的效果更可控,但是多个收尾帧联合的时候,很容易出现一些卡顿或切换时突兀的情况。就像我之前写的这个AI视频:AI丝滑变装全流程讲解-优快云博客的效果就特别明显。之所以出现这种情况,主要由两个原因组成:画质变化和固定帧。
2024-11-15 07:30:00
370
原创 震惊!10秒即可AI换脸(附上小白教程)
废话不多说,先上效果:它是由这两张图片合成的:其实就是把小李子的脸替换成了特朗普的脸。直接把两张图片上传上去即可!就是这么简单!访问需要魔法,若需要帮忙下载库,可以私聊提供!它提供安装包进行一键安装,不过需要付费下载,我们可以直接下载它的源码运行,这样就可以免费白嫖了。
2024-11-08 20:11:11
718
原创 AI视频:艺术字体融合(四季回响)
小伙伴们,大家好,我是不近视的猫,专注于 AI 视频制作,致力于让所有人都能通过 AI 制作出自己心仪的视频。今天我们要学习的是 AI艺术字体融合,我们通过十二节气切换的视频来巩固这个知识点。(别问我为什么不做二十四节气,因为我没那么多积分=_=)废话不多说,开干!
2024-11-04 11:01:30
477
原创 AI视频:AI丝滑变装全流程讲解
AI视频:AI丝滑变装全流程讲解。0基础小宝皆可以上手制作,百分百教会!这里主要使用了首尾帧效果,一层层套接。
2024-11-01 07:30:00
982
1
原创 重拾 Kotlin 协程——异常剖析(4)
前言我们通过上一篇文章知道,在 Android 中,假如线程发生了异常,会导致 App 直接退出,那我们来看看,协程发生异常后,现象会怎么样。示例代码: override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) GlobalScope.launch {
2022-08-19 10:08:20
571
原创 如何优雅地使用 when (Switch)
0 -> {}1 -> {}2 -> {}}em…这不是出现了魔术数字了吗?身为有那么一点点追求的程序员👨🏻💻,还得想下,怎么写更合适。这里,我总结了四种方式,并列出相应的场景供大家参考。常量字符串常量数字枚举。...
2022-08-19 10:07:58
608
原创 flow 操作符全解析
flow 的执行流程,就生产者和消费者一样,上游产出,下游消费,但是,在默认的情况下,都是生产一个,消费一个,再生产一个,再消费一个,这样进行的。若是生产和消费的速度都很快的话,那倒没有什么问题,但是,若生产速度大于消费速度,就会导致生产效率被强制降低了,因为生产者会一直等到消费者消费完再生产,而这时,我们可以考虑使用 buffer 操作符,可以设置缓存的生成数,就像生产出的商品可以临时存储在仓库一样,并不会阻塞生产者的运行。其实,它算是两个功能的合成,即一个是 buffer 效果,另外一个是合并效果。..
2022-08-19 10:07:10
816
原创 我们为什么要用 flow
首先,我们得明确 flow 的适用场景,那便是类似播报机情况,每隔一段时间就播报一段相似的内容。由此,假如我们不使用 flow 的情况下,那我们怎么解决这种问题?List ❎sequence ❎为什么这么快否决它们?因为他们都是阻塞式的,每两个元素间隔的时间,都会阻塞相应的线程,所以就不过多进行说明。而另外两个选项可以实现 flow 的效果,也就是可挂起式运行。回调LiveDataem…回调,也就是观察者模式的代表,确实是可以实现类似的效果,同时,LiveData 也是可以实现相应的效果的。...
2022-08-19 10:06:40
178
原创 Flow、SharedFlow、StateFlow 傻傻分不清楚
SharedFlow 就是观察者模式的一个具体实现,可以对观察者进行注册,当被观察者发生改变的时候,就会通知观察者,同时,SharedFlow 还可以存储之前的变化,即当 SharedFlow 变化后,才有观察者注册,这时观察者仍然能够收到之前的变化。其实,这也很容易理解,因为 delay 的时候,该协程都阻塞了,emit 是不会执行到,而当 delay 之后,collect 都执行完成,这时再 emit,自然也不会再执行 collect 里面的代码。关于 Flow 的说明以及使用,可以参考。...
2022-08-19 10:03:39
2340
4
原创 LiveData 与 StateFlow,我该用哪个?
前言LiveData 相信大家都非常熟悉了,但是由于协程与 Flow 的不断发展,之前所使用的技术也正在不断被替代,而 LiveData 的功能与 StateFlow 很相似,所以,很多人都在考虑使用 StateFlow 去替代 LiveData。这里,我们就分析下,LiveData 与 StateFlow 的优缺点,以及我们该如何抉择。LiveData 与 StateFlow 的区别关于 LiveData 与 StateFlow,网上说的最多的区别,其实就是「官方指导文档」中所讲解的这两点,这里我
2022-08-05 15:59:12
702
原创 Channel 是什么?
前言Flow 是一种冷流,只有 collect 的时候才会产生数据,而 SharedFlow、StateFlow 虽然是热流,但是,每次 collect 的时候,要么是只能获取最新值,要么把之前存储的值重新都发一遍。有没有一种热流,能更像生产者与消费者,一个专门生产,一个专门消费,答案当然是有的,那便是 Channel。Channel 的使用 GlobalScope.launch { launch { (1..3).forEach
2022-08-05 15:58:34
447
原创 channel 进阶
从『Channel 是什么?』中,我们已经清楚 channel 的基本使用以及其参数说明,下面,我们来继续学习它的更深入一点的知识。
2022-08-05 15:58:00
14087
原创 BroadcastChannel全解析
对于 channel 而言,更多面向的是一对一的情况,因为一旦receive()后,该数据就被获取了,后续再receive(),也无法拿到之前的数据。但是,类似的,Flow 与 sharedflow 是相对应的,与 channel 相对应的是 BroadcastChannel。...
2022-08-05 15:57:11
1452
原创 关于命令模式的误区,你知道了吗
最近项目开发需要用到命令模式,之前没学过,就过去研究了下。但是,理解后发现网上对于命令模式的讲解大多晦涩难懂,并且在选例时容易让人进入一个误区。所以,干脆自己写篇命令模式的讲解,用于自我总结,当然,若能帮上各位同学,那就是赚了。...
2022-08-05 15:56:31
160
原创 如何优雅地画一张图
在 Flutter 中,若我们需要自定义画一张图,则需要用到,不过并不是本篇文章的重点,所以我就直接贴出的相关代码,保证能够正常绘制即可。}}@override}@override}}绘制的效果:其中,最核心的绘制在MyPainter的中。...
2022-08-05 15:55:44
178
原创 手绘板的制作——重置与橡皮擦(2)
在上一篇文章「手绘板的制作——手绘(1) 」中,我们完成了手绘的功能,这一篇我们在其基础上来讲讲重置与橡皮擦的功能实现。在讲具体的功能实现前,我们需要先弄几个文本,用于笔刷、重置、橡皮擦的功能切换,同时把手绘板的功能抽取出来,放到类中,大致代码如下,由于大多都是 UI 代码,可以直接初略看看即可,若需要自己实践再进行 copy。}@override}// ...
2022-08-05 15:54:22
486
原创 手绘板的制作——命令模式与撤销、重制(3)
我们这篇来了解下撤销、重制的功能,其实也就是 undo 和 redo,在这里我们使用命令模式去设计,若对该模式不了解的话,可以考虑看下「关于命令模式的误区,你知道了吗」。其实对于命令模式,我最开始的理解为命令模式只是为了方便数据的管理和记录,不应该和具体的事务或状态进行绑定,后面经过跟同事的“友好”沟通后,感觉命令模式更符合数据的管理+具体事务执行,这个这样才算是一个命令的独立执行过程,而并非只是对数据进行管理,后续的操作还得自己额外去执行。好了,正文开始。...
2022-08-04 10:15:16
398
原创 手绘板的制作——画布缩放(4)
在这一篇中,我们讲解下画布的缩放,也就是做一个根据手势缩放进行画布缩放的功能。监听手势,当为一根手指的时候,就延续之前的操作,执行手绘操作,当操作为两根手指的时候,则执行缩放功能。对画布进行缩放好了,正文开始!...
2022-08-04 10:14:27
1004
原创 手绘板的制作——画布移动(5)
在上文「手绘板的制作——画布缩放(4)」中,我们学会了画布的缩放,这节我们学习下画布的移动,毕竟放大的画布不能移动的话,那放大还有什么意义。=_=
2022-08-04 10:13:59
411
原创 手绘板的制作——画布保存(6)
经过之前的一系列文章的学习,相信大家对于如何制作手绘板已经有了初步了了解,这一篇作为阶段性的一篇,也就是将画布作为图片进行保存。后续想到其它新功能再进行添加。
2022-08-04 10:13:20
332
原创 初始化Library新姿势——App Startup
}println("初始化 ALibrary 成功")}}在这篇文章中,我们尝试使用进行初始化。
2022-08-04 10:12:39
217
原创 DialogFragment与Dialog有什么区别
在开始学习 Android 的时候,制作对话框,无疑都是直接使用 Dialog,然后对其进行自定义,而后面推出 DialogFragment 后,更多人都开始使用 DialogFragment 了,那么,DialogFragment 与 Dialog 到底有什么区别?首先,我们来分析下 DialogFragment。...
2022-08-04 10:11:23
1806
原创 因为 QUERY_ALL_PACKAGES 权限,我们上不了 Google Play 了
em…今天刚上班就被告知要移除权限,做代码兼容,否则上不了 Google Play 了。if (!}i++) {}}}}当然,并不是这个权限没有了,而是被列为敏感权限,必须有充分的理由说明,才允许上架 GP,否则还是被一票否决。其实说白了就是大路已经被封了,留了条小路,但是小路只能看,不能走。详情可以看看官方说明,假如你们的 App 也需要上架 GP 的话。「使用广泛的软件包(应用)可见性 (QUERY_ALL_PACKAGES) 权限」...
2022-08-04 10:10:28
5351
5
原创 都到 2022 了,还想着换行
回首一望,今年已经过了一半,再看看自己的年龄,已经快 30 了,当年对于技术的一腔热血已经洒在了地上。对于现在而言,生活的目标主要不再是追求技术,而是活下去,在一线城市活下去。有可能有人会说,这是在贩卖焦虑,但是对于事实而言,看看一线城市的房价以及自己的薪资,好好算算啥时候能够在一线城市买房,然后再看看今年的互联网裁员潮,这真的只是贩卖焦虑而已吗?...
2022-08-04 10:09:28
95
原创 重拾线程——子线程异常,为什么 App 会崩溃(3)
前言在 JDK 中,若子线程发生异常崩溃,并不会阻碍主线程的运行。fun main(args: Array<String>){ Thread{ throw NullPointerException("空指针异常") }.start() Thread.sleep(1000) println("主线程执行完成")}运行结果:Exception in thread "Thread-0" java.lang.NullPointerExcept
2022-05-07 18:53:30
2063
1
原创 重拾 Kotlin 协程——获取返回值(3)
前言当我们在同步代码块中执行代码时,获取返回值是一件十分轻松的事情,直接运算结果进行返回即可。但是,协程是一种异步的概念,所以需要一些特别的操作才能获取协程的返回值。经研究,一般使用以下三种:asyncsuspendCoroutinesuspendCancellableCoroutineasync相信大家对 async 都十分理解了,主要流程就是使用 async 去开启协程,然后调用 async 返回的 Deferred 的 await() 方法,即可获取 async 协程运算的结果。具体的
2022-05-07 15:20:40
4226
原创 关于 import 的一些思考
前言当我们使用 Java 或者 Kotlin 开发 Android 的时候,若需要导包,都是直接导入绝对路径的,例如:import android.view.ViewGroup.MarginLayoutParams;但是使用 Dart 开发 Flutter 的时候,却有点不太一样,会提示让你选择绝对路径还是相对路径,例如:那么,问题来了,我们该选哪一种???当然,首先我们先明确一个问题,无论使用哪种导入方式,都不会对 App 的功能造成影响,只是写法的不同而已。dart.dev 建议da
2022-05-07 08:57:34
1405
原创 重拾线程——FutureTask 是如何吃掉异常(2)
前言首先,我们先写个示例代码来运行 FutureTask: val futureTask = FutureTask { println("futureTask 正在执行") throw Exception("我是测试异常") println("futureTask 发生异常了!") return@FutureTask "1" } Thread(futureTask).start()运行结果:futureTask
2022-04-24 19:00:42
2607
原创 重拾线程——异常处理(1)
关于线程的异常,我们可以先看一个小栗子🌰:fun main(args: Array<String>) { println("-------1---主线程开始执行") try{ Thread{ println("-------2---子线程开始执行") throw Exception("error!!!") println("-------3---子线程异常后执行") }.st
2022-04-24 17:19:45
1934
原创 重拾 Kotlin 协程——结构化并发(2)
取消协程我们都知道,通过以下代码就可以启动一个协程进行运行: CoroutineScope(Dispatchers.IO).launch { }但是,这个跟我们启动线程一样,具有一个很大的问题,就是不可控性,我们知道它什么时候启动,却不知道什么时候销毁,就像我们跳转在一个页面进行数据加载的时候,可以使用协程去加载,但是,我们也希望当该页面销毁的时候,该协程也能够销毁。其实,协程也提供这样的一种方式:class MainActivity : AppCompatActivity() {
2022-04-19 17:23:33
1538
原创 重拾 Kotlin 协程——调度器(1)
基础使用我们若要使用到 Kotlin 协程,首先需要添加依赖:dependencies { implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.9'}然后通过以下代码就可以启动协程: CoroutineScope(Dispatchers.Main).launch { }这样,就能够在主线程中执行代码了。调度器而这个调度器不仅只有 Dispatchers.Main
2022-04-18 03:13:27
725
原创 自动更改 versionCode
前言在我们每次发布新包的时候,总是需要更改 versionName 和 versionCode,versionName 是展示给用户看的版本名字,所以,每次发布都需要更改,这个可以理解,但是 versionCode 基本都是自增,那有没有什么方式可以让其在发布的时候自增?答案当然是可以的,不然这篇文章就不会发布出去了。正文首先,我们在 gradle.properties 中定义一个 APP_VERSION_CODE :然后在 build.gradle 更改 versionCode 为:ver
2022-02-15 16:59:56
1849
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人