(四)实现菜单点击弹出提示框

      在上一篇文章中,我们给菜单的点击设置了动画,如果你没有阅读过,可以单击下面的链接:
http://www.cnblogs.com/fuly550871915/p/4930699.html

      贴出上一篇文章实现的效果图吧。如下:

 

      下面我们要实现的逻辑也很简单,点击菜单,弹出一个提示框。怎么实现呢,只需要在ArcMenu中提供一个回调接口即可。这样子,我们就可以在MainActivity中重写回调方法,然后再ArcMenu中点击菜单时调用即可。

      修改ArcMenu中的代码如下:

  1 package com.example.menu;
  2 
  3 import android.content.Context;
  4 import android.content.res.TypedArray;
  5 import android.util.AttributeSet;
  6 import android.util.TypedValue;
  7 import android.view.View;
  8 import android.view.View.OnClickListener;
  9 import android.view.animation.Animation;
 10 import android.view.animation.Animation.AnimationListener;
 11 import android.view.animation.AlphaAnimation;
 12 import android.view.animation.AnimationSet;
 13 import android.view.animation.RotateAnimation;
 14 import android.view.animation.ScaleAnimation;
 15 import android.view.animation.TranslateAnimation;
 16 import android.view.ViewGroup;
 17 
 18 public class ArcMenu extends ViewGroup implements OnClickListener{
 19     /**
 20      * 菜单按钮
 21      */
 22     private View mCBMenu;
 23     /**
 24      * 菜单的位置,为枚举类型
 25      * @author fuly1314
 26      *
 27      */
 28     private enum Position
 29     {
 30         LEFT_TOP,LEFT_BOTTOM,RIGHT_TOP,RIGHT_BOTTOM
 31     }
 32     /**
 33      * 菜单的状态
 34      * @author fuly1314
 35      *
 36      */
 37     private enum Status
 38     {
 39         OPEN,CLOSE
 40     }
 41     /**
 42      * 菜单为当前位置,默认为RIGHT_BOTTOM,在后面我们可以获取到
 43      */
 44     private Position mPosition = Position.RIGHT_BOTTOM;
 45     /**
 46      * 菜单的当前状态,默认为关闭
 47      */
 48     private Status mCurStatus = Status.CLOSE;
 49     
 50     /**
 51      * 菜单的半径,默认为120dp
 52      */
 53     
 54     /**
 55      * 提供一个回调接口,用来处理菜单的点击事件,点击后需要处理的事情
 56      */
 57     public interface ArcMenuListener
 58     {
 59         void dealMenuClick(View v);
 60     }
 61     public void setOnArcMenuListener(ArcMenuListener listener){
 62         
 63         mListener = listener;
 64     }
 65     private ArcMenuListener mListener;
 66     
 67     
 68     
 69     private int mRadius = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150,
 70             getResources().getDisplayMetrics());
 71 
 72     
 73     
 74     public ArcMenu(Context context) {
 75         this(context,null);
 76     }
 77     public ArcMenu(Context context, AttributeSet attrs) {
 78         this(context,attrs,0);
 79     }
 80     public ArcMenu(Context context, AttributeSet attrs, int defStyle) {
 81         super(context, attrs, defStyle);
 82         
 83         TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.ArcMenu, defStyle, 0);
 84         //获取到菜单设置的位置
 85         int position = ta.getInt(R.styleable.ArcMenu_position, 3);
 86         
 87         switch(position){
 88         case 0:
 89             mPosition = Position.LEFT_TOP;
 90             break;
 91         case 1:
 92             mPosition = Position.LEFT_BOTTOM;
 93             break;
 94         case 2:
 95             mPosition = Position.RIGHT_TOP;
 96             break;
 97         case 3:
 98             mPosition = Position.RIGHT_BOTTOM;
 99             break;
100         }
101         
102         //获取到菜单的半径
103         mRadius = (int) ta.getDimension(R.styleable.ArcMenu_radius,
104                 TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 120,
105                         getResources().getDisplayMetrics()));            
106         ta.recycle();
107         
108     }
109     
110     
111     
112     /**
113      * 测量各个子View的大小
114      */
115     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) 
116     {
117         int count = getChildCount();//获取子view的数量
118         
119         for(int i=0;i<count;i++)
120         {
121             //测量子view的大小
122             measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec);
123         }
124         
125         super.onMeasure(widthMeasureSpec, heightMeasureSpec);
126     }
127 
128     /**
129      * 摆放各个子view的位置
130      */
131     protected void onLayout(boolean changed, int l, int t, int r, int b) {
132         
133         if(changed)//如果发生了改变,就重新布局
134         {
135             layoutMainMenu();//菜单按钮的布局
136             /**
137              * 下面的代码为菜单的布局
138              */
139             int count = getChildCount();
140             
141             for(int i=0;i<count-1;i++)
142             {
143                 View childView = getChildAt(i+1);//注意这里过滤掉菜单按钮,只要菜单选项view
144                 
145                 childView.setVisibility(GONE);//先让菜单消失
146                 
147                 int left = (int) (mRadius*Math.cos(Math.PI/2/(count-2)*i));
148                 int top = (int) (mRadius*Math.sin(Math.PI/2/(count-2)*i));
149 
150                 
151                 
152                 switch(mPosition)
153                 {
154                 
155                 case LEFT_TOP:
156                     break;
157                 case LEFT_BOTTOM:
158                     top = getMeasuredHeight() - top-childView.getMeasuredHeight();
159                     break;
160                 case RIGHT_TOP:
161                     left = getMeasuredWidth() - left-childView.getMeasuredWidth();
162                     break;
163                 case RIGHT_BOTTOM:
164                     left = getMeasuredWidth() - left-childView.getMeasuredWidth();
165                     top = getMeasuredHeight() - top-childView.getMeasuredHeight();
166                     break;
167                 }
168                 
169                 childView.layout(left, top, left+childView.getMeasuredWidth(),
170                         top+childView.getMeasuredHeight());
171             }
172         }
173 
174         
175     }
176     /**
177      * 菜单按钮的布局
178      */
179     private void layoutMainMenu() {
180         
181          mCBMenu = getChildAt(0);//获得主菜单按钮
182          
183          mCBMenu.setOnClickListener(this);
184         
185         int left=0;
186         int top=0;
187         
188         switch(mPosition)
189         {
190         case LEFT_TOP:
191             left = 0;
192             top = 0;
193             break;
194         case LEFT_BOTTOM:
195             left = 0;
196             top = getMeasuredHeight() - mCBMenu.getMeasuredHeight();
197             break;
198         case RIGHT_TOP:
199             left = getMeasuredWidth() - mCBMenu.getMeasuredWidth();
200             top = 0;
201             break;
202         case RIGHT_BOTTOM:
203             left = getMeasuredWidth() - mCBMenu.getMeasuredWidth();
204             top = getMeasuredHeight() - mCBMenu.getMeasuredHeight();
205             break;
206         }
207         
208         mCBMenu.layout(left, top, left+mCBMenu.getMeasuredWidth(), top+mCBMenu.getMeasuredHeight());
209     }
210     /**
211      * 菜单按钮的点击事件
212      * @param v
213      */
214     public void onClick(View v) {
215         //为菜单按钮设置点击动画
216         RotateAnimation rAnimation = new RotateAnimation(0f, 720f, Animation.RELATIVE_TO_SELF, 0.5f, 
217                 Animation.RELATIVE_TO_SELF, 0.5f);
218         
219         rAnimation.setDuration(300);
220         
221         rAnimation.setFillAfter(true);
222         
223         v.startAnimation(rAnimation);
224         
225         dealChildMenu(300);//处理菜单选项,比如折叠菜单或者展开菜单
226         
227     }
228     /**
229      * 处理菜单选项,比如折叠菜单或者展开菜单
230      * @param duration 菜单选项的动画时间
231      */
232     private void dealChildMenu(int duration) 
233     {
234         
235         //下面的代码为菜单选项设置动画
236         
237         int count = getChildCount();
238         
239         for(int i=0;i<count-1;i++)
240         {
241             final View childView = getChildAt(i+1);
242             
243             AnimationSet set = new AnimationSet(true);
244             
245             //1.首先是平移动画
246             TranslateAnimation tAnimation = null;
247             
248             //平移的x方向和y方向的距离
249             int x = (int) (mRadius*Math.cos(Math.PI/2/(count-2)*i));
250             int y = (int) (mRadius*Math.sin(Math.PI/2/(count-2)*i));
251             
252             
253             
254             
255             //平移的标志,是平移一个正数还以一个负数
256             int xflag =1;
257             int yflag =1;
258         
259             if(mPosition == Position.LEFT_TOP||mPosition == Position.LEFT_BOTTOM)
260             {
261                 xflag = -1;
262             }
263             if(mPosition == Position.LEFT_TOP||mPosition == Position.RIGHT_TOP)
264             {
265                 yflag = -1;
266             }
267             
268             if(mCurStatus == Status.CLOSE)//如果当前状态为关闭则应该打开
269             {
270                  tAnimation = new TranslateAnimation(xflag*x, 0,
271                         yflag*y, 0);
272                 tAnimation.setDuration(duration);
273                 tAnimation.setFillAfter(true);
274     
275             }else//否则为打开状态,就应该关闭
276             {
277                  tAnimation = new TranslateAnimation( 0,xflag*x,
278                             0,yflag*y);
279                     tAnimation.setDuration(duration);
280                     tAnimation.setFillAfter(true);
281                     
282             }
283             tAnimation.setStartOffset((i * 100) / count);
284             tAnimation.setAnimationListener(new AnimationListener() {
285                 
286 
287                 public void onAnimationStart(Animation animation) {
288     
289                     
290                 }
291                 
292 
293                 public void onAnimationRepeat(Animation animation) {
294         
295                     
296                 }
297                 
298 
299                 public void onAnimationEnd(Animation animation) {
300 
301                     if(mCurStatus == Status.CLOSE)
302                     {
303                         childView.setVisibility(GONE);
304                         childView.setClickable(false);
305                         childView.setFocusable(false);
306                     }
307                     if(mCurStatus == Status.OPEN)
308                     {
309                         childView.setVisibility(VISIBLE);//设置菜单可见
310                         //为打开状态,则菜单是可点击和获得焦点
311                         childView.setClickable(true);
312                         childView.setFocusable(true);
313                     }
314                     
315                 }
316             });
317             
318             //2.然后是旋转动画
319             RotateAnimation rAnimation = new RotateAnimation(0f, 0, Animation.RELATIVE_TO_SELF, 0.5f, 
320                     Animation.RELATIVE_TO_SELF, 0.5f);
321             rAnimation.setDuration(duration);
322             rAnimation.setFillAfter(true);//动画结束是画面停留在此动画的最后一帧
323             
324             
325             set.addAnimation(rAnimation);//一定要注意顺序,先旋转动画,然后再平移
326             set.addAnimation(tAnimation);
327             
328             childView.startAnimation(set);
329             
330             //为菜单项设置点击事件
331             final int cPos = i+1;
332             childView.setOnClickListener(new OnClickListener() {
333                 
334                 @Override
335                 public void onClick(View v) {
336                     
337                     clickAnimation(cPos);//点击动画
338                     
339                     if(mListener != null)//处理点击事件的逻辑
340                     {
341                         mListener.dealMenuClick(childView);
342                     }
343                     
344                     changeStatus();
345                     
346                     
347                 }
348             });
349             
350             
351         }
352         
353         changeStatus();//动画完成后,要改变状态
354         
355     }
356     /**
357      * 改变状态
358      */
359     private void changeStatus() {
360         
361         mCurStatus = (mCurStatus == Status.CLOSE?Status.OPEN:Status.CLOSE);
362         
363     }
364     /**
365      * 菜单项的点击动画
366      * @param cPos  用来判断当前点击的是哪一个菜单
367      */
368     private void clickAnimation(int cPos) {
369         
370         for(int i=0;i<getChildCount()-1;i++)
371         {
372             View childView = getChildAt(i+1);
373             
374             if(i+1== cPos)
375             {
376                 AnimationSet set = new AnimationSet(true);
377                 ScaleAnimation sAnimation = new ScaleAnimation(1.0f, 3.0f, 1.0f, 3.0f,
378                         Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
379                 sAnimation.setFillAfter(true);
380                 AlphaAnimation alAnimation = new AlphaAnimation(1.0f, 0f);
381                 alAnimation.setFillAfter(true);
382                 
383                 set.addAnimation(sAnimation);
384                 set.addAnimation(alAnimation);
385                 
386                 set.setDuration(300);
387                 childView.startAnimation(set);
388                 
389             }else
390             {
391                 AnimationSet set = new AnimationSet(true);
392                 ScaleAnimation sAnimation = new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f,
393                         Animation.RELATIVE_TO_SELF, 0.5f,Animation.RELATIVE_TO_SELF, 0.5f);
394                 sAnimation.setFillAfter(true);
395                 AlphaAnimation alAnimation = new AlphaAnimation(1.0f, 0f);
396                 alAnimation.setFillAfter(true);
397                 
398                 set.addAnimation(sAnimation);
399                 set.addAnimation(alAnimation);
400                 
401                 set.setDuration(300);
402                 childView.startAnimation(set);
403             }
404             childView.setVisibility(GONE);
405         }
406         
407     }
408 
409 }

       红色部分是我们添加的主要代码。无非就是一个回调接口,没事什么好解释的了。

      下面修改MainActivity中的代码即可,如下:

 1 package com.example.menu;
 2 
 3 import com.example.menu.ArcMenu.ArcMenuListener;
 4 
 5 import android.os.Bundle;
 6 import android.view.View;
 7 import android.widget.Toast;
 8 import android.app.Activity;
 9 
