V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
faywong8888
V2EX  ›  Android

android 有无可能在 c/c++层,且非主线程内做文本的排版,测量( measure)?

  •  
  •   faywong8888 · 2015-12-03 10:47:24 +08:00 · 9286 次点击
    这是一个创建于 3284 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如会涉及到前几个字 font-size 为 20px ,其他的字为 14px ,然后自动换行之类的需求。除了在 Java 层创建 TextView 然后强制调用其 measure 函数外,还有其他更简便且可在 c/c++层,非主线程做排版和测试的方法吗?

    11 条回复    2015-12-21 19:35:57 +08:00
    CodingPuppy
        1
    CodingPuppy  
       2015-12-03 10:57:55 +08:00
    据本菜所知, textview 也是通过 canvas.drawtext 调用到 native 层处理的字体纹理渲染,但是排版貌似是在 java 层做的吧?。。貌似有个叫 Layout.java 的类
    zs53dada
        2
    zs53dada  
       2015-12-03 11:16:56 +08:00
    java 层难道不不比 c++简单吗。。 Html.from(把你的文字设置称为富文本); 直接 settext(html.from(xxx));
    aa23
        3
    aa23  
       2015-12-03 11:26:27 +08:00 via Android
    同意二楼, lz 可以追踪一下 charsquence
    faywong8888
        4
    faywong8888  
    OP
       2015-12-03 12:04:37 +08:00
    @zs53dada
    @CodingPuppy
    Java 层的方法我都会。现在的关键是 Java 层的方法需要在主线程,没法与 workder 线程的其他逻辑并发,遇到复杂排版的文字时吞吐量比较低,性能差。且我其他的逻辑都在 c 层。
    ffffwh
        5
    ffffwh  
       2015-12-03 12:39:24 +08:00 via Android
    获取字体信息然后自己 /用库去算?
    ahtsiu
        6
    ahtsiu  
       2015-12-03 14:22:49 +08:00
    Paint 类里有 measureText 方法,不限定在主线程里做
    r00tt
        7
    r00tt  
       2015-12-03 14:46:31 +08:00
    TextPaint 就可以去测量咯,随便放哪个线程
    binsys
        8
    binsys  
       2015-12-05 22:36:49 +08:00
    除非自己绘制文字,否则需要 android 的引擎字体你就必须调用 skia 的东西吧
    Cryse
        9
    Cryse  
       2015-12-19 20:13:18 +08:00 via Android
    @faywong8888
    用 StaticLayout 或者 DynamicLayout, 在其他线程创建,然后用自定义 View 在主线程画出来就行了。
    复杂长文本直接用 TextView 性能很差…
    faywong8888
        10
    faywong8888  
    OP
       2015-12-21 19:25:01 +08:00
    @Cryse
    首先非常感谢你的回答。 React Native 里边的文字排版就是用的 StaticLayout 。
    但是这样弄我需要提前将富文本自己一个个 parse 然后转成 SpannableString 的吧?
    faywong8888
        11
    faywong8888  
    OP
       2015-12-21 19:35:57 +08:00
    @Cryse 相当于 new StaticLayout(Html.from(html)),这样子去做。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2539 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 18ms · UTC 01:28 · PVG 09:28 · LAX 17:28 · JFK 20:28
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.