Android canvas setShadowLayer大大降低了性能

时间:2012-01-05 21:14:38

标签: android performance canvas

我正在Android上编写一个画布应用程序,我正在寻找添加阴影,但是当我将它们添加到我的绘图对象时,我注意到了一个很慢的速度。我的代码很简单,看起来像这样:

...
Paint paint = new Paint();
paint.setShadowLayer(8.f, 0, 0, 0xff000000); // this line makes terribly slow drawing
canvas.drawRect(left, top, right, bottom, paint);

如何让它更快?

3 个答案:

答案 0 :(得分:2)

使用此代码可以获得几乎相同的结果:

mPaint.setMaskFilter(new BlurMaskFilter(20, BlurMaskFilter.Blur.OUTER));

答案 1 :(得分:2)

在挖掘周围找到加速我的大文字阴影的方法时,我偶然发现了这个问题并回答:

setShadowLayer Android API differences

使用:

  

myView.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

我大大加快了我应用中的所有文字阴影。

以下是我如何使用它的示例:

/**
 * Set a backlight (shadow) on the passed TextView.
 * @param textView
 */
void setBacklight(TextView textView) {
    if (textView != null) {
        float textSize = textView.getTextSize();

        textView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

        textView.setShadowLayer(textSize,0,0,getColor(R.color.color_backlight));
    }
}

根据这份文件:

https://developer.android.com/guide/topics/graphics/hardware-accel.html

它表示您可以禁用视图的硬件加速。

我不知道为什么,但不知怎的,这神奇地加速了我的TextView阴影层。

我知道,我知道。 Canvas或Paint类不存在该方法。因此,为了回答具体问题(所以我不会被所有人抨击......),您可以在View上设置您打算绘制画布。像这样:

void inTheShadows(View view) {
    float left = 0f;
    float top = 0f;
    float right = 10f;
    float bottom = 10f;
    Canvas canvas = new Canvas();
    Paint paint = new Paint();

    paint.setShadowLayer(8.f, 0, 0, 0xff000000);

    canvas.drawRect(left, top, right, bottom, paint);

    view.setLayerType(View.LAYER_TYPE_SOFTWARE,null);

    view.onDrawForeground(canvas);
}

答案 2 :(得分:1)

使用图像图标而不是绘制它:)

是阴影是昂贵的。