首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我们什么时候应该使用LAYER_TYPE_HARDWARE

我们什么时候应该使用LAYER_TYPE_HARDWARE
EN

Stack Overflow用户
提问于 2014-11-26 13:21:36
回答 2查看 5.5K关注 0票数 14

http://developer.android.com/guide/topics/graphics/hardware-accel.html上阅读之后,我对3种不同类型的分层技术的理解是(假设设备有GPU)

  • LAYER_TYPE_SOFTWARE -绘图是通过软件在软件的屏幕外位图存储器上执行的.然后,软件的屏幕外位图将传输到GPU。GPU在屏幕上渲染位图。
  • LAYER_TYPE_NONE - GPU将直接在屏幕上绘图.
  • LAYER_TYPE_HARDWARE -绘图由GPU在GPU的屏幕外位图存储器上执行.GPU的屏幕外位图将由GPU呈现到屏幕上.

何时使用LAYER_TYPE_SOFTWARE

我的理解是,setShadowLayer这样的GPU不支持某些绘图操作。因此,我们需要切换到LAYER_TYPE_SOFTWARE,以便绘图将由软件执行。

然而,由于有软件的屏幕外位图内存转移到GPU操作,事情可能看起来更慢。

何时使用LAYER_TYPE_NONE

我认为这是大多数设备的默认设置。所以,我想我们大多数时候都应该使用这种技术。

何时使用LAYER_TYPE_HARDWARE

我不知道什么时候该用这个技巧。任何例子都是非常感谢的,关于什么时候我们应该应用LAYER_TYPE_HARDWARE技术。

另外,我对LAYER_TYPE_...的理解可能是错误的。如果你发现任何错误,请纠正我。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2018-10-29 19:43:31

何时使用LAYER_TYPE_HARDWARE

当我想要绘制一个删除父视图的文本(允许您看穿它)时,我使用:

代码语言:javascript
复制
setLayerType(View.LAYER_TYPE_HARDWARE, null)

例如,在我的自定义视图中:

代码语言:javascript
复制
init {
    setLayerType(View.LAYER_TYPE_HARDWARE, null)
}

private val textPaint = TextPaint(ANTI_ALIAS_FLAG).apply {
    textSize = size
    xfermode = PorterDuffXfermode(PorterDuff.Mode.CLEAR)
}

override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
    createTextLayout(MeasureSpec.getSize(widthMeasureSpec))
    setMeasuredDimension(widthMeasureSpec, heightMeasureSpec)
}

private fun createTextLayout(textWidth: Int) {
    textLayout = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
        StaticLayout.Builder
                .obtain(text, 0, text.length, textPaint, textWidth)
                .setAlignment(Layout.Alignment.ALIGN_CENTER)
                .build()
    } else {
        StaticLayout(text, textPaint, textWidth, Layout.Alignment.ALIGN_CENTER, 1f, 0f, true)
    }
}

...

override fun onDraw(canvas: Canvas?) {
    canvas?.drawCircle(width / 2f, height / 2f, width / 2f, circlePaint)

    canvas?.withTranslation(
            x = width / 2f - textLayout.width / 2f,
            y = height / 2f - textLayout.height / 2f
    ) {
        textLayout.draw(canvas)
    }
}

结果:

并且不设置LAYER_TYPE_HARDWARE:

票数 4
EN

Stack Overflow用户

发布于 2019-01-14 09:00:28

基本上就像一个绘图缓存。如果您的自定义视图呈现/绘制成本很高,但内容变化不太频繁,那么我将使用该标志。否则,你就会无缘无故地把设备压出高速缓存。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27150353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档