Android中可变形机器人的恼人行为

Android中可变形机器人的恼人行为,android,background,android-linearlayout,shapedrawable,Android,Background,Android Linearlayout,Shapedrawable,我使用ShapeDrawable作为线性布局背景。这些形状是由cod制作的,因为我需要根据条件动态地为它们指定颜色。 这是我的定制形状 public class CustomShapeDrawable extends ShapeDrawable { private final Paint fillpaint, strokepaint, linePaint = new Paint(); private int strokeWidth = 3; private final b

我使用ShapeDrawable作为线性布局背景。这些形状是由cod制作的,因为我需要根据条件动态地为它们指定颜色。 这是我的定制形状

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);
一切看起来都很好,布局与我想要的颜色形状相同。当我在屏幕上看到另一个元素时,丑陋的事情就会发生,比如键盘或对话框。当我的应用程序再次获得焦点时,布局会因为随机线条和工件而变得疯狂。 我的意思是:


我可以做些什么来防止或修复这些看起来很难看的工件。我一开始不知道为什么会这样。感谢您为我提供的任何帮助。

没有任何建议,现在唯一能解决问题的是: -我在活动中创建了一个名为invalidate()的方法,在该方法中,对于我想要刷新的所有布局,我添加了layoutId.invalidate() -每当显示alertdialog时,调用invalidate() -对于所有EditText onFocusChanged或onTextChanged,调用invalidate()

这不是一个完全符合人体工程学的解决方案,但目前看来似乎可行