1.搭建适配器 继承 BaseAdapter
public class CircleMenuAdapter extends BaseAdapter {
private List<Menu> list;
public CircleMenuAdapter(List<Menu> list) {
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View view = inflater.inflate(R.layout.circle_menu_item,parent,false);
initMenuItem(view,position);
return view;
}
private void initMenuItem(View v,int p) {
Menu menu = list.get(p);
TextView textView = v.findViewById(R.id.circle_menu_text);
ImageView img = v.findViewById(R.id.circle_menu_img);
textView.setText(menu.text);
Log.d("text",menu.text);
img.setImageResource(menu.imgId);
}
}
2.向viewgroup添加适配器
public class CircleMenuLayout extends ViewGroup {
private int mRadius;
//子布局默认的尺寸
private static final float RADIUS_CHILD_ITEM = 1/4f;
private static final float RADIUS_PADDING = 1/12f;
private float padding;
private double startAngle;
private CircleMenuAdapter adapter;
public void setCircleAdapter(CircleMenuAdapter adapter){
this.adapter = adapter;
}
public CircleMenuLayout(Context context, AttributeSet attrs) {
super(context, attrs);
setPadding(0,0,0,0);
}
@Override
protected void onAttachedToWindow() {
if (adapter != null){
buildMenuItem();
}
super.onAttachedToWindow();
}
private void buildMenuItem(){
for (int i=0;i<adapter.getCount();++i){
View itemView = adapter.getView(i,null,this);
addView(itemView);
}
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
measureSelf(widthMeasureSpec,heightMeasureSpec);
measureChildItem();
}
private void measureSelf(int widthMeasureSpec, int heightMeasureSpec){
int resWidth;
int resHeight;
int width = MeasureSpec.getSize(widthMeasureSpec);
int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int height = MeasureSpec.getSize(heightMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
if (widthMode == MeasureSpec.EXACTLY || heightMode == MeasureSpec.EXACTLY){
resWidth = getSuggestedMinimumWidth();
resWidth = resWidth == 0 ? getWidth() : resWidth;
resHeight = getSuggestedMinimumHeight();
resHeight = resHeight == 0 ? getHeight() : resHeight;
}else {
resWidth = resHeight = Math.min(width,height);
}
setMeasuredDimension(resWidth,resHeight);
}
private void measureChildItem(){
mRadius = Math.max(getMeasuredWidth(),getMeasuredHeight());
int childSize = (int) (mRadius * RADIUS_CHILD_ITEM);
int childMode = MeasureSpec.EXACTLY;
for (int i=0;i<adapter.getCount();++i){
View childView = getChildAt(i);
int measureChild = -1;
measureChild = MeasureSpec.makeMeasureSpec(childSize,childMode);
childView.measure(measureChild,measureChild);
}
padding = mRadius * RADIUS_PADDING;
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
int childCount = adapter.getCount();
int left,top;
int angleDelay = 360/childCount;
int itemWidth = (int) (mRadius*RADIUS_CHILD_ITEM);
for (int i=0;i<adapter.getCount();++i){
View childView = getChildAt(i);
startAngle %= 360;
//到中心点的距离
int distanceFromCenter = (int) (mRadius/2 - itemWidth/2 - padding);
left = mRadius/2 + (int) (Math.round(distanceFromCenter*Math.cos(Math.toRadians(startAngle)))-1/2f*itemWidth);
top = mRadius/2 + (int)(Math.round(distanceFromCenter*Math.sin(Math.toRadians(startAngle)))-1/2f*itemWidth);
childView.layout(left,top,left+itemWidth,top+itemWidth);
startAngle+=angleDelay;
}
}
}
效果图
其实(一)(二)的效果是一样的,这里就不做详细介绍了。