with studio rectangle propiedades custom create android background android-linearlayout shapedrawable

studio - Comportamiento molesto para ShapeDrawable en Android



shape with background image android (1)

Al no tener ninguna sugerencia, lo único que soluciona las cosas por el momento es: - Hice un método en mis actividades, llamado invalidate () en el que para todos los diseños que quería actualizar, agregué layoutId.invalidate () - siempre que un diálogo de alerta es mostrado, call invalidate () - para todos los EditTexts enFocusChanged o onTextChanged, call invalidate ()

No es una solución bastante ergonómica, pero parece funcionar por ahora.

Estoy usando ShapeDrawable para el fondo LinearLayouts. Las formas están hechas por bacalao ya que necesito asignar colores dinámicamente a ellas, dependiendo de las condiciones. Aquí está mi forma personalizada

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); } }

Este CustomShapeDrawable se utiliza como StateListDrawable para mis diseños de esta manera:

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);

Todo se ve bien, el diseño tiene la misma forma con el color que quiero. Lo feo sucede cuando en la pantalla aparece otro elemento, como Keyboard o AlertDialog. Cuando mi aplicación vuelve a enfocarse, los diseños se vuelven locos con líneas aleatorias y artefactos en ellos. Esto es lo que quiero decir:

¿Qué puedo hacer para prevenir o corregir estos artefactos ya que se ven feos? No tengo idea de por qué sucede esto en primer lugar. Gracias por cualquier ayuda que pueda brindarme.