什么时候
View.onMeasure(int widthMeasureSpec, int heightMeasureSpec)
Run Code Online (Sandbox Code Playgroud)
叫什么名字?我有一个Activity,需要在调用onMeasure后执行一个动作.
我的问题与此处发布的未回答的问题相同.在查看文档指出onMeasure当被称为requestLayout()时,它认为是可以没有它的当前范围内不再适合被称为,这显然是对自身的视图调用.
但是,这并没有告诉我何时我的活动可以假设我的视图已被测量.我已经使用此代码将ImageView扩展为TouchImageView.这里建议我应该使用onMeasure方法来缩放我的图像.我希望在测量ImageView后更新TextView的值,以显示图像缩放的百分比.
我的问题的先前版本太冗长了.人们无法理解它,所以以下是完全重写.如果您对旧版本感兴趣,请参阅编辑历史记录.
一个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
以下是我的自定义代码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输出:
Run Code Online (Sandbox Code Playgroud)01-17 13:47:01.203: E/140117(11467): onMeasure()0||0 01-17 13:47:01.243: E/140117(11467): onMeasure()28||212
我搜索了StackOverflow,但没有人给出明确的答案.有人能帮助我吗?
我有一个带有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) 嗨,我正在绘制画布.为此我使用自定义视图Activity
(扩展View
)这个视图添加到ScrollView
mainactivity(extends Activity
)中滚动画布和我的自定义视图宽度和高度700*3000并在运行时自定义视图宽度和高度增加.
现在我onMeasure()
在改变宽度和高度时如何调用.
这onMeasure()
在自定义视图调用时调用.但在运行时,除非onResume()
调用,否则不会调用它.
对于呼叫onMeasure()
,我使用measure(width,heigt);
在onTouch()
.
但它没有被调用onMeasure()
.是否可以在运行时调用.那么,如何?任何人都给我一个解决方案.
我有一个 SurfaceView。我只是从另一个线程手动绘制它。
\n\n它运行得很好。但平均运行 10-20 分钟后,我得到了这个异常:
\n\n01-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) 我实现了可在其中绘画的自定义视图。我想将其设置为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) 我有一个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
我最近发现我的应用程序出现了严重的性能问题.我基本上有以下布局......
描述
简而言之,有一个ViewPager
持有3 RelativeLayout
秒作为页面.每个页面里面都有一些TextView
s.我最近注意到当我输入EditText
有一个延迟TextWatcher
来执行快速SQL查询以进行自动完成时会出现很多延迟.当我输入文本时,我的HTC One M8口吃和滞后,但我知道这不是查询速度慢,因为我测量的查询只花了大约7毫秒.
我使用了方法分析,Systrace和简单的旧Log
调试,并得出结论,每次我在A,B和C 内的s 上进行EditText
约1,700次调用时输入一个字符.累计,只有大约15个独立的s页面.我注意到每个都被调用了数百次而不是像往常一样被调用一次或两次.onMeasure
TextView
RelativeLayout
TextView
onMeasure
问题
我不知道为什么EditText
在页面B中键入会导致TextView
页面A和C中的其他s也被"重新测量".更重要的是,是否有人对如何onMeasure
经常被召唤的原因有所了解?并且,有没有人知道一个显着减少呼叫次数的解决方案onMeasure
?
详情
这可能有所帮助:我实际上能够onMeasure
通过删除RelativeLayout
2 来减少大约900 的呼叫次数,这可能表明onMeasure
呼叫的传播开始于ViewPager
.
我正在创建一个自定义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如何衡量和展示观点.我创建了一个包含自定义视图和视图组的示例应用.
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 ×11
onmeasure ×11
fragment ×2
custom-view ×1
dimension ×1
java ×1
surfaceview ×1
textview ×1
view ×1
viewgroup ×1