Android EditText (TextView) 如何绘制闪烁的光标?

2024-04-08

我正在制作自己的蒙古竖字TextView (and EditText)通过扩展从头开始View。我试图了解闪烁光标是如何在Android TextView源代码 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java。它似乎是由一个处理mEditor的实例Editor class https://android.googlesource.com/platform/frameworks/base/+/37960c7/core/java/android/widget/Editor.java。在那堂课上我发现了一个drawCursor method:

private void drawCursor(Canvas canvas, int cursorOffsetVertical) {
    final boolean translate = cursorOffsetVertical != 0;
    if (translate) canvas.translate(0, cursorOffsetVertical);
    for (int i = 0; i < mCursorCount; i++) {
        mCursorDrawable[i].draw(canvas);
    }
    if (translate) canvas.translate(0, -cursorOffsetVertical);
}

显然,光标本身是一个Drawable https://developer.android.com/reference/android/graphics/drawable/Drawable.html某种类型的。

所以我正在寻找碎片,但我无法透过树木看到森林。有比我更了解这一点的人可以用简单的英语告诉我闪烁的光标是如何工作的吗?

以下是一些我不太明白的具体点:

  • 光标与光标的关系TextView (or EditText), Layout, Editor, and Drawable.
  • 每次光标闪烁时,是重新绘制所有文本还是仅重新绘制光标区域?

Note:

接受的答案回答了我提出的问题。然而,如果有人可以添加一个更规范的答案来更详细地解释事情,我很乐意接受不同的答案。


  1. EditText只是可编辑的TextView, Layout用于测量、计算以及文本的布局位置和方式。Drawable是不是只是为了保持光标的外观,稍后在Canvas.
  2. 仅光标Path is 无效的 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/TextView.java#L5237.

