半円形のカスタム レイアウトを作成しました。私のビューを半円の外面に入れたいと思っています。しかし、それは私が欲しいものを正確に示していません。
以下のコードでは、ビュー グループの OnLayout メソッドをオーバーライドしています。
以下にコードを投稿しました:-
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int mAngleRange = 180;
final int childs = getChildCount();
float totalWeight = 0f;
for (int i = 0; i < childs; i++) {
totalWeight += 1;
}
float startAngle = 270;
final int width = getWidth();
final int height = getHeight();
for (int i = 0; i < childs; i++) {
final View child = getChildAt(i);
final LayoutParams lp = layoutParams(child);
final float angle = mAngleRange / totalWeight * 1;
final float centerAngle = startAngle + angle / 2f;
final int x;
final int y;
if (childs > 1) {
int radius = getResources().getDimensionPixelOffset(R.dimen.item_radius);
x = (int) (radius * Math.cos(Math.toRadians(centerAngle)) + 0);
y = (int) (radius * Math.sin(Math.toRadians(centerAngle))) + height / 2;
} else {
x = width / 2;
y = height / 2;
}
final int left = lp.width != LayoutParams.MATCH_PARENT ? x : 0;
final int top = lp.height != LayoutParams.MATCH_PARENT ? y : 0;
final int right = lp.width != LayoutParams.MATCH_PARENT ? x + child.getMeasuredWidth() : width;
final int bottom = lp.height != LayoutParams.MATCH_PARENT ? y + child.getMeasuredHeight() : height;
Log.d(CircularOverlayLayout.class.getName(), "left =" + left + " top =" + top + " right =" + right + " bottom = " + bottom);
child.layout(left, top, right, bottom);
startAngle += angle;
}
}
<com.trignodev.customuidemo.CircularOverlayLayout
android:id="@+id/normalWithRange"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/white">
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#ff0000" />
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#00ff00" />
<View
android:layout_width="50dp"
android:layout_height="50dp"
android:background="#0000ff" />
</com.trignodev.customuidemo.CircularOverlayLayout>