我只是想达到什么是上述image.Red是我的图标,我需要地方上的圆形图像borders.Each和每一个红色图标有自己的function.Say顶部它的一种评级按钮。在这里我需要帮助,如何使XML设计来实现这一点。我不知道如何做到这一点,所以我不能在这个问题中添加代码。需要帮助提前感谢。
1
A
回答
1
请看看这堂课。它应该工作,只要你想:
public class CircleLayout extends ViewGroup {
private static final float DEFAULT_FROM_DEGREES = -90f;
private static final float DEFAULT_TO_DEGREES = 270f;
private static final int MIN_RADIUS_DP = 100;
private static final float DEFAULT_CHILD_PADDING_DP = 5f;
private final Rect tempChildFrame = new Rect();
private final float fromDegrees;
private final float toDegrees;
private final int childPadding;
private final int minRadius;
private int radius;
private int childSize;
private boolean expanded;
public CircleLayout(Context context) {
this(context, null);
}
public CircleLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CircleLayout(Context context, AttributeSet attrs, int def) {
super(context, attrs);
final TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.CircleLayout, 0, 0);
try {
childSize = Math.max(a.getDimensionPixelSize(R.styleable.CircleLayout_childSize, 0), 0);
fromDegrees = a.getFloat(R.styleable.CircleLayout_fromDegrees, DEFAULT_FROM_DEGREES);
toDegrees = a.getFloat(R.styleable.CircleLayout_toDegrees, DEFAULT_TO_DEGREES);
final float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, DEFAULT_CHILD_PADDING_DP, getResources().getDisplayMetrics());
childPadding = (int) a.getDimension(R.styleable.CircleLayout_childPadding, px);
expanded = a.getBoolean(R.styleable.CircleLayout_expandedChild, true);
minRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, MIN_RADIUS_DP, getResources().getDisplayMetrics());
} finally {
a.recycle();
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
radius = computeRadius(Math.abs(toDegrees - fromDegrees), getChildCount(), childSize, childPadding, minRadius);
final int size = radius * 2 + childSize + childPadding;
setMeasuredDimension(size + getPaddingLeft() + getPaddingRight(), size + getPaddingTop() + getPaddingBottom());
final int count = getChildCount();
for (int i = 0; i < count; i++) {
getChildAt(i).measure(MeasureSpec.makeMeasureSpec(childSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(childSize, MeasureSpec.EXACTLY));
}
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int centerX = getWidth()/2;
final int centerY = getHeight()/2;
final int radius = expanded ? this.radius : 0;
final int childCount = getChildCount();
final float perDegrees = (toDegrees - fromDegrees)/childCount;
float degrees = fromDegrees;
for (int i = 0; i < childCount; i++) {
computeChildFrame(centerX, centerY, radius, degrees, childSize, tempChildFrame);
degrees += perDegrees;
getChildAt(i).layout(tempChildFrame.left, tempChildFrame.top, tempChildFrame.right, tempChildFrame.bottom);
}
}
private int computeRadius(float arcDegrees, int childCount, int childSize, int childPadding, int minRadius) {
if (childCount < 2) {
return minRadius;
}
final float perDegrees = arcDegrees/childCount;
final float perHalfDegrees = perDegrees/2;
final int perSize = childSize + childPadding;
final int radius = (int) ((perSize/2)/Math.sin(Math.toRadians(perHalfDegrees)));
return Math.max(radius, minRadius);
}
private void computeChildFrame(int centerX, int centerY, int radius, float degrees, int size, Rect result) {
final double childCenterX = centerX + radius * Math.cos(Math.toRadians(degrees));
final double childCenterY = centerY + radius * Math.sin(Math.toRadians(degrees));
final float halfSize = size * .5f;
result.left = (int) (childCenterX - halfSize);
result.top = (int) (childCenterY - halfSize);
result.right = (int) (childCenterX + halfSize);
result.bottom = (int) (childCenterY + halfSize);
}
public void expand() {
expanded = true;
requestLayout();
}
public void shrink() {
expanded = false;
requestLayout();
}
public void setChildSize(int size) {
if (childSize == size || size < 0) {
return;
}
childSize = size;
requestLayout();
}
public boolean isExpanded() {
return expanded;
}
@Override
protected Parcelable onSaveInstanceState() {
final Parcelable superState = super.onSaveInstanceState();
final SavedState result = new SavedState(superState);
result.childSize = childSize;
result.expanded = expanded;
return result;
}
@Override
protected void onRestoreInstanceState(Parcelable state) {
if (!(state instanceof SavedState)) {
super.onRestoreInstanceState(state);
return;
}
final SavedState ss = (SavedState) state;
childSize = ss.childSize;
expanded = ss.expanded;
super.onRestoreInstanceState(ss.getSuperState());
}
public static class SavedState extends BaseSavedState {
@SuppressWarnings("hiding")
public static final Parcelable.Creator<SavedState> CREATOR = new Parcelable.Creator<SavedState>() {
public SavedState createFromParcel(Parcel in) {
return new SavedState(in);
}
public SavedState[] newArray(int size) {
return new SavedState[size];
}
};
private int childSize;
private boolean expanded;
SavedState(Parcelable superState) {
super(superState);
}
@Override
public void writeToParcel(Parcel out, int flags) {
super.writeToParcel(out, flags);
out.writeInt(childSize);
out.writeInt(expanded ? 1 : 0);
}
private SavedState(Parcel in) {
super(in);
childSize = in.readInt();
expanded = in.readInt() != 0;
}
}
}
您还必须添加样式这一观点:
<declare-styleable name="CircleLayout">
<attr name="childSize" format="dimension"/>
<attr name="childPadding" format="dimension"/>
<attr name="fromDegrees" format="integer"/>
<attr name="toDegrees" format="integer"/>
<attr name="expandedChild" format="boolean"/>
</declare-styleable>
示例使用:
<your.package.CircleLayout
android:clipChildren="false"
android:id="@+id/test_circle_view"
android:layout_width="match_parent"
app:childSize="50dp"
app:childPadding="25dp"
app:expandedChild="true"
android:layout_height="match_parent">
<ImageView
android:id="@+id/circle_item_1"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
<ImageView
android:id="@+id/circle_item_2"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
<ImageView
android:id="@+id/circle_item_3"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
<ImageView
android:id="@+id/circle_item_4"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
<ImageView
android:id="@+id/circle_item_5"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
<ImageView
android:id="@+id/circle_item_6"
android:layout_width="50dp"
android:layout_height="50dp"
android:background="@drawable/some_circle"/>
</your.package.CircleLayout>
+0
而不是圆形布局我将使用普通图像视图,但src图像将与padding.HOP你得到我试着g在这里说 –
+0
但是你想如何为你的图标实现没有视图的功能?我的解决方案对你有帮助吗? –
相关问题
- 1. 如何将图像视图放置在surfaceview顶部android
- 2. 如何将图像放在圆形图像视图中
- 3. 如何将自定义标记放置在多边形Google地图顶部Android
- 4. 在android中,如何将标签放在包含顶部图像的视图中?
- 5. 如何在MATLAB的图形顶部放置坐标轴对象?
- 6. 长方形按钮,顶部的圆形图标中的Android
- 7. 如何将图形放在Android相机预览的顶部?
- 8. 如何在android中的图像的顶部放置文本?
- 9. Android:环形内部的圆形图像
- 10. 如何将图像放在另一个图像的顶部
- 11. 如何将矩形图像设置为圆形图像
- 12. 如何在图像顶部绘制圆形
- 13. Android的圆形边框圆形图像
- 14. 在图像视图顶部绘制圆形
- 15. 在图像顶部放置一个div
- 16. 如何在多边形顶部放置圆?
- 17. 如何将图标放在JPanel的顶部和底部
- 18. 在图像的顶部放置一个图像
- 19. 将顶点标签自由放置在顶点之外用于R中的圆形图形
- 20. 条形图顶部的圆圈d3.js
- 21. 如何在圆形物体上放置图像?
- 22. Android Image圆形顶部
- 23. 如何在销图像顶部显示用户位置图标?
- 24. 如何在android中设置圆形图像边界的颜色?
- 25. 如何裁剪圆形图像openvc android
- 26. Perl Image :: Magick:将图像放在其他图像的顶部
- 27. 如何在HTML中将一个图像放在另一个图像的顶部?
- 28. 如何在网页上的背景图像顶部放置图像
- 29. 图像顶部的位置标签
- 30. 如何将视频放在Wordpress上的图像顶部?
你必须使用相对布局,你可以试试约束布局以及 –
@AsifSb看看我的解决方案 –