如何在 Viewgroup 中正确覆盖 onLayout 方法 class
How to correctly override onLayout Method in a Viewgroup class
我有一个 class 从视图组 class 扩展而来。现在我知道在 onLayout 中你必须在每个 children 上调用布局方法。这里的问题是应该将什么值传递给 child 布局。
在我看来,我膨胀了一个 xml 并将其附加到这个 class(宽度和高度在 xml 中定义)。在 onlayout 中,我得到一个正确的 child 计数,但 child 的宽度和高度返回 0。我如何获得 child.[=15= 的宽度和高度]
如果我在其中设置位置和测量值,那么 onmeasure 方法有什么用?我以为我们应该测量那里的 child。
下面是部分源码供参考
public BaseWidget(Context context, int resourceId) {
super(context);
initWithResourceID(resourceId);
}
private void initWithResourceID(int resourceId) {
inflate(getContext(), resourceId, this);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
getChildAt(i).layout(l, t, r, b);
// getChildAt(i).layout((int)child.getX(), (int)(child.getY() + child.getMeasuredHeight()), (int) (child.getX() + child.getMeasuredWidth()), (int)child.getY());
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="150dp"
android:layout_height="90dp"
android:background="@color/ripple_material_light"
android:orientation="vertical"
android:padding="20dp">
<RelativeLayout
android:id="@+id/texts"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="1" />
<TextView
android:id="@+id/asideTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="2" />
</RelativeLayout>
<View
android:id="@+id/detailedView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</View>
</LinearLayout>
当我调用 getChildAt(i).layout(l, t, r, b);
时 child 绘制在整个 parent.
当我打电话时
getChildAt(i).layout((int)child.getX(), (int)(child.getY() +
child.getMeasuredHeight()), (int) (child.getX() +
child.getMeasuredWidth()), (int)child.getY());
什么都没画
所以基本上我想知道我们应该将什么传递给 child.. 以及 onmeasure 和 onlayout 之间的主要区别是什么。我希望我把我的问题说清楚。
您必须先测量 children,然后再尝试获取其高度和宽度。而在 onLayout 中,你决定 child 的位置。
测量完后,你就会得到所有children的高和宽,然后借助它,你就可以定位children了。您可以根据它的高度和宽度设置它的左、右、上、下点。
例如,如果要将 child 定位在 (0,0),则在 onLayout
child.layout(0,0,child.getMeasuredWidth(), child.getMeasuredHeight());
如果右边和底部点写错了,观点可能cut/enlarge/shrink。
我有一个 class 从视图组 class 扩展而来。现在我知道在 onLayout 中你必须在每个 children 上调用布局方法。这里的问题是应该将什么值传递给 child 布局。
在我看来,我膨胀了一个 xml 并将其附加到这个 class(宽度和高度在 xml 中定义)。在 onlayout 中,我得到一个正确的 child 计数,但 child 的宽度和高度返回 0。我如何获得 child.[=15= 的宽度和高度]
如果我在其中设置位置和测量值,那么 onmeasure 方法有什么用?我以为我们应该测量那里的 child。
下面是部分源码供参考
public BaseWidget(Context context, int resourceId) {
super(context);
initWithResourceID(resourceId);
}
private void initWithResourceID(int resourceId) {
inflate(getContext(), resourceId, this);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int count = getChildCount();
for (int i = 0; i < count; i++) {
View child = getChildAt(i);
getChildAt(i).layout(l, t, r, b);
// getChildAt(i).layout((int)child.getX(), (int)(child.getY() + child.getMeasuredHeight()), (int) (child.getX() + child.getMeasuredWidth()), (int)child.getY());
}
}
xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="150dp"
android:layout_height="90dp"
android:background="@color/ripple_material_light"
android:orientation="vertical"
android:padding="20dp">
<RelativeLayout
android:id="@+id/texts"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:text="1" />
<TextView
android:id="@+id/asideTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="2" />
</RelativeLayout>
<View
android:id="@+id/detailedView"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</View>
</LinearLayout>
当我调用 getChildAt(i).layout(l, t, r, b);
时 child 绘制在整个 parent.
当我打电话时
getChildAt(i).layout((int)child.getX(), (int)(child.getY() +
child.getMeasuredHeight()), (int) (child.getX() +
child.getMeasuredWidth()), (int)child.getY());
什么都没画
所以基本上我想知道我们应该将什么传递给 child.. 以及 onmeasure 和 onlayout 之间的主要区别是什么。我希望我把我的问题说清楚。
您必须先测量 children,然后再尝试获取其高度和宽度。而在 onLayout 中,你决定 child 的位置。 测量完后,你就会得到所有children的高和宽,然后借助它,你就可以定位children了。您可以根据它的高度和宽度设置它的左、右、上、下点。 例如,如果要将 child 定位在 (0,0),则在 onLayout
child.layout(0,0,child.getMeasuredWidth(), child.getMeasuredHeight());
如果右边和底部点写错了,观点可能cut/enlarge/shrink。