EditText 随选择缩放

2024-03-27

我有一个EditText我想缩放它并滚动setScaleX/setScaleY它工作正常 - 文本正在正确的位置进行编辑。

但是当我尝试选择文本时 - 它会将选择手柄绘制到位置,就像文本未缩放时一样。我们都知道bug https://code.google.com/p/android/issues/detail?id=57408.

这是预期的结果,因为句柄是在与视图大小相关的弹出窗口上绘制的。

所有操作均在android.widget.Editor都针对其领域private TextView mTextView;。如果我们通过反射设置自己的编辑器,我不知道如何处理不可重写的私有方法。

弹出窗口上还绘制了选择手柄android.widget.Editor.HandleView#HandleView在布局中计算的坐标,我只需要DynamicLayout但对于我们的目的来说没有什么区别。

Method android.text.Layout#getPrimaryHorizontal(int, boolean)是公共的,它的值可以按比例倍增,但为此我们需要扩展和重写私有方法android.widget.TextView#makeSingleLayout,但这是一个问题。

我们也可以使用所有必需的重写方法来实现我们自己的布局,但是我们可以重写的所有方法都标记为@hide注解,并且没有可以通过反射访问的字段。

下一个屏幕截图显示为缩放 2 倍

PS:任务的上下文是一个具有捏合缩放编辑文本的编辑器。通过计算大小来重新布局文本并不是解决方案。因为我需要每个屏幕尺寸的便携式文档。


你可以使用度量影响跨度 https://github.com/android/platform_frameworks_base/blob/master/core/java/android/text/style/MetricAffectingSpan.java。这是一个示例类:

package android.text.style;

import android.os.Parcel;
import android.text.ParcelableSpan;
import android.text.TextPaint;
import android.text.TextUtils;

public class AbsoluteSizeSpan extends MetricAffectingSpan implements ParcelableSpan {

    private final int mSize;
    private boolean mDip;

    /**
     * Set the text size to <code>size physical pixels.
     */
    public AbsoluteSizeSpan(int size) {
        mSize = size;
    }

    /**
     * Set the text size to <code>size physical pixels,
     * or to <code>size device-independent pixels if
     * <code>dip is true.
     */
    public AbsoluteSizeSpan(int size, boolean dip) {
        mSize = size;
        mDip = dip;
    }

    public AbsoluteSizeSpan(Parcel src) {
        mSize = src.readInt();
        mDip = src.readInt() != 0;
    }

    public int getSpanTypeId() {
        return TextUtils.ABSOLUTE_SIZE_SPAN;
    }

    public int describeContents() {
        return 0;
    }

    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mSize);
        dest.writeInt(mDip ? 1 : 0);
    }

    public int getSize() {
        return mSize;
    }

    public boolean getDip() {
        return mDip;
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }
    }

    @Override
    public void updateMeasureState(TextPaint ds) {
        if (mDip) {
            ds.setTextSize(mSize * ds.density);
        } else {
            ds.setTextSize(mSize);
        }
    }
}

参考:Java源代码仓库项目 http://alvinalexander.com/java/jwarehouse/android/core/java/android/text/style/AbsoluteSizeSpan.java.shtml

你需要玩度量影响跨度 http://developer.android.com/reference/android/text/style/MetricAffectingSpan.html and 换行(CharacterStyle cs) http://developer.android.com/reference/android/text/style/CharacterStyle.html- 这使得字符样式应用于给定跨度的单个区域。

在你的子类中,重写onTouch并将其值传递给缩放手势检测器。将检测到的比例存储为成员变量。

覆盖onDraw,并致电画布.scale() https://stackoverflow.com/questions/21546762/how-to-pinch-zoom-an-edittext-in-android在致电之前使用您的比例值超级onDraw。正如您可以在绝对尺寸跨度, using AbsoluteSizeSpan(地块源)会得到您想要调整大小的文本,然后您应用更新绘制状态.

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

EditText 随选择缩放 的相关文章

