我们什么时候应该使用LAYER_TYPE_HARDWARE

Che*_*eng 10 android opengl-es

阅读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

我理解某些绘制操作不受GPU支持setShadowLayer.因此,我们需要切换到LAYER_TYPE_SOFTWARE,以便绘制将由软件执行.

但是,由于软件的屏幕外位图内存转移到GPU操作,因此事情可能会变慢.

何时使用LAYER_TYPE_NONE

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

何时使用LAYER_TYPE_HARDWARE

我不知道何时使用这种技术.在我们应该应用LAYER_TYPE_HARDWARE技术时,我们非常感谢任何一个例子.

p/s另外,我对LAYER_TYPE _...的理解可能看似错误.如果你发现任何错误,请纠正我.谢谢.

bit*_*ale 4

何时使用 LAYER_TYPE_HARDWARE

当我想绘制一个剪切父视图的文本(允许您看透它)时,我使用:

setLayerType(View.LAYER_TYPE_HARDWARE, null)
Run Code Online (Sandbox Code Playgroud)

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

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此输入图像描述

并且在不设置 LAYER_TYPE_HARDWARE 的情况下:

在此输入图像描述