2016-01-05 9 views
0

我在`View.onDraw(Canvas canvas)中遇到過這種奇怪的行爲。爲什麼着色器不出現在onDraw中?

當我執行下面的代碼我着色器按預期工作:但是

@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

調用'mShader = new LinearGradient(0,0,...''onSizeChanged'內部 – pskink

+0

@pskink WOW ...這個效果很好,謝謝。關於_Why_這個問題在第二種方法中無效對我來說還是一個謎。:) – NikolA

+2

因爲'getHeight()'返回0 – pskink

回答

1

OK,昇華各種意見,回答:

getHeight()返回0,前onDraw(Canvas canvas)被稱爲首次的方法,所以LinearGradient對象與0高度創造的 - 因此它不會出現。

相關問題