闪烁基本上是递归的Runnable that a Handler每 500 毫秒执行一次(猜测),以开关方式执行,并且在EditText有焦点。这也可以通过循环来实现ValueAnimatorint 类型,光标可绘制 alpha 将在 0 到 255 之间切换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android EditText (TextView) 如何绘制闪烁的光标? 的相关文章

  • Flutter 中的 AndroidManifest 中缺少默认通知通道元数据

    我在用firebase messaging 5 0 1软件包来实现推送通知 在 IOS 中一切正常 而在 Android 中 当我的移动应用程序在后台运行时 我收到通知 但它没有导航到相应的屏幕 它只是打开默认屏幕 如何实现到该特定屏幕的导
  • 如何在android网络库(ION)中使用自签名SSL?

    使用此网络库 https github com koush ion https github com koush ion 由于当前状态是开发 我想使用自签名 SSL 证书 图书馆论坛有一些讨论 https github com koush
  • Android上如何模拟后台Activity因内存不足而被系统杀死的过程?

    我正在处理 内存不足 不再有后台进程 问题 当这种情况发生时 我的活动处于后台并被杀死 我正在尝试保存并加载实例状态来解决它 但因为它并不是每次都会发生 在这种情况下我应该如何测试我的活动 Thanks 您可以通过 adb 强制进程终止 g
  • 使用一个 apk 安装两个应用程序

    我有 2 个应用程序 1 内容提供者 2 使用此 ContentProvider 的应用程序 我需要使用单个 apk 文件安装这 2 个应用程序 我想在 Eclipse 中同时推送这两个应用程序 如果我将另一个项目添加到一个应用程序的构建路
  • 从 arraylist 和 hashmap 中删除重复项

    我有一个数组列表 其中包含付款人的姓名 另一个数组列表包含每次付款的费用 例如 nameArray 尼古拉 劳尔 洛伦佐 劳尔 劳尔 洛伦佐 尼古拉 价格数组 24 12 22 18 5 8 1 我需要将每个人的费用相加 所以数组必须变成
  • 导入已经创建的sqlite数据库(xamarin)

    我正在使用 Xamarin 想知道如何导入我已经创建的 sqlite 数据库 到目前为止 我已将其添加到资产文件夹中 但不知道下一步从哪里开始 string localPath Path Combine System Environment
  • 如何访问android库项目中的资源

    我正在构建一个 android 库项目 它内部需要一些静态资源 图像 xml 等 然后我想知道我可以把这些资源放在哪里以及如何访问它们 既然我把资源放到了assets文件夹 我使用 AssetManager 来访问资源 public cla
  • android中根据屏幕尺寸计算图像尺寸

    我正在尝试根据屏幕尺寸计算图像高度和宽度 我从后端获取 5 x 7 尺寸的图像 为了将像素乘以 72 进行转换 我有 360 X 504 尺寸的图像 对于 360 X 504 我的动态透明矩形区域将显示为 1 223 x 1 179 即 8
  • Android PhoneGap 插件,UI 选项卡栏,调整 WebView 大小

    我正在创建一个美味的 PhoneGap 插件 希望一旦它能被打开 准备好了 插件基本完成了 我只需要一个漂亮的用户界面 相互作用 简而言之 我想创建一个 本机 android 工具栏组件 如果您实现 PhoneGap UIControls
  • 更改卡片高度即更改 Jetpack 中与 Material 3 组合的卡片颜色

    我正在使用 Card 可组合项 我希望它的颜色为白色 但是当我向它添加一些高度时 它的颜色会更改为更像主要容器颜色 我看过文档 其中有一种称为高程覆盖的东西 但找不到说明如何使用它的示例 这是我的代码 Card modifier Modif
  • onScale 事件后触发奇怪的 onScroll 事件

    我有一个同时使用 SimpleOnScaleGestureListener 和 SimpleOnGestureListener 的应用程序 每当我进行捏缩放时 我都会得到预期的 onScale 但是当我抬起时 我会看到一个奇怪的 onScr
  • 位图内存不足错误

    我对这个错误有疑问 我从 URL 制作网站图标解析器 我这样做是这样的 public class GrabIconsFromWebPage public static String replaceUrl String url StringB
  • Android:如何使用后台线程?

    我开发了一个应用程序 它从互联网获取内容并相应地在设备的屏幕上显示它 该程序运行得很好 就是有点慢 加载并显示内容大约需要 3 4 秒 我想将获取内容并将其显示在后台线程中的所有代码放在一起 当程序执行这些功能时 我想显示一个进度对话框 你
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 如何在 NumberPicker 中一次显示 3 个以上的值

    我正在创建一个数字选择器 如下图所示 但如果有可用空间 我想显示 3 个以上的值 该选择器有 20 个项目 并且有足够的空间来显示 3 个以上的值 这可以使用 NumberPicker 来完成吗 只需以编程方式设置numberPicker
  • 使用 Android Studio 进行调试永远停留在“等待调试器”状态

    UPDATE The supposed重复是一个关于陷入 等待调试器 执行时Run 而这个问题就陷入了 等待调试器 执行时Debug 产生问题的步骤不同 解决方案也不同 每当我尝试使用Android Studio的调试功能时 运行状态总是停
  • 即使 Android M 上的移动数据已打开(有连接),也可以通过 WiFi(无连接)发送请求

    我必须在没有互联网连接的情况下将 UDP 数据包发送到 WiFi 模块 配有自己的 AP 但是当我将手机连接到 AP 时 Android 会在移动数据接口上重定向我的数据包 因为它有互联网连接 我使用下面的代码来完成我的工作 但它似乎不适用
  • Android Root 执行 su 带参数

    我在使用参数执行 su 时遇到问题 包含空格 我的 Command java 看起来像这样 public class Command Process process public String executeCommand String c
  • 如何关闭 EditText 中的建议?

    如何在 Android 中关闭 EditText 中的建议 android inputType textNoSuggestions 根据this http comments gmane org gmane comp handhelds an
  • Fragment 生命周期和在不存在的 Fragment 上调用 onCreate 的问题

    我正在 Android 中测试片段 并且片段生命周期有一些令人困惑的行为 我有一个活动 在横向和纵向模式下使用 xml 布局 我有一些代码可以访问在片段布局之一中定义的 EditText 对象 如果我以横向模式启动应用程序 一切都会正常 我

