2012-06-09 4 views
1

У меня возникла проблема с заполнением ShapeDrawable, содержащим пользовательский PathShape с использованием метода drawable's setShaderFactory(). Следующий код работает отлично при рисовании RectShape:Как заполнить ShapeDrawable (содержащий PathShape) с градиентом

ShapeDrawable shape = new ShapeDrawable(); 
shape.setShape(new RectShape()); 
shape.setShaderFactory(new ShaderFactory() { 
    @Override 
    public Shader resize(int width, int height) { 
     LinearGradient gradient = new LinearGradient (0, 0, 
       width, height, Color.Red, Color.Blue, 
       TileMode.REPEAT); 
     return gradient; 
    } 
}); 

Когда я изменить RectShape к любому обычаю PathShape, однако, рисует заполняет всю форму с начальным градиентом цвета (красным) только. Другими словами, пользовательские фигуры рисуются правильно, но цвет совершенно неправильный. Кто-нибудь видел это раньше и знал, что может быть проблемой?

ответ

0

После эксперимента я обнаружил, что размер градиента должен быть связан со стандартной шириной и стандартной высотой PathShape, когда он создан и не имеет ничего общего с высотой и шириной ShapeDrawable. Это означает, что вы должны отслеживать стандартную ширину/высоту, которую вы назначаете для своего PathShape на весь срок службы ShapeDrawable, если он когда-либо изменен.

Хотя несколько безвкусный, вот решение:

public static final int STD_WIDTH = 20; 
public static final int STD_HEIGHT = 20; 

PathShape shape = new PathShape(myPath, STD_WIDTH, 
     STD_HEIGHT); 
ShapeDrawable drawable = new ShapeDrawable(); 
drawable.setShape(myPathShape); 
drawable.setShaderFactory(new ShaderFactory() { 
    @Override 
    public Shader resize(int width, int height) { 
     LinearGradient gradient = new LinearGradient (0, 0, 
       STD_WIDTH, STD_HEIGHT, Color.Red, Color.Blue, 
       TileMode.REPEAT); 
     return gradient; 
    } 
}); 
Смежные вопросы