Android:自定义视图

Android:自定义视图,android,android-layout,Android,Android Layout,我正在尝试创建一个方形的自定义视图,使用宽度作为高度。我还使用了一个预定义的布局,我将其膨胀为UI。一旦我覆盖了测量,自定义视图就不再显示。这是我的密码: public class MyView extends RelativeLayout{ public MyView(Context context) { super(context); addView(setupLayout(context)); } public MyView(Co

我正在尝试创建一个方形的自定义视图,使用宽度作为高度。我还使用了一个预定义的布局,我将其膨胀为UI。一旦我覆盖了测量,自定义视图就不再显示。这是我的密码:

public class MyView extends RelativeLayout{

    public MyView(Context context) {
        super(context);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs) {
        super(context, attrs);
        addView(setupLayout(context));
    }

    public MyView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        addView(setupLayout(context));
    }

    private View setupLayout(Context context) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View myView = inflater.inflate(R.layout.view_layout, null);
        return myView;
    }

    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(widthMeasureSpec));
    }

}
我有两个问题:

  • 如何覆盖onMeasure,使其以我期望的方式绘制视图
  • 在视图层次结构方面,是否有任何方法可以提高效率(即,不要将RelativeLayout放在RelativeLayout中)

  • 您可以从以下位置使用此代码:


    或者尝试使用library project。

    您可以从以下位置使用此代码:


    或者尝试使用library project。

    @trumpetlicks。你的第二点是什么?这是一个奇迹。其中有一个不同类的构造函数(MenuButton)。@NobuGames我想这是作者类的简化版本。作者觉得有必要更改类名,他们只是忘记了更改构造函数的名称。没有必要挖苦人,我也愿意猜测你也不是完美的。@Sam,你是对的。我是在讽刺。但我的意图实际上是指出一个明显的错误。我并不总是认为人们在这里的问题描述是理所当然的,并试图在代码本身中看到问题。“你是对的,我并不完美,因为我忘了这可能只是一些编辑错误。”特朗普利克斯。你的第二点是什么?这是一个奇迹。其中有一个不同类的构造函数(MenuButton)。@NobuGames我想这是作者类的简化版本。作者觉得有必要更改类名,他们只是忘记了更改构造函数的名称。没有必要挖苦人,我也愿意猜测你也不是完美的。@Sam,你是对的。我是在讽刺。但我的意图实际上是指出一个明显的错误。我并不总是认为人们在这里的问题描述是理所当然的,并试图在代码本身中看到问题。你是对的,我不是完美的,因为我忘记了这可能只是一些编辑错误。不要复制其他用户的答案!这是禁止的吗?我们在这里作为社区互相帮助,主要目标是共享信息!!无论如何,我已经用原始答案的链接编辑了我的答案。共享答案不是复制答案并将其作为自己的答案传递,而没有任何原始来源的链接。我看不到你的答案有任何修改。我在编辑中已经明确了归属,所以你以后在参考其他答案时可以遵循这种风格。但是,如果这个问题真的可以由另一个问题的答案来回答,那么这些问题本身可能是重复的,因此在这种情况下,你也可以投一票。不要复制其他用户的答案!这是禁止的吗?我们在这里作为社区互相帮助,主要目标是共享信息!!无论如何,我已经用原始答案的链接编辑了我的答案。共享答案不是复制答案并将其作为自己的答案传递,而没有任何原始来源的链接。我看不到你的答案有任何修改。我在编辑中已经明确了归属,所以你以后在参考其他答案时可以遵循这种风格。但是,如果这个问题真的可以由另一个问题的某个内容来回答,那么这些问题本身可能是重复的,因此在这种情况下,您也可以进行近距离投票。
    import android.content.Context;
    import android.util.AttributeSet;
    import android.widget.LinearLayout;
    
    public class SquareLayout extends LinearLayout {
    
    public SquareLayout(Context context) {
        super(context);
    }
    
    public SquareLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    
         @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    
            int width = MeasureSpec.getSize(widthMeasureSpec);
            int height = MeasureSpec.getSize(heightMeasureSpec);
    
            if (width > (int)(mScale * height + 0.5)) {
                width = (int)(mScale * height + 0.5);
            } else {
                height = (int)(width / mScale + 0.5);
            }
    
            super.onMeasure(
                    MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
                    MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
            );
        }
        }