0

我目前已经实现了一个自定义 ViewGroup 类,它试图在屏幕上均匀地和对角地定位项目(带有可绘制对象的按钮)。

不幸的是,如果项目太大,它们往往会重叠以确保所有内容都适合屏幕。

我希望有一种更简单的方法可以使用已经存在的布局(API8+)来实现这一点,或者如果有一些简单的东西,我可以在我的 ViewGroup 类中进行更改以使子视图更小以避免重叠。(比如让每个子视图都需要精确的大小,均匀布局不重叠)

这是我的 onMeasure 课程(没有做任何特别的事情。让孩子们自己测量)

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

        measureChildren(widthMeasureSpec, heightMeasureSpec);

         int width = MeasureSpec.getSize(widthMeasureSpec);
         int height = MeasureSpec.getSize(heightMeasureSpec);

        setMeasuredDimension(width, height);
    }

编辑:如果我更改 onMeasure 以手动将孩子测量到一定的宽度/高度,他们会被剪裁。看起来子视图(或其可绘制对象)实际上并未自行缩放以适应测量值。

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {

        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);

        int newChildWidth = width / getChildCount();
        int newChildHeight = height / getChildCount();

        final int size = getChildCount();
        for (int i = 0; i < size; ++i) {
            View child = getChildAt(i);

            child.measure(MeasureSpec.EXACTLY | newChildWidth, MeasureSpec.EXACTLY | newChildHeight);
        }

        setMeasuredDimension(width, height);
    }
4

1 回答 1

1

到目前为止,您的想法是正确的,如果您希望子视图精确地对角布局,那么封闭的工作就是ViewGroup为它们提供MeasureSpec实现这一点的方法,并MeasureSpec.EXACTLY告诉每个子视图有多大。您也可以将其替换为MeasureSpec.AT_MOST允许内容较少的孩子更小,他们永远不会超过您提供的大小,而EXACTLY每次都使它们的大小相同。

您现在描述的问题是如果没有一些View定制就无法真正解决的问题。Android 视图完全按照“将视图调整为其内容的大小”而不是“将内容调整为视图的大小”的范式运行。因此,如果您告诉 aButton小于绘制其文本/图像内容所需的空间,它将简单地剪辑。该规则的一个例外是ImageView。如果您想规避这一点,您将需要Button根据给定的规范自定义以调整文本大小和可绘制onMeasure()

另一个可能的选择ViewGroup是使用子静态转换,因为无论如何您都在进行自定义。通过调用setStaticTransformationsEnabled(true)您的ViewGroup和覆盖getChildStaticTransformation(),您可以将比例因子应用于希望大于您的特定大小的每个子视图。这种转换类似于动画的工作方式,因此整个视图将按比例缩小。

高温高压

于 2012-04-30T19:45:54.957 回答