在Android中将建议的宽度和高度设置为自定义视图

时间:2018-12-13 09:08:33

标签: android view

我正在学习如何在android中创建自定义视图。目前,我不知道如何设置最小宽度和高度。为什么我认为它没有设置?因为我打印了sample.map1值,所以返回0。

在视图中,画布上淹没了一些图形,这意味着层次结构中没有视图,除非自动添加视图(顺便说一句?)。

我尝试使用谷歌搜索设置自定义视图的最小宽度或高度的可能方法,但没有找到任何东西。

那么,如何在getSuggestedMinimumWidth()方法中为自定义视图设置最小宽度和高度?如果存在诸如为什么您需要覆盖该方法的问题,答案是我想学习如何使用它。

2 个答案:

答案 0 :(得分:1)

我的解决方案非常简单,希望对您有帮助

import matplotlib.ticker as ticker

tick_spacing = 1
ax.xaxis.set_major_locator(ticker.MultipleLocator(tick_spacing))

答案 1 :(得分:0)

测量自定义视图实际上比看起来容易。您应该看看MeasureSpec

通常,您需要处理可以给视图指定特定大小wrap_contentmatch_parent的情况。

调用onMeasure时,会得到widthMeasureSpecheightMeasureSpec参数,您可以将其与MeasureSpec结合使用以获得

  1. widthheight模式
  2. widthheight大小

模式可以是MeasureSpec中三个预定义值之一:

  

未指定

     

父母没有对孩子施加任何约束。它可以是任何大小。

     

完全

     

父母已经确定了孩子的确切尺寸。不管孩子想要多大,都将为其赋予这些界限。

     

AT_MOST

     

该子项可以达到所需的最大大小。

您需要做的是掩盖这些情况,大多数情况如下所示:

@Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int widthMode = MeasureSpec.getMode(widthMeasureSpec);
        int heightMode = MeasureSpec.getMode(heightMeasureSpec);
        int width = MeasureSpec.getSize(widthMeasureSpec);
        int height = MeasureSpec.getSize(heightMeasureSpec);

        if (widthMode == MeasureSpec.EXACTLY) {
            width = //Calculation
        } else if (widthMode == MeasureSpec.AT_MOST) {
            width = //Calculation
        } else {
            // UNSPECIFIED
            width = //Calculation
        }

        if (heightMode == MeasureSpec.EXACTLY) {
            height = //Calculation
        } else if (heightMode == MeasureSpec.AT_MOST) {
            height = //Calculation
        } else {
            // UNSPECIFIED
            height = //Calculation
        }

        setMeasuredDimension(width, height);
    }

在某些情况下,如果您的自定义视图是ViewGroup并且可以包含1个或多个子视图,则应该测量子视图。这是我几年前编写的用于测量自定义ViewGroup的一段代码,该自定义mChild最多可以有一个孩子(mStrokeWidth),并且还需要通过考虑绘制图形来计算其高度/宽度属性在孩子周围的中风(@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int width = MeasureSpec.getSize(widthMeasureSpec); int height = MeasureSpec.getSize(heightMeasureSpec); measureChild(mChild, widthMeasureSpec, heightMeasureSpec); int childWidth = mChild.getMeasuredWidth(); int childHeight = mChild.getMeasuredHeight(); if (widthMode == MeasureSpec.EXACTLY) { width = MeasureSpec.getSize(widthMeasureSpec); } else if (widthMode == MeasureSpec.AT_MOST) { width = Math.min(width, (int) (childWidth + (mStrokeWidth * 2))); } if (heightMode == MeasureSpec.EXACTLY) { height = MeasureSpec.getSize(heightMeasureSpec); } else if (heightMode == MeasureSpec.AT_MOST) { height = Math.min(height, (int) (childHeight + (mStrokeWidth * 2))); } setMeasuredDimension(width, height); }

template-url