【发布时间】:2019-05-28 00:15:24
【问题描述】:
我是语言学家,不是程序员。在一个例子、几本书和这个论坛的帮助下,我为少数民族语言创建了一个自定义键盘,并成功地将背景从难看的黑色变成了自定义颜色。
现在我注意到键盘上的字母键(如“a”、“ǝ”、“b”)看起来很模糊。我只注意到,因为“特殊键”上的符号看起来超级清晰。所以请看我下面的截图:
我没有对按键上的“文本”做任何技巧。我没有提供特殊字体;我猜我的键盘应用程序正在应用像 Noto 这样的默认系统字体。对于这种语言,可以使用所有“特殊字符”,如 ɖ、Ɖ、ŋ、Ŋ、ǝ、Ǝ、ɛ、Ɛ、ɩ、Ɩ、ɔ、Ɔ、ʊ、Ʊ,它们呈现良好(仅模糊)。我在这里列出它们以说明为什么这种语言确实需要自定义键盘。这个问题与(仅)数千名 WhatsApp、Facebook 和 Android 用户有关。
这是来自“普通”手机的屏幕截图:没有特殊的系统字体,没有 root,正常的 Android 6.0,屏幕分辨率 1280 x 720,屏幕截图由内置工具截取,然后在 GIMP 中为您缩放到 400%(没有当然是任何插值)并保存为无损 PNG。
请注意“特殊符号”如何在需要的地方(圆角和对角线)进行一些合理的抗锯齿,以及“ŋ”、“q”和“1”上的垂直向下笔划如何表明存在 un - 需要对所有字母应用抗锯齿(?)。这种行为在整个键盘上是一致的:所有字母模糊,而所有符号清晰。
我可以在几部不同的手机(真实硬件)上重现此问题,例如在具有 800 x 480 像素屏幕的 Android 4.4.2 上,它看起来更糟。
更新 1:从用户评论中提示我去看看我的“特殊字符”,如大写锁定和键盘隐藏(如屏幕截图所示)。我惊讶地发现这些只是 png 文件,而且我在 drawable-subfolders 中有很多这些文件,比如 24x24px 到 96x96px 的 drawable-xhdpi。几周前,我从一些公开的谷歌图标中得到了它们。因此,如果我不厌其烦地为我的 4 x 39 键中的每一个为 6 种不同的屏幕尺寸(936 个文件供那些在弄清楚这一点之前无法移动的读者提供 936 个文件)制作清晰的 png 图像,那么我会有至少是一种蛮力解决方法,但并不是真正回答“邪恶模糊的地方和原因?”。
Android 世界中的“Going bitmap”在第一部手机(我相信从 Android 8 开始可用)终于获得矢量可绘制对象的情况下感觉不对。谁知道呢,那里的屏幕可能会在那些 24x24px 或 96x96px PNG 上变成僵尸,并且渲染得比我在硬件上看到的还要糟糕......:1 etadpU
现在我将我的数据给出,如果您想看更多,请大声喊叫。
从我的文件 \app\src\main\res\xml\qwerty.xml 我给你屏幕截图中显示的行加上介绍:
<?xml version="1.0" encoding="utf-8"?>
<Keyboard xmlns:android="http://schemas.android.com/apk/res/android"
android:keyWidth="10%p"
android:horizontalGap="0px"
android:verticalGap="0px"
android:keyHeight="@dimen/key_height"
>
<Row>
<Key android:codes="119" android:keyLabel="w" android:keyEdgeFlags="left"/>
<Key android:codes="331" android:keyLabel="ŋ" android:popupKeyboard="@xml/keyboard_popup_template" android:popupCharacters="ŋɲ"/>
<Key android:codes="99,231" android:keyLabel="c" android:popupCharacters="cç©" android:popupKeyboard="@xml/keyboard_popup_template"/>
...
</Row>
<Row>
<Key android:codes="-1" android:keyIcon="@drawable/baseline_keyboard_capslock_black_24"
android:keyWidth="15%p" android:isModifier="true"
android:isSticky="true" android:keyEdgeFlags="left"/>
<Key android:codes="113" android:keyLabel="q"/>
...
</Row>
<Row android:rowEdgeFlags="bottom">
<Key android:codes="-3" android:keyIcon="@drawable/baseline_keyboard_hide_black_24"
android:keyWidth="15%p" android:keyEdgeFlags="left"/>
<Key android:codes="-2" android:keyLabel="123" android:keyWidth="10%p"/>
</Row>
这是我的 \app\src\main\res\layout\input.xml :
<?xml version="1.0" encoding="utf-8"?>
<org.gasana.android.aniikeyboard.LatinKeyboardView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/keyboard"
android:layout_alignParentBottom="true"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:keyBackground="@drawable/samplekeybackground"
android:keyTextColor="#000000"
android:popupLayout="@layout/popup"
/>
我的背景不是位图而是 xml 定义的,这里是你看到应用的“正常”(未按下)文件 \app\src\main\res\drawable\normal.xml在截图中:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<stroke android:width="1dp" android:color="#A1B7F7" />
<solid android:color="#C7D4FA"/>
</shape>
我在另一个问题中看到,模糊可能与抗锯齿和对齐有关。所以现在我需要帮助来检查这是否是我在 Android-Context 中的问题,它发生在哪里以及如何解决它:
Blurred bitmap/embedded text when scrolling in TextField? (Flash/AS3)
我已准备好引用更多代码并回答您的后续问题。请帮助我更接近问题。谢谢。
【问题讨论】:
-
我不熟悉开发自定义键盘,我只注意到一件事——外观清晰的键有一个 keyIcon 分配给它们,它(可能)是一个可绘制的矢量。但我不认为您必须为每个普通键提供一个图标,因此这种观察可能用途有限且有用。
-
@Ridcully 哎呀,我差点对你撒谎(并且不得不删除我的第一个回复)。我查了一下,试图编辑我的问题,并想展示一个“特殊字符向量文件”的例子。我惊讶地发现它只是一个不起眼的 png 文件。将编辑我的问题。这很有帮助!
-
不客气。但是,我认为没有必要为每个键提供一个可绘制对象......此外,弹出字符是否也呈现模糊?因为对于那些,我认为您甚至无法提供可绘制对象。
-
@Ridcully 我刚刚再次检查:是的,弹出窗口也很模糊。没有测量但肉眼看起来一样。对我来说并不奇怪,因为它们可能是通过相同的技术渲染的。
标签: android android-softkeyboard text-rendering