标签: onmeasure

什么时候调用View.onMeasure()?

什么时候

View.onMeasure(int widthMeasureSpec, int heightMeasureSpec)
Run Code Online (Sandbox Code Playgroud)

叫什么名字?我有一个Activity,需要在调用onMeasure后执行一个动作.

我的问题与此处发布的未回答的问题相同.在查看文档指出onMeasure当被称为requestLayout()时,它认为是可以没有它的当前范围内不再适合被称为,这显然是对自身的视图调用.

但是,这并没有告诉我何时我的活动可以假设我的视图已被测量.我已经使用此代码ImageView扩展为TouchImageView.这里建议我应该使用onMeasure方法来缩放我的图像.我希望在测量ImageView后更新TextView的值,以显示图像缩放的百分比.

java android view android-activity onmeasure

23
推荐指数
2
解决办法
2万
查看次数

自定义视图的onMeasure:如何根据高度获取宽度

我的问题的先前版本太冗长了.人们无法理解它,所以以下是完全重写.如果您对旧版本感兴趣,请参阅编辑历史记录.

一个RelativeLayout家长把MeasureSpec小号到其子视图的onMeasure方法才能看到孩子想有多大是.这发生在几次通过中.

我的自定义视图

我有一个自定义视图.随着视图内容的增加,视图的高度也会增加.当视图达到父级允许的最大高度时,视图的宽度会随着任何其他内容的增加而增加(只要为wrap_content宽度选择).因此,自定义视图的宽度直接取决于父级所说的最大高度必须是什么.

在此输入图像描述

(不和谐的)父母对话

onMeasure 通过1

RelativeLayout家长告诉我的观点,"你可以是任何宽度达到 900任何高度可达 600.你说什么?"

我的观点是,"嗯,在那个高度,我可以适应所有宽度的东西100.所以我要宽度100和高度600."

onMeasure 通过2

RelativeLayout家长告诉我的观点,"你告诉我,你想要的宽度最后一次100,所以我们设置为一个确切的宽度.现在,基于这样的宽度,你会喜欢什么样的高度?凡是 500正常."

"嘿!" 我的观点回复."如果你只给我一个最大的高度500,那么100就太窄了.我需要一个200高度的宽度.但很好,按你的方式行事.我不会违反规则(但......).我将采取宽度100和高度500."

最后结果

所述RelativeLayout父分配图的最终尺寸100的宽度和500对高度.对于视图来说,这当然太窄了,部分内容会被剪裁.

"叹气,"我的看法."为什么我的父母不会让我更宽?有足够的空间.也许Stack Overflow上的某个人可以给我一些建议."

android android-custom-view onmeasure android-relativelayout

17
推荐指数
1
解决办法
6105
查看次数

为什么onMeasure()在我的自定义视图中调用了两次?

以下是我的自定义代码View:

XML布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res/com.project.summary"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" 
    android:background="@color/BgColor">

    <com.project.summary.customview.CustomView
        android:id="@+id/customView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        app:colorValue="@color/textRed"
        app:textString="This the Custom View!!!"
        app:textSize="20sp"
        />

</LinearLayout>
Run Code Online (Sandbox Code Playgroud)

我的代码CustomView.java:

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    Log.e("140117", "onMeasure()"+this.getHeight()+"||"+this.getWidth());
}
Run Code Online (Sandbox Code Playgroud)

测试活动代码:

    public class CustomViewActivity extends Activity{

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.customview_layout);
    }
}
Run Code Online (Sandbox Code Playgroud)

logcat输出:

01-17 13:47:01.203: E/140117(11467): onMeasure()0||0
01-17 13:47:01.243: E/140117(11467): onMeasure()28||212
Run Code Online (Sandbox Code Playgroud)

我搜索了StackOverflow,但没有人给出明确的答案.有人能帮助我吗?

android android-custom-view onmeasure

11
推荐指数
2
解决办法
5570
查看次数

RecyclerView#onMeasure()没有通过调用setMeasuredDimension()来设置测量的维度

我有一个带有Recyclerview的片段,附有LinearSnapHelper,以便在中心获取视图并通过缩放其大小来突出显示它.

它运行正常,但是当从背板上弹出这个片段时,它会抛出异常.

