【问题标题】:Why the shader doesn't appear in onDraw?为什么着色器没有出现在 onDraw 中?
【发布时间】:2016-01-05 19:42:52
【问题描述】:

我在`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
}

但是请注意,每次调用都会创建一个 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
}

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

【问题讨论】:

  • onSizeChanged内调用mShader = new LinearGradient(0, 0, ...
  • @pskink 哇...这很好用,谢谢。关于为什么它在第二种方法中不起作用的问题对我来说仍然是一个谜。 :)
  • 因为getHeight() 返回 0
  • @pskink 永远猜不到!谢谢!
  • 然后将其转换为答案?

标签: android performance opengl-es


【解决方案1】:

好的,将 cmets 升华为答案:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-09
    • 1970-01-01
    相关资源
    最近更新 更多