前言
近期看到谷歌官方推文有一篇关于Jetpack Ink API的文章,随即进行了了解和研究,该SDK主要就是低延时的手写绘制,比如通过手指或者触控笔在安卓设备上面进行笔记记录或者在安卓设备上面进行素描之类类似于纸张上面的操作。当然了可能现在市场上已经存在了此类APP,或者此类的SDK,具体实现方式可能不一,有通过Canvas实现的或者OpenGL实现的,但如果没有系统层面支持的话,一般书写延迟都会相对较高,特别是屏幕越大,越明显,但博主对该SDK书写进行了验证,确实非常丝滑。
下面看下官方是如何描述的:
总结下可能就以下几点:
-
1、笔记书写,这个就不用多说了,主要功能。
-
2、低延迟,功能特色,同纸张上面书写一样流畅,号称延迟降低到了4ms,这一点其实博主是抱怀疑态度的,熟知安卓系统显示的同学可能都知道,要实现这一点,应该难度非常大,况且这个SDK还是通用的,当然也可能是实验性的特定设备吧,并不是所有设备都能达到4ms。
-
3、对于书写实现简单,但是几何图形方面可能会相对会困难一些。当然这一点博主是根据官方字面意思看到的,本篇主要是对书写方面进行了实现,实际博主还未进行几何图形方面的验证,但后续会持续进行该SDK探索,敬请期待。
添加Ink API依赖
libs.version.toml文件:
[versions]
ink = "1.0.0-alpha01"
input = "1.0.0-beta05"
[libraries]
ink-authoring = {group = "androidx.ink", name = "ink-authoring", version.ref = "ink"}
ink-brush = {group = "androidx.ink", name = "ink-brush", version.ref = "ink"}
ink-geometry = {group = "androidx.ink", name = "ink-geometry", version.ref = "ink"}
ink-nativeloader = {group = "androidx.ink", name = "ink-nativeloader", version.ref = "ink"}
ink-rendering = {group = "androidx.ink", name = "ink-rendering", version.ref = "ink"}
ink-strokes = {group = "androidx.ink", name = "ink-strokes", version.ref = "ink"}
input-motionprediction = {group = "androidx.input", name = "input-motionprediction", version.ref = "input"}
app下的build.gradle中添加:
dependencies {
//...
implementation(libs.ink.authoring)
implementation(libs.ink.brush)
implementation(libs.ink.geometry)
implementation(libs.ink.nativeloader)
implementation(libs.ink.rendering)
implementation(libs.ink.strokes)
implementation(libs.input.motionprediction)
}
代码实现
通过Ink API实现书写的时,我们需要用到SDK中的InProgressStrokesView控件,如下先将其添加到布局:
<androidx.ink.authoring.InProgressStrokesView
android:id="@+id/inProgressStrokesView"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
为了可持续验证与后续方便使用,这里我对InProgressStrokesView功能进行了封装,新建一个名为InProgressStrokesViewWrapper的类:
class InProgressStrokesViewWrapper(private var inProgressStrokesView: InProgressStrokesView):OnTouchListener{
//预测器,加速过程中会用到点的预测
private val predictor:MotionEventPredictor = MotionEventPredictor.newInstance(inProgressStrokesView)
//这个东西可以理解为笔形吧
private val defaultBrush = Brush.createWithColorIntArgb(
family = StockBrushes.pressurePenLatest,
colorIntArgb = Color.Black.toArgb(),
size = 10F,
epsilon =