E/UncaughtException: java.lang.IllegalStateException: View with id 2131689939: android.support.v7.widget.RecyclerView#onMeasure() did not set the measured dimension by calling setMeasuredDimension()
                                                                     at android.view.View.measure(View.java:19746)
                                                                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
                                                                     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                     at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1117)
                                                                     at android.widget.LinearLayout.onMeasure(LinearLayout.java:642)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
                                                                     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                     at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                     at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
                                                                     at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                                                                     at android.widget.LinearLayout.measureVertical(LinearLayout.java:758)
                                                                     at android.widget.LinearLayout.onMeasure(LinearLayout.java:640)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.support.v4.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1420)
                                                                     at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                     at android.support.v4.widget.NestedScrollView.onMeasure(NestedScrollView.java:482)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
                                                                     at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6120)
                                                                     at android.support.design.widget.CoordinatorLayout.onMeasureChild(CoordinatorLayout.java:714)
                                                                     at android.support.design.widget.HeaderScrollingViewBehavior.onMeasureChild(HeaderScrollingViewBehavior.java:90)
                                                                     at android.support.design.widget.AppBarLayout$ScrollingViewBehavior.onMeasureChild(AppBarLayout.java:1391)
                                                                     at android.support.design.widget.CoordinatorLayout.onMeasure(CoordinatorLayout.java:784)
                                                                     at android.view.View.measure(View.java:19734)
                                                                     at android.support.v4.widget.DrawerLayout.onMeasure(DrawerLayout.java:1081)
                                                                     at android.view.View.measure(View.java:19734) …
Run Code Online (Sandbox Code Playgroud)

android fragment dimension onmeasure android-recyclerview

7
推荐指数
1
解决办法
2741
查看次数

如何在更改布局宽度和高度时调用onMeasure

嗨,我正在绘制画布.为此我使用自定义视图Activity(扩展View)这个视图添加到ScrollViewmainactivity(extends Activity)中滚动画布和我的自定义视图宽度和高度700*3000并在运行时自定义视图宽度和高度增加.

现在我onMeasure()在改变宽度和高度时如何调用.

onMeasure()在自定义视图调用时调用.但在运行时,除非onResume()调用,否则不会调用它.

对于呼叫onMeasure(),我使用measure(width,heigt);onTouch().

但它没有被调用onMeasure().是否可以在运行时调用.那么,如何?任何人都给我一个解决方案.

android android-canvas onmeasure

6
推荐指数
0
解决办法
5025
查看次数

SurfaceView onMeasure() 没有通过调用 setMeasuredDimension() 设置测量尺寸

我有一个 SurfaceView。我只是从另一个线程手动绘制它。

\n\n

它运行得很好。但平均运行 10-20 分钟后,我得到了这个异常:

\n\n
01-14 08:51:25.000    3740-3740/com.myPackage E/AndroidRuntime\xef\xb9\x95 FATAL EXCEPTION: main\n    java.lang.IllegalStateException: onMeasure() did not set the measured dimension by calling setMeasuredDimension()\n            at android.view.View.measure(View.java:15200)\n            at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602)\n            at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415)\n            at android.view.View.measure(View.java:15195)\n            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823)\n            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)\n            at android.view.View.measure(View.java:15195)\n            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823)\n            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390)\n            at android.widget.LinearLayout.measureVertical(LinearLayout.java:681)\n            at android.widget.LinearLayout.onMeasure(LinearLayout.java:574)\n            at android.view.View.measure(View.java:15195)\n            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823)\n            at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)\n            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2340)\n            at android.view.View.measure(View.java:15195)\n            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850)\n            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102)\n            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275)\n            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)\n            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4216)\n            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)\n            at android.view.Choreographer.doCallbacks(Choreographer.java:555)\n            at android.view.Choreographer.doFrame(Choreographer.java:525)\n            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711)\n            at android.os.Handler.handleCallback(Handler.java:615)\n            at android.os.Handler.dispatchMessage(Handler.java:92)\n            at …
Run Code Online (Sandbox Code Playgroud)

android surfaceview onmeasure

6
推荐指数
1
解决办法
9044
查看次数

Android:以编程方式在自定义视图中设置match_parent

我实现了可在其中绘画的自定义视图。我想将其设置为MATCH_PARENT,以便它独立于屏幕方向填充整个屏幕。当我将方向更改为横向时,它仅占宽度的50%。

我更改了onMeasure(),但没有效果:

public class DrawScreen extends View{

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);   
    if(context.getResources().getConfiguration().orientation==Configuration.ORIENTATION_LANDSCAPE){
        setMeasuredDimension(screenWidth, screenHeight);
    }else{
        setMeasuredDimension(screenHeight, screenWidth);
    }

}
}


public class MyService extends Service{

...
windowManager.addView(toolbox, params);
}
Run Code Online (Sandbox Code Playgroud)

android custom-view onmeasure

5
推荐指数
1
解决办法
5623
查看次数

具有动态高度的Android ViewPager

我有一个ViewPager显示一些片段并在它们之间滑动,但它的高度ViewPager是基于内容的动态.假设我有多个列表,每个列表放在一个选项卡中,通过更改选项卡ViewPager应该正确更改高度我创建了一个自定义ViewPager和覆盖onMeasure但问题是ViewPager更快地创建下一个片段当前片段(可见一个)从下一个片段获得它的高度测量.

这是MyViewPager:公共类MyViewPager扩展ViewPager {

public MyViewPager(Context context) {
        super(context);
    }

    public MyViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        int height = 0;
        for(int i = 0; i < getChildCount(); i++) {
            View child = getChildAt(i);
            child.measure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
            int h = child.getMeasuredHeight();
            if(h > height) height = h;
        }

        heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY);

        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

}
Run Code Online (Sandbox Code Playgroud)

