首页 文章

MeasureSpec返回0值 - onMeasure()

提问于
浏览
2

我已经搜索了相关的答案,但还没有找到解决方案 . 所以我在这里请求帮助 . 我正在创建一个自定义视图 . 我已经超越了测量 . 代码如下 .

@Override
   protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    int widthSize,heightSize;

    int measureWidthSpec = MeasureSpec.getMode(widthMeasureSpec);

    int measureHeightSpec = MeasureSpec.getMode(heightMeasureSpec);

    widthSize = getCircleWidth(measureWidthSpec, MeasureSpec.getSize(widthMeasureSpec));
    heightSize = getCircleHeight(measureHeightSpec,MeasureSpec.getSize(heightMeasureSpec));

    int circleSize = Math.min(widthSize,heightSize);

    setMeasuredDimension(circleSize, circleSize);

    Log.d(TAG, "View Measured and ViewDimension : " + heightSize + " " + MeasureSpec.getSize(widthMeasureSpec));
}

使用MeasureSpec.getSize(widthMeasureSpec)在此处请求大小时,将返回0 . 但是对于高度,我得到67的值.getCircleWidth()和getCircleHeight是用于根据specMode修复值的方法 . 我声明我的视图的布局xml文件的部分如下所示 .

<com.example.raaja.circleview.CircleView
    android:id="@+id/CircleView"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_alignBottom="@+id/textView"
    android:layout_toRightOf="@+id/textView"
    circle:circleColor="#5dade2"
    circle:innerCircleColor="#2874a6"
    circle:numberTextColor="#b3b6b7"
    />

任何人都可以帮我找到为什么返回值0 . 此外,onDraw不会被调用,因为我在setMeasuredDimension()中修复了最小值 .

2 回答

  • 3

    你没有在 onMeasure() 解释你想要做什么,但假设你只是想让视图成为方形,你可以简单地这样做:

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int circleSize = Math.min(getMeasuredWidth(), getMeasuredHeight());
        setMeasuredDimension(circleSize, circleSize);
    }
    
  • 1

    我从BladeCoder的回复中找到了这个解决方案的答案 . 问题实际上是Layout.xml . 我已经使用另一个按钮并排定义了View . Button占据了所有的宽度空间 . 所以这就是问题所在 . 如果您的视图未在下面绘制,则为2点解决方案 .

    • 检查MeasureSpec.getsize() . 如果它返回0,则布局没有空间放置视图(宽度或高度),修复layout.xml . 如果没有,则继续检查您在setMeasuredDimension()上修复维度的计算 . 这两个问题将成为第二点的原因 .

    • 如果在setMeasuredDimension()上传递0,则不会绘制onDraw() . 您可以传递1000或更多宽度但是如果传递高度为0(如此setMeasureDimension(1000,0)),则视图将不可见,因为它的高度为零 .

    我希望这个答案能帮助您找到上述问题的解决方案 .

相关问题