自定义扇形菜单

自定义代码:

/**
 * 自定义扇形菜单(展示界面)
 * 
 * @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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值