我也尝试触发片段变得可见时的 …

android fragment android-fragments android-viewpager onmeasure

4
推荐指数
1
解决办法
1万
查看次数

onMeasure被称为1500多次

我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局...... 在此输入图像描述

描述
简而言之,有一个ViewPager持有3 RelativeLayout秒作为页面.每个页面里面都有一些TextViews.我最近注意到当我输入EditText有一个延迟TextWatcher来执行快速SQL查询以进行自动完成时会出现很多延迟.当我输入文本时,我的HTC One M8口吃和滞后,但我知道这不是查询速度慢,因为我测量的查询只花了大约7毫秒.

我使用了方法分析,Systrace和简单的旧Log调试,并得出结论,每次我在A,B和C 内的s 上进行EditText1,700次调用时输入一个字符.累计,只有大约15个独立的s页面.我注意到每个都被调用了数百次而不是往常一样被调用一次或两次.onMeasureTextViewRelativeLayoutTextViewonMeasure

问题
我不知道为什么EditText在页面B中键入会导致TextView页面A和C中的其他s也被"重新测量".更重要的是,是否有人对如何onMeasure经常被召唤的原因有所了解?并且,有没有人知道一个显着减少呼叫次数的解决方案onMeasure

详情
这可能有所帮助:我实际上能够onMeasure通过删除RelativeLayout2 来减少大约900 的呼叫次数,这可能表明onMeasure呼叫的传播开始于ViewPager.

android textview android-layout android-viewpager onmeasure

3
推荐指数
1
解决办法
4932
查看次数

当父设置为WRAP_CONTENT时,ViewGroup子高度测量为0

我正在创建一个自定义ViewGroup.如果我将自定义ViewGroup添加到布局而未指定LayoutParams(如下所示),则会正确显示:

...
MyCustomViewGroup myViewGroup = new MyCustomViewGroup(this);
myRelativeLayout.addView(myViewGroup);
...
Run Code Online (Sandbox Code Playgroud)

如果我指定LayoutParams并将宽度设置为MATCH_PARENT并将高度设置为WRAP_CONTENT(如下所示),则不会显示:

...
MyCustomViewGroup myViewGroup = new MyCustomViewGroup(this);
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(
        RelativeLayout.LayoutParams.MATCH_PARENT,
        RelativeLayout.LayoutParams.WRAP_CONTENT);
myRelativeLayout.addView(myViewGroup, params);
...
Run Code Online (Sandbox Code Playgroud)

我为两种方案都运行了Debug.

场景1
如果我没有指定任何LayoutParams,则子视图会正确测量,当方法遍历所有子视图以确定最大高度时,child.getMeasuredHeight()每次都返回正确的值.

场景2
如果我指定LayoutParams的宽度为MATCH_PARENT,高度为WRAP_CONTENT,则系统会通过onMeasure执行两次传递,如下所述.

传递1
widthSpecMode = EXACTLY
width = widthSpecSize = 758这是父RelativeRayout的宽度
heightSpecMode = EXACTLY
height = heightSpecSize = 1055这是父RelativeLayout的高度

传递2
widthSpecMode = EXACTLY
width = widthSpecSize = 758这是父RelativeRayout的宽度
heightSpecMode = AT_MOST
该方法然后迭代所有子视图以确定最大高度,但child.getMeasuredHeight()每次返回0.

子视图有几个ImageButtons和一个TextView.它们都有内容,并且在第一个场景中正确显示了内容.为什么在第二种情况下它的高度为0,我该如何解决呢?

`' 我写了一个简化的测试应用程序来重现问题.所有必要的代码如下所示.如果有人想尝试,你可以简单地剪切和粘贴.

MainActivity.java

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) …
Run Code Online (Sandbox Code Playgroud)

android viewgroup onmeasure

2
推荐指数
1
解决办法
7947
查看次数

在父级的requestLayout之后,不会调用onMeasure和onLayout子视图

我正在尝试了解Android如何衡量和展示观点.我创建了一个包含自定义视图和视图组的示例应用.

CustomViewGroup

public class CustomViewGroup extends ViewGroup {

    private static final String LOG_TAG = "CustomViewGroup";

    public CustomViewGroup(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        Log.d(LOG_TAG, String.format(Locale.ENGLISH,
                getTag() + " " +
                        "onMeasure(widthMeasureSpec=%d, heightMeasureSpec%d)",
                widthMeasureSpec, heightMeasureSpec
        ));

        final int count = getChildCount();
        for (int i = 0; i < count; i++) {
            final View child = getChildAt(i);
            if (child.getVisibility() != View.GONE) {
                // Make or work out measurements for children here …
Run Code Online (Sandbox Code Playgroud)

android android-custom-view onmeasure

1
推荐指数
1
解决办法
4174
查看次数