今天给大家分享一个浮动效果的自定义控件,首先看图:
FloatingMenu控件全部代码:
public class FloatingMenu extends ViewGroup {
// 子菜单和母菜单图标距离
private final static int RADIUS = 250;
// 当前菜单状态
private MenuStatu currentStatu = MenuStatu.STATU_CLOSE;
// 菜单状态枚举
public enum MenuStatu {
STATU_OPEN, STATU_CLOSE
}
/**
* 子菜单被点击回调接口
*/
public interface OnItemMenuClickListener {
void onItemMenuClick(View view, int position);
}
// 子菜单被点击回调接口
private OnItemMenuClickListener onItemMenuClickListener;
public void setOnItemMenuClickListener(OnItemMenuClickListener onItemMenuClickListener) {
this.onItemMenuClickListener = onItemMenuClickListener;
}
public FloatingMenu(Context context) {
super(context);
}
public FloatingMenu(Context context, AttributeSet attrs) {
super(context, attrs);
}
public FloatingMenu(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int childCount = getChildCount();
if (childCount < 3)
throw new IllegalStateException("当前控件的孩子控件至少需要3个");
measureChildren(widthMeasureSpec, heightMeasureSpec);
int tempWidth = getChildAt(1).getMeasuredWidth();
int tempHeight = getChildAt(childCount - 1).getMeasuredHeight();
setMeasuredDimension(RADIUS + tempWidth, RADIUS + tempHeight);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
if (changed) {
int measuredWidth = getMeasuredWidth();
int measuredHeight = getMeasuredHeight();
int childCount = getChildCount();
// 计算每2个子菜单之间的角度值
float averageAngle = 90 / (childCount - 1 - 1);
for (int i = 0; i < childCount; i++) {
final View childAt = getChildAt(i);
int childWidth = childAt.getMeasuredWidth();
int childHeight = childAt.getMeasuredHeight();
// 第一个子控件是母菜单