随机推荐

  • Android:以编程方式从剪贴板中删除单个项目

    Android 剪贴板服务允许您将文本或其他项目添加到剪贴板中 在大多数 Android 设备上 Clipdata 项目将被插入到未定义最大内容数的堆栈中 我的问题如下 我有一个密码管理器应用程序 可以将选定的密码插入剪贴板 但由于密码是高
  • 如何在Delphi中一次正确地释放包含各种类型的记录?

    type TSomeRecord Record field1 integer field2 string field3 boolean End var SomeRecord TSomeRecord SomeRecAr array of TS
  • CompiledQuery 与 List.Contains (where...in list) 功能?

    我正在尝试使用 Linq to Entities 编写 CompiledQuery 它将替换采用两个数组 在本例中为逗号分隔的 TEXT 参数的存储过程 本质上 SQL 是这样的 Stored Proc definition ArrayPa
  • PHP 到期日期

    背景信息 我正在为游戏 garrys mod 创建一个捐赠 购买系统 当用户通过 paypal 捐赠时 我有 php 代码来处理 iPN 并将数据输入数据库 它还会生成一个序列密钥并将其通过电子邮件发送给用户 然后用户可以在游戏中输入该密钥
  • 玩!无法将 java 列表转换为 scala 列表

    我正在尝试将字符串列表从 java 控制器传递到 scala 模板 这是查看代码 public static Result index List
  • 如何从 JavaScript 通过 TCP 套接字进行通信?

    我正在考虑 AJAX 应用程序必须轮询更新是多么的限制 而 javascript 最好能够建立到服务器的真正的双向连接 我想知道是否有某种方法将 javascript 与浏览器插件集成 可以建立 TCP 连接 以便我可以将数据传入和传出浏览
  • 如果用户在 WPF 中键入任何内容,请检查密码框

    我在用PasswordBox我想检测用户何时输入任何内容 如果是 我需要将按钮状态更改为启用 如何检查用户是否输入任何内容 在里面PasswordBox 它的行为不同于TextBox因为你不能将它绑定到文本 当用户输入任何内容时会引发一些事
  • 是否可以通过 FTP 代理使用 C# FtpWebRequest?

    据我了解 FtpWebRequest Proxy属性表示 HTTP 代理 我必须通过 FTP 代理向外部服务器发出 FTP 请求 到目前为止 我实现此功能的唯一方法是创建一个使用 Windows FTP 命令的脚本并以这种方式下载 是否可以
  • 如何在 Angular 应用程序中存储身份验证令牌

    我有一个与 REST API 服务器通信的 Angular 应用程序 SPA 我有兴趣找到存储从 API 服务器返回的访问令牌的最佳方法 以便 Angular 客户端可以使用它来验证未来的请求到 API 出于安全原因 我想将其存储为浏览器会
  • 静态转换与动态转换

    假设我有一个充满继承性的 C 库 我得到了一个Base 当我知道它实际上指向一个函数时Derived对象和Derived继承Base 但我不知道它是什么类型的继承 公共 受保护 私有 我也不知道层次结构中是否有虚函数 鉴于这种情况 无需查看
  • 如何找到 Postgres / PostgreSQL 表及其索引的磁盘大小

    我从 Oracle 转到 Postgres 并寻找一种方法来查找表和索引大小 bytes MB GB etc 或者甚至更好的所有表的大小 在 Oracle 中 我有一个令人讨厌的长查询 它查看 user lobs 和 user segmen
  • 多重继承:包含 super() 调用的重写方法

    使用文件 super5 py class A def m self print m of A called class B A def m self print m of B called super m class C A def m s
  • 如何在数据库中存储很旧的日期?

    这实际上不是我遇到的问题 但想象一下有人正在建立一个有关中世纪的网站并想要存储日期 他们会如何做 MySQL 规范DATE说它不会低于 1000 年 当格式为YYYY MM DD 您如何存储有关的信息苏格兰国王肯尼思二世去世 http en
  • Bootstrap 4 无线电验证

    我需要在使用 Bootstrap 4 的页面中使用 Radio 元素进行表单验证方面的一些帮助 我需要在单选元素下方添加错误消息 div class invalid feedback Please choose an option div
  • 如何使用Control.FromHandle?

    我看到一个名为 Control FromHandle 的方法 它 应该 允许您访问它 现在 我想使用这段代码尝试一下 DllImport user32 dll SetLastError true static extern IntPtr F
  • write 函数在 Unix 上需要 unistd.h,那么 Windows 上呢?

    我已经从 Linux 计算机更改为 Windows 但在编译代码时遇到了问题 因为这两个操作系统不共享相同的头文件 由于unistd h没有明显包含在内 Visual C不知道什么read write close socklen t and
  • 当其中一个参数中有空格时,nodeJS child_process.spawn 不起作用

    我正在尝试使用child process spawn功能 语法是 child process spawn command args options 每当我在 args 数组的任何元素中包含空格时 该命令都会简单地发出参数 这是我用来测试它的
  • 适用于多个应用程序的 OWIN 身份验证服务器

    我正在实现一个解决方案 该解决方案具有 MVC 客户端 让我们在 localhost 4077 调用此 CLIENT 和 WebAPI 服务 在 localhost 4078 调用 API 我已经在 API 中实现了 OWIN OAuth
  • Roslyn:如何使用 Roslyn C# 获取声明语法的命名空间

    我有一个包含一些类文件的 C 解决方案 借助 Roslyn 我能够解析解决方案以获取解决方案中的项目列表 从那里 我可以获得每个项目中的文档 然后 我可以获得每个 ClassDeclarationSyntax 的列表 这是起点 foreac
  • Android EditText (TextView) 如何绘制闪烁的光标?

    我正在制作自己的蒙古竖字TextView and EditText 通过扩展从头开始View 我试图了解闪烁光标是如何在Android TextView源代码 https github com android platform framew