10 public class MainActivity extends Activity implements ArcMenuListener {
11 
12     private ArcMenu menu;
13     @Override
14     protected void onCreate(Bundle savedInstanceState) {
15         super.onCreate(savedInstanceState);
16         setContentView(R.layout.activity_main);
17         
18         menu = (ArcMenu) findViewById(R.id.id_menu);
19         menu.setOnArcMenuListener(this);
20     }
21 
22 
23     public void dealMenuClick(View v) {
24         
25         Toast.makeText(this, "这是"+v.getTag(), Toast.LENGTH_SHORT).show();
26         
27     }
28     
29 }

        我们看红色部分的代码,重写了回调方法。无非就是获取之前布局中ImageView中设置的tag,然后把它放在提示框中罢了。运行程序效果如下:

 

 

       至此,我们的这个案例终结了。主要难点就是自定义ViewGroup,相信你通过这个案例,对自定义ViewGroup应该有了很好的了解了。

 

转载于:https://www.cnblogs.com/fuly550871915/p/4930877.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
苹果iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X操作系统一样,它也是以Darwin为基础的,因此同样属于类Unix的商业操作系统。原本这个系统名为iPhone OS,直到2010年6月7日WWDC大会上宣布改名为iOS。截止至2011年11月,根据Canalys的数据显示,iOS已经占据了全球智能手机系统市场份额的30%,在美国的市场占有率为43%。 源码列表: 按钮类 按钮 Drop Down Control 按钮-Circular Music Player Control 》》Flat Pill Button 按钮类--Fancy Menu 按钮之Custom Gradient Button 按钮之Flat Button 按钮之NIDropDown 按钮之Popup Menu 按钮之UIMenuItem with Image 标签类 标签之Emoji Label 标签之Justifier Label 标签之Top Aligning Label 标签之单一label多颜色多字体 弹出视图 弹出视图 View Bounce Animation 弹出视图(Popup View)UIPopoverListView 弹出视图(Popup View)之URBAlertView 弹出视图(Popup View)之自定义菜单UIMenuBar 弹出视图-Patterned Alert View 弹出视图-Table Alert 弹出视图类--Blur ModalView 弹出视图类--Depth View 弹出视图类--FWTPopover 弹出视图类--icon sheet 弹出视图类--Informatic Toolbar 弹出视图类--WCAlertView 弹出视图之Depth Modal 弹出视图之SelectViewController 导航条 导航条(Navigation Bar)Navigation Menu 导航条(Navigation Bar)之Menu on NavigationBar 导航条类--iOS更换皮肤 导航条之Breadcrumb View 导航条之NavBarNotificationView 导航条之NavigationController Transition 导航条之Title Swipe View 导航条之Title View on NavigationBar 地图类--自定义地图标注 地图(Map)之SJOPaperboy 地图类--Custom Annotation 地图类--DirectionsKit 地图类--Location Indicator 地图类--简单的地图路径 地图类--自定义地图标注 动画类 动画--Spring LoadedView 动画-UIKitForGame 动画类--Guide Arrow 动画之Animation Sequence 动画之Genie Effect 动画之Steam View 分段选择类 分段选择(Segment)之URBSegmentedControl 分段选择类--SVSegmentedControl 扩展 分段选择之AKSegmentedControl 分段选择之Color Bar Segments 滚动视图 滚动的标签 滚动视图(ScrollView)Scroll Grid Controller 滚动视图--Infinite GridView 滚动视图类--CoverFlow 滚动视图类-Lazy ScrollView 滚动视图类--Parallax ScrollView 滚动视图类--Parallax View 滚动视图类-简单的广告栏 滚动视图类--拖动UIScrollView放大图片 滚动视图之Extended UIScrollView 滚动视图之MCPagerView 滚动视图之Page Scrubber Bar 滚动视图之Parallel View 滚动视图之SBFlowView 滚动视图之Wheel Component 汉字转换为拼音 滑竿类 滑杆(Slider)Circular Slider View 滑杆(Slider)之Range Selector 滑杆(Slider)之Volume Bar 滑杆类-Vertical Slider View 滑杆之Slider popover 滑杆之Trim Control 绘图类--My Palette 绘图类--超级简单的画正方形的方法 绘图之Drawing View 基于FMDB的数据库操作 简单阅读器 键盘类 键盘(Keyboard)之自定义表情键盘 键盘-FaceBoard 键盘-Keyboard Bar TextField 键盘类》》Number PadView 键盘类》》ZenKeyboard 键盘类--自定义的拨号键盘 键盘之Custom iOS Keyboard 进图条类 进度条(Progress)Circular Progress View 进度条(Progress)之Progress Toolbar 进度条-Colorful ProgressView 进度条类--Range Slider With Progress 进度条之circular timer 进度条之MCProgressView 开关类 开关(Switch)之RESwitch 开关-Simple Switch Demo 开关之Toggle View 开关之TTSwitch 列表类 联系人搜索算法 列表 纵向Table里嵌套横向Table 列表(Table)Cell Flip Segue 列表(Table)之DynamicHeights 列表(Table)之Expansion Table 列表(Table)之Horizontal table 列表(Table)之Pull Up To Refresh 列表(Table)之TableView with SearchBar 列表(Table)之UITable嵌套UITable 列表(Table)之UploadProgressView 列表-Rainbow Styled Pull To Refresh 列表-UITableView背景随动 列表类》》自定义Table View折叠效果 列表类-FormInputAccessoryView 列表类-Grid TableView 列表类-Grouped TableView With Shadows 列表类--iOS 6.0 Pull to Refresh 列表类--Section Selection View 列表类--Styled TableViewCell 列表类--TableView的各种操作 列表类--UIListView 列表类--下拉刷新加载SQLite数据 列表-让TableView的子view保持固定 列表之ExpansionTableView 列表之iOS Tree Component 列表之Refresh Control 列表之首列固定的列表 日历类 日历(Calendar)之Calendar Picker 日历(Calendar)之TimesSquare 日历之CalendarView 日历控件 日历之封装的My97DatePicker日历 社交类 社交分享-SinaWeibo Share 社交分享类》》ios6 Share Demo 社交分享类--Social Share TableViewCell 社交分享之KRShare 社交分享之MessageActivities 社交分享之ShareSDK 视图布局类 视图布局(View Layout)Border View 视图布局(View Layout)之Linear Layout View 视图布局(View Layout)之Quilt Layout 视图布局(View Layout)之模仿ness伸缩效果 视图布局-Animated Grid 视图布局-Note ViewController 视图布局-Side bar demo 视图布局-Sliding Grid View 视图布局类》》Circle Layout 视图布局类-HGPhoto Wall 视图布局类--Scaling For iPad mini 视图布局类--Swipe ViewController 视图布局之Cycled Viewer 视图布局之Dragging Buttons 视图布局之Mosaic UI 视图布局之Rounded View 视图手势切换 视图切换(View Transition)GuideViewController 视图切换类-3D浏览器 视图切换类--zaker应用进入画面效果 视图切换之视图切换大小渐变效果 手势交互--物体根据重力感应运动 手势交互之Drag View 手势交互之Touch Visualizer 图表类 图表--百分比圆环 图表类--Percentage Chart 图表类--极简个税计算器 图表之Rotation Pie Chart 图表之实时更新的曲线图 图像类 图像(Image)Transition ImageView 图像(Image)之Colorized Progress View 图像-AsyncImageView 图像-Blurred Image 图像-iOS Image Editor 图像-NLImageCropper 图像-Scratch View 图像类 -Photo Zoom 图像类》》360 Degree Panorama 图像类--Before After 图像类--Crop Image 图像类--Image Category 图像类--Image Select and Crop 图像类--OLImageView 图像类View With Bordered Image 图像类--图片下载和保存 图像之AmazeKit 图像之Croppable View 图像之ImagePickerController of InstaPDF 图像之ImageView With Preview 图像之Media Focus Manager 图像之Multiple Image Picker 网络类 网络类--Downloader Management 网络类--photo批量上传ftp 网络类--Reachability 网络之Multi Downloader 文字视图类 文字视图(Text)之AutoComplete TextField 文字视图(Text)之Bar Track ball Item 文字视图(Text)之Messages TableViewController 文字视图(Text)之TextView Placeholder 文字视图-HashTag Mention Controller 文字视图-Tweet Label 文字视图类--Digit Input 文字视图类--emoji-converter 文字视图类--Placeholder TextView 文字视图类--Swipe Shift Caret 文字视图之Autocomplete UITextField 文字视图之Clickable Label 文字视图之Hyperlink Label 文字视图之Note View 文字视图之Rich Content Label 相机类 相机-iOSMp4Camera 相机类>>Camera多张拍摄Demo 相机类--flash light 相机之实用手电筒 选项卡类 选项卡之AKTabBarController 选项卡之Arc Tab 选项卡之LSTabs 选择器类 选择器类--PickerView with Search Bar 选择器类--Value Selector 选择器类--Wheel Menu 选择器类--老虎机 选择器之定制多选的PickerView 音频声效类 音频声效 VoiceTTS Demo 音频声效(Audio)之语音识别 音频声效-iOS Mp3 Recorder 音频声效--VoiceTTS Demo 音频声效类--AAC Audio Converter 音频声效类--BobMusic播放器 音频声效类--Groover 音频声效之Hysteria Player 音频声效之Sound Board 游戏引擎类 游戏引擎(cocos2d)Castle Hassle 游戏引擎类》》模仿合金弹头Demo 游戏引擎类--tank大战 游戏引擎类--Tiny Seal 游戏引擎类--基于cocos2d的连连看游戏 游戏引擎类--简单炸弹人小游戏源码 游戏引擎类--切水果游戏 游戏引擎类幸运大转盘的抽奖游戏 游戏引擎-推箱子游戏 游戏引擎之雷电游戏的激光子弹 指示器类 指示器(HUD)之Android Style Toast 指示器-Activity Bar 指示器--Notify HUD 指示器之MBAlertView 指示器之YLActivityIndicatorView 其他类 财付通打印票据和拖动银行卡效果 寸光阴课程表 功能齐全的计算器 每日金句 扫雷游戏 数字输入 天气预报 之DDClock 之滚动视图旋转菜单 状态栏-StatusBar Notifier View 状态栏之MPNotificationView Ad Controller AdMob demo Animation之Gmail Like Loading AWVersionAgent Bee Framework Circle Menu Cocoa Touch Barcodes Contact Picker FileMD5Hash Fontastic Icons fontawesome Harpy iHasApp In-App Feedback In-App Purchase Inner Shadow Layer Keyboard之DLIDEKeyboard Leak Hunter Message Template NSLogger NSUndoManager Demo Open InApp Activity Passcode Passcode Lock Rating Control SBook ScaffoldKit for Core Data Shine Effect SKYdata Sliding Puzzle Board Spotlight System File Browser Ternary Search Tree UIBezierPath Symbol UITextField 焦点提示 Webview之UIWebView 离线浏览
也是一个点击主Button,动画地弹出菜单的控件。相比于ExpandableButto的优点是子菜单的数量不限。项目地址:https://github.com/onivas/MenuAnimation 效果图:如何使用需要创建个<FrameLayout>的布局,注意必须是<FrameLayout>, 用于存在子菜单。<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:tools="http://schemas.android.com/tools"     android:id="@ id/container"     android:layout_width="match_parent"     android:layout_height="match_parent"     android:paddingBottom="16dp"     android:paddingRight="16dp"     android:paddingLeft="16dp"     android:paddingTop="16dp"     android:background="@android:color/white"     tools:context=".MyActivity"     > </FrameLayout>2. 绑定布局并添加子菜单FrameLayout frameLayout = (FrameLayout) findViewById(R.id.container); PromotedActionsLibrary promotedActionsLibrary = new PromotedActionsLibrary(); promotedActionsLibrary.setup(getApplicationContext(), frameLayout);//绑定布局 View.OnClickListener onClickListener = new View.OnClickListener() {//定义子菜单点击事件     @Override     public void onClick(View view) {          Toast.makeText(getApplicationContext(), "Button clicked.", Toast.LENGTH_SHORT).show();     } }; //创建三个子菜单 promotedActionsLibrary.addItem(getResources().getDrawable(android.R.drawable.ic_menu_edit), onClickListener); promotedActionsLibrary.addItem(getResources().getDrawable(android.R.drawable.ic_menu_send), onClickListener); promotedActionsLibrary.addItem(getResources().getDrawable(android.R.drawable.ic_input_get), onClickListener); //设置主按钮的图标 promotedActionsLibrary.addMainItem(getResources().getDrawable(R.drawable.ic_add));
点击一个主菜单按钮会弹出三个子菜单按钮的菜单控件,动画很优美,缺点是子菜单的数量是固定的,不能自定义。需要依赖 NineOldAndroids库。nineoldandroids-2.4.0.jar项目地址:https://github.com/lemonlabs/ExpandableButtonMenu 效果图:如何使用在<RelativeLayout>下创建<lt.lemonlabs.android.expandablebuttonmenu.ExpandableMenuOverlay><?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"     xmlns:ebm="http://schemas.android.com/apk/res-auto"     android:layout_width="match_parent"     android:layout_height="match_parent">          <lt.lemonlabs.android.expandablebuttonmenu.ExpandableMenuOverlay         android:id="@ id/button_menu"         android:layout_width="0dp"         android:layout_height="0dp"         android:layout_alignParentBottom="true"         android:layout_centerHorizontal="true"         android:src="@drawable/circle_home"         ebm:dimAmount="0.8"         ebm:mainButtonSize="0.25"         ebm:otherButtonSize="0.22"         ebm:distanceY="0.17"         ebm:distanceX="0.28"         ebm:bottomPad="0.02"         ebm:closeButtonSrc="@drawable/circle_close"         ebm:leftButtonSrc="@drawable/circle_1"         ebm:midButtonSrc="@drawable/circle_2"         ebm:rightButtonSrc="@drawable/circle_3"         ebm:leftButtonText="@string/action_left"         ebm:midButtonText="@string/action_mid"         ebm:rightButtonText="@string/action_right"/> </RelativeLayout>必须是在<RelativeLayout>内,不能是<LinearLayout>等其他容器。2. 设置监听器打开子菜单menuOverlay = (ExpandableMenuOverlay) findViewById(R.id.button_menu);         menuOverlay.setOnMenuButtonClickListener(new ExpandableButtonMenu.OnMenuButtonClick() {             @Override             public void onClick(ExpandableButtonMenu.MenuButton action) {                 switch (action) {                     case MID:                         Toast.makeText(MainActivity.this, "Mid pressed and dismissing...", Toast.LENGTH_SHORT).show();                         menuOverlay.getButtonMenu().toggle();//切换,此时是关闭子菜单                         break;                     case LEFT:                         Toast.makeText(MainActivity.this, "Left pressed", Toast.LENGTH_SHORT).show();                         break;                     case RIGHT:                         Toast.makeText(MainActivity.this, "Right pressed", Toast.LENGTH_SHORT).show();                         break;                 }             }         });

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值