为什么着色器不会出现在onDraw中?

时间:2016-01-05 19:42:53

标签: android performance opengl-es

我在`View.onDraw(Canvas canvas)中遇到过这种奇怪的行为。

当我执行以下代码时,我的着色器按预期工作:

@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   mGraphPaint.setShader(new LinearGradient(0, 0, 0, getHeight(), 0xFFEEB422, 0x00EEB422,
       Shader.TileMode.CLAMP));
   canvas.drawPath(path, mGraphPaint);

   // Rest of code
}

enter image description here

但请注意,每次调用都会创建LinearGradient的对象。

显而易见的解决方案:

private LinearGradient mShader = new LinearGradient(0, 0, 0, getHeight(), 0xFFEEB422, 0x00EEB422,
                Shader.TileMode.CLAMP);
@Override
protected void onDraw(Canvas canvas) {
   super.onDraw(canvas);
   mGraphPaint.setShader(mShader);
   canvas.drawPath(path, mGraphPaint);

   // Rest of code
}

enter image description here

然而,第二种方法似乎不起作用,我的问题是为什么?

1 个答案:

答案 0 :(得分:1)

好的,将评论升华为答案:

方法getHeight()在第一次调用onDraw(Canvas canvas)之前返回0,因此LinearGradient对象创建为0高度 - 因此它不会出现。