随机推荐

  • 从标头自动生成 C 代码

    我想生成头文件中定义的过程的空实现 理想情况下 它们应该为指针返回 NULL 为整数返回 0 等 并且在理想的情况下 还可以打印到 stderr 调用了哪个函数 这样做的动机是需要实现一个包装器 将复杂的现有 API 头文件 的子集适配到另
  • 适用于 i18n 的 FuelPHP ORM 数据库架构,意见/建议

    虽然这个问题可能是similar https stackoverflow com questions 929410 what are best practices for multi language database design to
  • CSS Sprite + 背景大小:覆盖

    有没有办法使用背景尺寸 封面在加载了 CSS Sprite 的图像上 示例代码 class img sprite background image url images sprite img png background repeat no
  • linux cron 作业是否应该用“&”指定以指示在后台运行? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 在 crontab 文件中 是否应该使用尾随 来指定命令 还是命令会在后台运行 I have 20 home me monitor check sh
  • Symfony2:警告:spl_object_hash() 期望参数 1 为对象,给定整数

    我在实体之间有多对一的关系Project and Course因为每门课程可以有许多项目 所以许多项目可能与同一门课程相关 这些是我的实体 class Project ORM Id ORM Column type integer ORM G
  • 图书馆项目是否合并清单文件?

    我正在考虑创建一个核心应用程序库 一个包含所有逻辑的库项目 一个免费版本 和一个使用该库的完整版本 据我了解 清单中的某些内容不会合并 例如权限和活动 版本代码是否合并 我可以在库中放置一个版本代码来同时应用于免费和付费版本吗 第二个问题是
  • 如何在 Shiny 中更改输入后保留滚动位置

    在 Shiny 中 我使用带有大量项目的水平 radioGroupButtons 输入 如果单击其中一项 按钮标签的颜色会发生变化 这实际上很好用 但是 如果我单击最后一项 以便滚动到最右侧 则滚动位置将重置 因此 每次单击后 如果我想继续
  • Hibernate 将重复项插入到 @OneToMany 集合中

    我有一个关于 Hibernate 3 6 7 和 JPA 2 0 的问题 考虑以下实体 为简洁起见 省略了一些 getter 和 setter Entity public class Parent Id GeneratedValue pri
  • Mono mkbundle 工具无法创建二进制文件,并抱怨输出文件不可用

    根据来自的建议这个线程 https stackoverflow com questions 551554 can you compile c without using the net framework在运行没有 NET 的 C 应用程序
  • postgresql 存储过程开始提交结束

    实际上 在执行 postgresql 存储过程时我很困惑 我从某处学到了以下内容 create or replace procedure update dba trades language plpgsql as begin CODE BL
  • 完成部分网格并使其不漏水

    我正在从 RealSense 相机捕获点云 并使用 Trimesh 库将它们转换为网格 问题是我只能从中得到一个不防水的网格 如何 完成 网格并使其防水 I tried trimesh repair broken faces mesh co
  • jquery切换 - 在切换功能之间切换?

    大家好 我喜欢 jquery 的切换功能 然而目前我面临一个小问题 我不知道如何以最好的方式解决它 我有一个名为 searchbox 的 div 它取决于用户设置是隐藏还是可见 如果我单击按钮 则触发的切换功能应该是 slideDown s
  • 创建Python包并导入模块

    我正在尝试编写我的第一个 Python 包 几乎所有模块都需要使用 NumPy 我应该写吗import numpy在每个模块中或者包中是否有某个地方我可以将其导入一次 以便每个模块都可以使用它 最好的方法是什么 是的 只需将其导入到需要的地
  • 在 iTunes Connect 中提交应用程序时附加屏幕截图的顺序

    我目前正在提交我的应用程序以供审核 并且我已经上传了主屏幕截图 但不确定如何让我的其他屏幕截图以正确的顺序显示 您必须在上传之前将它们全部选择 并且没有任何指示它们的顺序 有人可以告诉我您是否需要按正确顺序或相反顺序选择屏幕截图吗 以相反的
  • Cloud Dataflow 中的作业失败:启用 Dataflow API

    我目前正在尝试将 Dataflow 与 Pub Sub 结合使用 但收到此错误 工作流程失败 原因 6e74e8516c0638ca 刷新您的凭据时出现问题 请检查 1 为您的项目启用Dataflow API 2 您的项目有一个机器人服务帐
  • 在 Visual Studio 2010 项目中包含外部库

    我是视觉工作室的新手 似乎无法在任何地方找到这个问题的答案 我正在使用 VS2010 进行 VC 项目 我有另一个项目构建到 lib 文件中并设置为参考 但无法弄清楚如何实际包含标头 事实证明谷歌毫无用处 请帮忙 通常 这是通过将包含文件所
  • qt/c++ 动态命名变量

    我正在为我的一项大学作业在 Qt 中开发一个 html 编辑器 并且我在某些变量的命名方面遇到了问题 问题是这样的 当用户决定加载他们的 项目 时 程序会迭代该文件夹并查找其中有多少个 html 文件 然后它会创建要显示的选项卡 我有一个自
  • Symfony2 Assetic 路由和资源错误

    我有一个模板 例如index html php 我在其中使用 php assetic 加载器 如下所示 如果我对模板文件进行任何更改 我会得到路线 assetic 2b431f4 不存在 如果我改变 assetic use controll
  • C 中逐个字符读取文件

    我正在用 C 语言编写 BF 解释器 但在读取文件时遇到了问题 我以前用过scanf为了读取第一个字符串 但是你的 BF 代码中不能有空格或注释 现在这就是我所拥有的 char readFile char fileName FILE fil
  • EditText 随选择缩放

    我有一个EditText我想缩放它并滚动setScaleX setScaleY它工作正常 文本正在正确的位置进行编辑 但是当我尝试选择文本时 它会将选择手柄绘制到位置 就像文本未缩放时一样 我们都知道bug https code googl