【问题标题】:Layout views diagonally across the screen在屏幕上对角线布局视图
【发布时间】:2012-05-10 11:27:52
【问题描述】:

我目前已经实现了一个自定义 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);
    }

【问题讨论】:

  • 您是否为每个孩子使用ImageView?如果是这样,您可以尝试ImageView.ScaleType
  • 抱歉应该说ImageButton

标签: android android-layout


【解决方案1】:

到目前为止,您的想法是正确的,如果您希望子视图完全对角布局,则封闭的ViewGroup 的工作是为他们提供MeasureSpec 来实现这一点,MeasureSpec.EXACTLY 会告诉每个孩子要多大。你也可以把它换成MeasureSpec.AT_MOST,让内容较少的孩子变小,他们永远不会超过你提供的大小,而EXACTLY让他们每次都一样大小。

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

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

HTH

【讨论】:

  • 谢谢。在某些时候我会重新调查这个,但目前我决定作弊并扩展 LinearLayout - 但覆盖 onLayout 以便我可以更改子视图的垂直间距。 (如果我为他们分配布局权重,LinearLayout 似乎会适当地缩小孩子的比例)
  • 当您的目的允许时,最好覆盖现有的布局管理器。干杯!
  • 我正在尝试做类似的任务..只是想知道你最后是怎么做到的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2012-06-13
相关资源
最近更新 更多