2017-02-17 15 views
1

Я пытаюсь сделать ComposeShader с помощью LinearGradients, но может иметь мало проблем.
1) Если я использую только один LinearGradient, например
lgA = новый LinearGradient (0, 0, 0, h, 0xff000000, 0xffffffff, Shader.TileMode.CLAMP);
затем над частью требования правильного
2) Если использовать ComposeShader то результат не нравится фактические требованияКак установить LinearGradients в ComposeShader

Фактический Requirment:
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 в градиенте, и он вышел черным, а не прозрачным.

 Смежные вопросы

  • Нет связанных вопросов^_^