2012-04-26 2 views
6

Я использую ShapeDrawable для фона LinearLayouts. Формы сделаны треском, поскольку мне нужно динамически назначать цвета для них, в зависимости от условий. Вот мой заказ ФормаРаздражающее поведение для ShapeDrawable в Android

public class CustomShapeDrawable extends ShapeDrawable { 
    private final Paint fillpaint, strokepaint, linePaint = new Paint(); 
    private int strokeWidth = 3; 
    private final boolean disableBottomBorder; 

    public CustomShapeDrawable(Shape s, int fill, int stroke, int strokewidth, boolean disablebottomborder) { 
     super(s); 
     fillpaint = new Paint(this.getPaint()); 
     fillpaint.setColor(fill); 
     strokepaint = new Paint(fillpaint); 
     strokepaint.setStyle(Paint.Style.STROKE); 
     strokepaint.setStrokeWidth(strokewidth); 
     strokepaint.setColor(stroke); 
     linePaint.setStyle(Paint.Style.STROKE); 
     linePaint.setStrokeWidth(strokewidth + 1); 
     linePaint.setColor(fill); 
     strokeWidth = strokewidth; 
     disableBottomBorder = disablebottomborder; 

    } 

    public CustomShapeDrawable(Shape s, int fill, int stroke, boolean disablebottomborder) { 
     super(s); 
     fillpaint = new Paint(this.getPaint()); 
     fillpaint.setColor(fill); 
     strokepaint = new Paint(fillpaint); 
     strokepaint.setStyle(Paint.Style.STROKE); 
     strokepaint.setStrokeWidth(strokeWidth); 
     strokepaint.setColor(stroke); 
     linePaint.setStyle(Paint.Style.STROKE); 
     linePaint.setStrokeWidth(strokeWidth + 1); 
     linePaint.setColor(fill); 
     disableBottomBorder = disablebottomborder; 
    } 

    @Override 
    protected void onDraw(Shape shape, Canvas canvas, Paint paint) { 
     shape.resize(canvas.getClipBounds().right, canvas.getClipBounds().bottom); 
     shape.draw(canvas, fillpaint); 

     Matrix matrix = new Matrix(); 
     matrix.setRectToRect(new RectF(0, 0, canvas.getClipBounds().right, canvas.getClipBounds().bottom), new RectF(strokeWidth/2, strokeWidth/2, canvas.getClipBounds().right - strokeWidth/2, 
       canvas.getClipBounds().bottom - strokeWidth/2), Matrix.ScaleToFit.FILL); 
     canvas.concat(matrix); 

     shape.draw(canvas, strokepaint); 

     if (disableBottomBorder) { 
      canvas.drawLine(0 + strokeWidth/2, shape.getHeight(), shape.getWidth() - strokeWidth/2, shape.getHeight(), linePaint); 
     } 
    } 

Этот CustomShapeDrawable используется как StateListDrawable для моих макетов, как это:

 RoundRectShape shapeTopCorners = new RoundRectShape(new float[] { 10, 10, 10, 10, 0, 0, 0, 0 }, null, null); 
     ShapeDrawable shapeTopCornersNormal = 
       new CustomShapeDrawable(shapeTopCorners, Global.getFleet().getSkins().getBackgroundcolour(), context.getResources().getColor(R.color.item_line), true); 
     ShapeDrawable shapeTopCornersPressed = 
       new CustomShapeDrawable(shapeTopCorners, context.getResources().getColor(R.color.menu_grey), context.getResources().getColor(R.color.item_line), true); 

     StateListDrawable stateTopCornersRounded = new StateListDrawable(); 
     stateTopCornersRounded.addState(new int[] { android.R.attr.state_focused }, shapeTopCornersPressed); 
     stateTopCornersRounded.addState(new int[] { android.R.attr.state_pressed }, shapeTopCornersPressed); 
     stateTopCornersRounded.addState(new int[] {}, shapeTopCornersNormal); 

Все выглядит нормально, макет имеет ту же форму с цветом я хочу. Уродливая вещь случается, когда на экране появляется другой элемент, например Keyboard или AlertDialog. Когда мое приложение снова получает фокус, макеты сходят с ума от случайных строк и артефактов на них. Вот что я имею в виду:

enter image description here

Что я могу сделать, чтобы предотвратить или устранить эти артефакты, как они выглядят некрасиво. Я понятия не имею, почему это происходит в первую очередь. Спасибо за любую помощь, которую вы можете мне предоставить.

ответ

1

У меня нет предложений, единственное, что исправляет на данный момент: - Я сделал метод в своих действиях, называемый invalidate(), в котором для всех макетов, которые я хотел обновить, я добавил layoutId.invalidate() - всякий раз, когда alertdialog показано, Invalidate вызов() - для всех EditTexts onFocusChanged или OnTextChanged, вызов Invalidate()

Не совсем эргономичное решение, но это, кажется, работает на данный момент.

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