【问题标题】:How to programmatically create background for LinearLayout如何以编程方式为 LinearLayout 创建背景
【发布时间】:2019-11-16 19:26:55
【问题描述】:

我有一个 LinearLayout,我想以编程方式设置背景。这个背景应该很简单,就是两个并排的长方形。矩形的宽度仅在运行时才知道。最好的方法是什么?

    ShapeDrawable done = new ShapeDrawable(new RectShape());
    done.setBounds(new Rect(0, 0, 0, 0));
    done.getPaint().setColor(Color.GREEN);

    ShapeDrawable remaining = new ShapeDrawable(new RectShape());
    remaining.setBounds(new Rect(20, 0, 0, 0));
    remaining.getPaint().setColor(Color.RED);

    LayerDrawable composite = new LayerDrawable(new Drawable[]{remaining, done});
    weightRow.setBackgroundDrawable(composite); 

我试图创建一个像这样的复合可绘制对象,我希望剩余的矩形从位置 20 开始,但它只是填充了整个布局。

【问题讨论】:

  • 我已经有一段时间没有使用LayerDrawable了,但据我记得,像LayerDrawable这样的可绘制容器可能会在该容器中的所有可绘制对象之间保持或合并状态(如边界)。

标签: android


【解决方案1】:

我会回答我自己的问题。在阅读了更多帖子后,我意识到,从 xml drawable 模拟 android:top, left, ... 您应该使用 LayerDrawable 的 setLayerInset(int index, int l, int t, int r, int b)您要移动的图层。

ShapeDrawable done = new ShapeDrawable();
done.getPaint().setColor(Color.GREEN);

ShapeDrawable remaining = new ShapeDrawable(new RectShape());
remaining.getPaint().setColor(Color.RED);

LayerDrawable composite = new LayerDrawable(new Drawable[]{done, remaining});
composite.setLayerInset(1, 0, 0, 100, 0);

layout.setBackgroundDrawable(composite);

【讨论】:

    【解决方案2】:

    您可以创建一个扩展 ShapeDrawable 的自定义类。实现onDraw() 方法来定义它应该如何绘制自己;您不能使用CanvasPaint API 以编程方式绘制矩形区域。然后,您可以定义一个方法来在运行时设置这些区域的宽度。

    在您的Activity 中,创建此类的新实例并在LinearLayout 上调用setBackgroundDrawable()

    【讨论】:

    • 嗨,谢谢你的回答,我已经试过了,但问题是它会缩放矩形之间的边界,所以看起来很模糊,我想要一个漂亮的锐边。
    • 这不是和你的绘图代码有关吗?我想不出更好的方法来完成你想要的,除非你只是将两个 Views 放在一个 LinearLayout 中并在运行时更改它们的布局权重(这要昂贵得多,因为它需要整个遍历视图层次结构在重绘之前重新测量和布局视图,而我的建议只涉及重绘)
    • 我相信这是一个缩放问题,矩形之间的边框可以说是抗锯齿的..无论如何..我有屏幕宽度,所以 x 轴上的缩放不会发生..所以我会那样做的。但我仍然希望看到对我的问题的评论。它不应该工作吗?我相信它应该。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多