自定义代码:
/**
* 自定义扇形菜单(展示界面)
*
* @author macro
*
*/
public class AnimButtons extends RelativeLayout {
private Context context;
private final int buttonWidth = 55;// 图片宽高
private final int r = 120;// 半径
private final int maxTimeSpent = 200;// 最长动画耗时
private final int minTimeSpent = 80;// 最短动画耗时
private int intervalTimeSpent;// 每相邻2个的时间间隔
private List<ImageButton> btns;// 弹出按钮集合
private ImageButton btn_menu;// 弹出菜单的按钮
private RelativeLayout.LayoutParams params;// 参数
private boolean isOpen = false;// 是否菜单打开状态
private float angle;// 每个按钮之间的夹角
private RelativeLayout buttons_layout = null;
/** 按钮是否被点击 */
private boolean isclick = false;
public AnimButtons(Context context) {
super(context);
this.context = context;
}
public AnimButtons(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
@Override
protected void onFinishInflate() {
super.onFinishInflate();
View view = LayoutInflater.from(context).inflate(R.layout.anim_buttons,
this);
initButtons(view);
}
/**
* 初始化数据
*
* @param view
*/
private void initButtons(View view) {
buttons_layout = (RelativeLayout) view
.findViewById(R.id.buttons_layout);
// 6个按钮,具体视情况而定
btns = new ArrayList<ImageButton>();
btns.add((ImageButton) view.findViewById(R.id.btn_home));
btns.add((ImageButton) view.findViewById(R.id.btn_conparison));
btns.add((ImageButton) view.findViewById(R.id.btn_video));
btns.add((ImageButton) view.findViewById(R.id.btn_contrast));
btn_menu = (ImageButton) view.findViewById(R.id.btn_menu);
for (int i = 0; i < btns.size(); i++) {
btns.get(i).setLayoutParams(btn_menu.getLayoutParams());// 初始化的时候按钮都重合
btns.get(i).setTag(String.valueOf(i));
btns.get(i).setOnClickListener(clickListener);
}
intervalTimeSpent = (maxTimeSpent - minTimeSpent) / btns.size();// 20
angle = (float) Math.PI / (2 * (btns.size() - 1));
}
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
btn_menu.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
isclick = true;
clickMenuListenerAnimButtons();
}
});
}
/**
* 关闭菜单
*/
public void closeMenuAnimButtons() {
if (isOpen && !isclick) {
clickMenuListenerAnimButtons();
}
}
public void clickMenuListenerAnimButtons() {
if (!isOpen) {
isOpen = true;
setButtonVisiblity();
for (int i = 0; i < btns.size(); i++) {
float xLenth = (float) (r * Math.cos(i * angle));
float yLenth = (float) (r * Math.sin(i * angle));
if (i == 1) {
btns.get(i).startAnimation(
animTranslate(-xLenth, yLenth,
(int) (btn_menu.getLeft() - xLenth + 5),
(int) yLenth - 5, btns.get(i), minTimeSpent
+ i * intervalTimeSpent));
} else if (i == 3) {
btns.get(i).startAnimation(
animTranslate(-xLenth, yLenth,
(int) (btn_menu.getLeft() - xLenth),
(int) yLenth + 10, btns.get(i),
minTimeSpent + i * intervalTimeSpent));
} else {
btns.get(i).startAnimation(
animTranslate(-xLenth, yLenth,
(int) (btn_menu.getLeft() - xLenth),
(int) yLenth, btns.get(i), minTimeSpent + i
* intervalTimeSpent));
}
}
buttons_layout
.setBackgroundResource(R.drawable.menu_button_click_bg);
btn_menu.setBackgroundResource(R.drawable.menu_button_click);
} else {
isOpen = false;
for (int i = 0; i < btns.size(); i++) {
float xLenth = (float) (r * Math.cos(i * angle));
float yLenth = (float) (r * Math.sin(i * angle));
btns.get(i).startAnimation(
animTranslate(xLenth, -yLenth, btn_menu.getLeft(),
btn_menu.getTop(), btns.get(i), maxTimeSpent
- i * intervalTimeSpent));
btns.get(i).setVisibility(View.GONE);
}
buttons_layout.setBackgroundResource(R.color.transparent);
btn_menu.setBackgroundResource(R.drawable.menu_button);
}
}
/***
* 设置按钮可见
*/
public void setButtonVisiblity() {
for (int i = 0; i < btns.size(); i++) {
btns.get(i).setVisibility(View.VISIBLE);
}
}
private Animation animTranslate(float toX, float toY, final int lastX,
final int lastY, final ImageButton button, long durationMillis) {
Animation animation = new TranslateAnimation(0, toX, 0, toY);
animation.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationRepeat(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
params = new RelativeLayout.LayoutParams(0, 0);
params.height = buttonWidth;
params.width = buttonWidth;
params.setMargins(lastX, lastY, 0, 0);
button.setLayoutParams(params);
button.clearAnimation();
}
});
animation.setDuration(durationMillis);
return animation;
}
/**
* 点击事件的监听
*/
View.OnClickListener clickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
int selectedItem = Integer.parseInt((String) v.getTag());
if (onButtonClickListener != null) {
onButtonClickListener.onButtonClick(v, selectedItem);
}
setButtonGone();
}
};
public boolean isOpen() {
return isOpen;
}
private OnButtonClickListener onButtonClickListener;
/**
* 点击事件接口
*
* @author macro
*
*/
public interface OnButtonClickListener {
void onButtonClick(View v, int id);
}
/**
* 设置点击事件
*
* @param onButtonClickListener
*/
public void setOnButtonClickListener(
OnButtonClickListener onButtonClickListener) {
this.onButtonClickListener = onButtonClickListener;
}
public void setButtonGone() {
isOpen = false;
for (int i = 0; i < btns.size(); i++) {
float xLenth = (float) (r * Math.cos(i * angle));
float yLenth = (float) (r * Math.sin(i * angle));
btns.get(i).startAnimation(
animTranslate(xLenth, -yLenth, btn_menu.getLeft(),
btn_menu.getTop(), btns.get(i), maxTimeSpent - i
* intervalTimeSpent));
btns.get(i).setVisibility(View.GONE);
}
buttons_layout.setBackgroundResource(R.color.transparent);
btn_menu.setBackgroundResource(R.drawable.menu_button);
}
}
配置文件:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/buttons_layout"
android:layout_width="210dp"
android:layout_height="210dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@android:color/transparent" >
<ImageButton
android:id="@+id/btn_contrast"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/menu_contrast_selector"
android:contentDescription="@string/des_contrast"
android:visibility="gone" />
<ImageButton
android:id="@+id/btn_video"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/menu_video_selector"
android:contentDescription="@string/des_video"
android:visibility="gone" />
<ImageButton
android:id="@+id/btn_conparison"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/menu_conparison_selector"
android:contentDescription="@string/des_conparison"
android:visibility="gone" />
<ImageButton
android:id="@+id/btn_home"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/menu_home_selector"
android:contentDescription="@string/des_menu"
android:visibility="gone" />
<ImageButton
android:id="@+id/btn_menu"
android:layout_width="75dp"
android:layout_height="75dp"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@drawable/menu_button" />
</RelativeLayout>