2017-02-17 49 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,并且它变黑而不是透明。