自定义扇形菜单

来源:互联网 发布:java的final类 编辑:程序博客网 时间:2024/04/28 04:31

自定义代码:

/** * 自定义扇形菜单(展示界面) *  * @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>
0 0
原创粉丝点击