【问题标题】:Nine patch on a custom viewgroup自定义视图组上的九个补丁
【发布时间】:2023-04-06 12:48:01
【问题描述】:

我制作了一个九补丁和一个自定义视图组,然后我将该视图组的背景设置为九补丁。

问题是:九个补丁忽略了“内容区”的设置。

那么:如何在自定义视图中正确使用九补丁?

或者:

如何从九个补丁中获取内容区域,以便在 OnMeasure 和 OnLayout 数学中使用它?

【问题讨论】:

    标签: android custom-view viewgroup nine-patch


    【解决方案1】:

    还可以在 NinePatchDrawable 上使用 boolean getPadding(Rect padding) 来获取内容的填充(您的内容 + 9patch 填充 = 总组大小)

    【讨论】:

    • 完全正确的遮阳篷,谢谢 :) 太糟糕了,Android 文档很烂,没有正确解释。
    【解决方案2】:

    您可能需要通过覆盖其 onDraw 方法直接在 ViewGroup 上绘制对象:

    public void onDraw(Canvas canvas) {
     NinePatchDrawable bg =  (NinePatchDrawable) resources.getDrawable(id);
     if (bg != null) {
      bg.setBounds(0, 0, getWidth(), getHeight());
      bg.draw(canvas);
      }
     }
    

    【讨论】:

    • 这样做并不能解决问题。
    • 你是说你试过了但没用?它应该,假设您在调用 getDrawable() 时提供了正确的 id
    【解决方案3】:

    在 onMeasure 中获取背景的填充以减小可用宽度(这是用于在网格中布置单元格):

        @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        Drawable background = getBackground();
        Rect padding = new Rect();
        if (background != null && background.getPadding(padding));
    
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int availableWidth = width - padding.left - padding.right;
    

    对于 onLayout,应用填充:

        @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        int availableWidth = r - l - getPaddingLeft() - getPaddingRight();
    

    【讨论】:

      猜你喜欢
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多