2017-02-17 50 views
1

我正在嘗試使用LinearGradients製作ComposeShader,但可能有幾個問題。
1)如果我只使用一個LinearGradient,如
lgA = new LinearGradient(0,0,0,h,0xff000000,0xffffffff,Shader.TileMode.CLAMP);
那麼上述的要求正確
2)部分如果使用ComposeShader那麼結果不會像實際需求如何將LinearGradients設置爲ComposeShader

實際需求量的:
enter image description here

那我該怎麼解決這個問題,請任何一個幫助我爲這個問題。

public class DrawGradient extends View { 

    Paint paint; 
    LinearGradient lgA; 
    LinearGradient lgB; 
    ComposeShader shader; 

    public DrawGradient(Context context) { 
     super(context); 
     initView(); 
    } 

    private void initView() { 
     setLayerType(View.LAYER_TYPE_SOFTWARE, null); 
     paint = new Paint(); 
     paint.setAntiAlias(true); 
     paint.setFilterBitmap(true); 

    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     super.onSizeChanged(w, h, oldw, oldh); 
     lgA = new LinearGradient(0, 0, w, h, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP); 
     lgB = new LinearGradient(0, h, w, 0, 0xffffffff, 0xff000000, Shader.TileMode.CLAMP); 
     shader = new ComposeShader(lgA, lgB, PorterDuff.Mode.MULTIPLY); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     paint.setShader(shader); 
     canvas.drawPaint(paint); 
    } 
} 

代碼輸出:
enter image description here

回答

0

由於這四個月,我想這將是幫不上什麼忙了,但在這裏它是其他任何人有類似的問題。

問題就出在這兩條線:

lgA = new LinearGradient(0, 0, w, h, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP); 
lgB = new LinearGradient(0, h, w, 0, 0xffffffff, 0xff000000, Shader.TileMode.CLAMP); 

您已經創建了兩個線性漸變;一個從左上到左下,另一個從左下到右上。你在找什麼:

lgA = new LinearGradient(0, 0, 0, h/2, Color.BLACK, Color.WHITE, Shader.TileMode.CLAMP); 
lgB = new LinearGradient(0, h/2, 0, h, Color.WHITE, Color.BLACK, Shader.TileMode.CLAMP); 

有了這些變化,它對我很有效。需要注意的是ComposeShader不會沒有行的工作是很重要的:

setLayerType(View.LAYER_TYPE_SOFTWARE, null); 

至於原因,解釋here

ComposeShader似乎主要用於覆蓋着色器(如LinearGradients),而不是創建您正在查找的三色過渡。或者,您可以單獨使用LinearGradient,但使用其他構造函數,它可以採用兩種以上不同的顏色。例如。

int[] colors = {Color.BLACK,Color.WHITE,Color.BLACK}; 
float[] pos = {0.0f,0.5f,1.0f}; 
paint.setShader(new LinearGradient(0,0,0,h,colors,pos,Shader.TileMode.CLAMP)); 

這會給你同樣的效果,而不需要ComposeShader。但是我在我自己的項目中使用了這種方法,但在漸變中使用Color.TRANSPARENT,並且它變黑而不是透明。