奇怪的onMeasure()行为

时间:2018-04-01 11:28:57

标签: android onmeasure

我有一个复杂的布局,其中包含以下视图:

<PackPreview xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="436dp"
        android:layout_height="352dp"
        android:layout_gravity="center"
        android:background="@drawable/shadow_purple">
...

注意固定的宽度/高度。
PackPreview内我有onMeasure功能:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int heightSize = MeasureSpec.getSize(heightMeasureSpec);// always 0
    boolean exactSize=MeasureSpec.getMode(heightMeasureSpec)==MeasureSpec.EXACTLY;//always true
    Log.d("pack",heightSize + "," + exactSize);
    int desiredWidth=(int) (heightSize * ViewConfig.IMAGE_ASPECT_RATIO);
    desiredWidth*=1.1;
    widthMeasureSpec=MeasureSpec.makeMeasureSpec(desiredWidth,MeasureSpec.EXACTLY);
    this.setMeasuredDimension(desiredWidth, heightSize);
    super.onMeasure(widthMeasureSpec,heightMeasureSpec);
}

它稍微调整了视图的宽度。问题是,当我在低分辨率屏幕上运行时,它会进入onMeasure调用的无限循环。在控制台中,我看到大量此消息D/pack: 0,true。有趣的是这不是'在更高的分辨率上发生。对此有任何解释吗?

UPD:刚检查:同样的事情到处发生,但是在更高的分辨率MeasureSpec.getSize上返回非零值,所以看起来很好看。

1 个答案:

答案 0 :(得分:0)

无限的onMeasure通话是由于onLayout:

fade.setLayoutParams(new FrameLayout.LayoutParams(r-l,(b-t)/2));

为什么它忽略了布局中的大小仍然是一种迷惑。随时与

合作
if(heightSize==0)
    heightSize = ViewConfig.screenHeight;