自定义扇形菜单
来源:互联网 发布: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
- 自定义扇形菜单
- RoundMenuView一一自定义扇形菜单控件
- 自定义View之案列篇(二):扇形菜单
- Android开发-自定义View-AndroidStudio(三)扇形多级菜单
- Android 自定义view之扇形菜单(上)
- Android 自定义view之扇形菜单(中)
- 制作Flash扇形菜单
- ios扇形动画菜单
- css3扇形菜单
- ArcMenu扇形菜单(底部)
- 动画扇形菜单案例
- CSS3扇形动画菜单
- android 扇形菜单实现,android扇形
- android 自定义扇形
- 关于iOS android扇形菜单
- 仿扇形菜单动画效果
- android实现扇形仿优酷菜单
- android(6) 扇形菜单实现
- android log系统
- 数据库视频总结(1)——为用户着想
- 甲骨文1z0-591考试题库
- GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流
- 记View越界绘制
- 自定义扇形菜单
- 典型的贪心算法~ (田忌赛马 )
- 证明10^51+1能被1001整除
- 操作符与表达式
- 热浪
- setup git
- MFC的集合类
- android log系统
- Java与模式-中介者模式