类型:编程工具大小:13.8M语言:英文 评分:5.5

标签:

立即下载

观察qqminihd界面,发现其界面能够左右滑动来实现两侧菜单效果。

自定义Layout:ScrollLayout.java

直接贴出代码:

1 package grimbo.android.demo.slidingmenu;

2

3 import android.content.Context;

4 import android.util.AttributeSet;

5 import android.util.Log;

6 import android.view.GestureDetector;

7 import android.view.GestureDetector.OnGestureListener;

8 import android.view.MotionEvent;

9 import android.view.View;

10 import android.view.ViewConfiguration;

11 import android.view.animation.AnimationUtils;

12 import android.widget.LinearLayout;

13 import android.widget.Scroller;

14

15 public class ScrollLayout extends LinearLayout {

16

17 //    private static final String TAG = "scroller";

18

19     private Scroller scroller;

20

21     private int currentScreenIndex;

22

23     private GestureDetector gestureDetector;

24

25     // 设置一个标志位,防止底层的onTouch事件重复处理UP事件

26     private boolean fling;

27

28     /**

29      * 菜单栏的宽度

30      */

31     int menuWidth=80;

32

33     /**

34      * 显示左边菜单

35      * 否则显示右边菜单

36      */

37     private boolean showLeft=true;

38

39     /**

40      * 滚出边界监听器

41      */

42     private OnScrollSideChangedListener scrollSideChangedListener;

43

44     public Scroller getScroller() {

45             return scroller;

46     }

47

48     public OnScrollSideChangedListener getScrollSideChangedListener() {

49         return scrollSideChangedListener;

50     }

51

52     public void setScrollSideChangedListener(

53             OnScrollSideChangedListener scrollSideChangedListener) {

54         this.scrollSideChangedListener = scrollSideChangedListener;

55     }

56

57     public ScrollLayout(Context context, AttributeSet attrs) {

58             super(context, attrs);

59             initView(context);

60     }

61

62     public ScrollLayout(Context context) {

63             super(context);

64             initView(context);

65     }

66

67     private void initView(final Context context) {

68             this.scroller = new Scroller(context,AnimationUtils.loadInterpolator(context,

69                     android.R.anim.overshoot_interpolator));

70

71             this.gestureDetector = new GestureDetector(new OnGestureListener() {

72

73                     @Override

74                     public boolean onSingleTapUp(MotionEvent e) {

75                             return false;

76                     }

77

78                     @Override

79                     public void onShowPress(MotionEvent e) {

80                     }

81

82                     @Override

83                     public boolean onScroll(MotionEvent e1, MotionEvent e2,

84                                     float distanceX, float distanceY) {

85

86                             {// 防止向第一页之前移动

87                                 if(1==currentScreenIndex)

88                                 {

89                                     int screenLeft=getWidth()-menuWidth;

90                                     if(showLeft && getScrollX()>screenLeft)

91                                     {

92                                         showLeft=false;

93 //                                        Log.e("TAG","显示右边菜单栏");

94                                         if(null!=scrollSideChangedListener)

95                                             scrollSideChangedListener.onScrollSideChanged(ScrollLayout.this, showLeft);

96                                     }

97                                     else if(!showLeft && getScrollX()

98                                     {

99                                         showLeft=true;

100 //                                        Log.e("TAG","显示左边菜单栏");

101                                         if(null!=scrollSideChangedListener)

102                                             scrollSideChangedListener.onScrollSideChanged(ScrollLayout.this, showLeft);

103                                     }

104                                 }

105

106                                     fling = true;

107                                     scrollBy((int) distanceX, 0);

108 //                                    Log.d("TAG", "on scroll>>>>>>>>>>>>>>>>>移动<<<<<<<<<<<<<<>>>");

109                             }

110                             return true;

111                     }

112

113                     @Override

114                     public void onLongPress(MotionEvent e) {

115                     }

116

117                     @Override

118                     public boolean onFling(MotionEvent e1, MotionEvent e2,

119                                     float velocityX, float velocityY) {

120

121                             if (Math.abs(velocityX) > ViewConfiguration.get(context)

122                                             .getScaledMinimumFlingVelocity())

123                             {// 判断是否达到最小轻松速度,取绝对值的

124                                 fling = true;

125                                 snapToDestination();

126 //                                Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>滑动<<<<<<<<<<<<<<>>>");

127                             }

128

129                             return true;

130                     }

131

132                     @Override

133                     public boolean onDown(MotionEvent e) {

134                             return false;

135                     }

136             });

137

138     }

139     //每一个屏的边界值

140     //0----[getWidth()-20]----[2*getWidth()-20]-----[3*getWidth()-40]

141

142

143     @Override

144     protected void onLayout(boolean changed, int left, int top, int right,

145                     int bottom) {

146             /**

147              * 设置布局,将子视图顺序横屏排列

148              */

149             super.onLayout(changed, left, top, right, bottom);

150             int move=getWidth()-menuWidth;

151             for (int i = 0; i < getChildCount(); i++)

152             {

153                     View child = getChildAt(i);

154 //                    child.setVisibility(View.VISIBLE);

155                     //移动一定的距离

156                     child.layout(child.getLeft()+move,child.getTop(),child.getRight()+move,child.getBottom());

157             }

158     }

159

160     @Override

161     public void computeScroll() {

162             if (scroller.computeScrollOffset()) {

163 //                    Log.d(TAG, ">>>>>>>>>>computeScroll>>>>>"+scroller.getCurrX());

164                     scrollTo(scroller.getCurrX(), 0);

165                     postInvalidate();

166             }

167     }

168

169     @Override

170     public boolean onTouchEvent(MotionEvent event) {

171

172             float x2s=getScrollX()+event.getX();

173

174             if(x2s2*getWidth()-menuWidth)

175             {//动作在区域外面

176                 if(!fling)//没有在滑动

177                 {

178 //                    Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>动作在区域外面 没有在滑动<<<<<<<<<<<<<<>>>");

179                     return false;

180                 }

181                 else if(MotionEvent.ACTION_UP!=event.getAction())

182                 {//否则如果也不是抬起手势,则强制模拟抬起

183                     snapToDestination();

184                     fling = false;

185 //                    Log.d(TAG, "on scroll>>>>>>>>>>>>>>>>>动作在区域外面 在滑动 也不是抬起手势<<<<<<<<<<<<<<>>>");

186                     return false;

187                 }

188 //                Log.e(TAG, "on scroll>>>>>>>>>>>>>>>>>动作在区域外面 在滑动 是抬起手势<<<<<<<<<<<<<<>>>");

189             }

190

191             gestureDetector.onTouchEvent(event);

192

193             switch (event.getAction()) {

194             case MotionEvent.ACTION_DOWN:

195                     break;

196             case MotionEvent.ACTION_MOVE:

197                     break;

198             case MotionEvent.ACTION_UP:

199 //                    Log.d(TAG, ">>ACTION_UP:>>>>>>>> MotionEvent.ACTION_UP>>>>>");

200 //                    if (!fling)

201                     {

202                             snapToDestination();

203                     }

204                     fling = false;

205                     break;

206             default:

207                     break;

208             }

209             return true;

210     }

211

212     /**

213      * 切换到指定屏

214      *

215      * @param whichScreen

216      */

217     public void scrollToScreen(int whichScreen) {

218             if (getFocusedChild() != null && whichScreen != currentScreenIndex

219                             && getFocusedChild() == getChildAt(currentScreenIndex)) {

220                     getFocusedChild().clearFocus();

221             }

222             int delta = 0;

223

224             if(whichScreen==0)

225                 delta= - getScrollX();

226             else if(whichScreen==1)

227                 delta= getWidth()-menuWidth- getScrollX();

228             else if(whichScreen==2)

229                 delta= 2*(getWidth()-menuWidth)- getScrollX();

230             else

231                 return;

232 //                delta = whichScreen * getWidth() - getScrollX();

233

234             scroller.startScroll(getScrollX(), 0, delta, 0, Math.abs(delta) * 2);

235             invalidate();

236

237             currentScreenIndex = whichScreen;

238     }

239

240     /**

241      * 根据当前x坐标位置确定切换到第几屏

242      */

243     private void snapToDestination() {

244

245         if(getScrollX()

246             scrollToScreen(0);

247         else if(getScrollX()

248             scrollToScreen(1);

249         else

250             scrollToScreen(2);

251     }

252

253     public interface OnScrollSideChangedListener

254     {

255         public void onScrollSideChanged(View v,boolean leftSide);

256     }

257 }

接下来,在定义activity里面的布局my_layout.xml:

1 <?xml version="1.0" encoding="utf-8"?>

2

3     xmlns:app="http://schemas.android.com/apk/res/grimbo.android.demo.slidingmenu"

4     android:id="@+id/FrameLayout1"

5     android:layout_width="match_parent"

6     android:layout_height="match_parent" >

7

8         android:layout_width="match_parent"

9         android:layout_height="match_parent"

10         android:id="@+id/left_menu"

11         android:background="#333"

12         android:orientation="vertical" >

13

14

15             android:layout_width="200dp"

16             android:layout_height="wrap_content"

17             android:text="左菜单一" />

18

19             android:layout_width="200dp"

20             android:layout_height="wrap_content"

21             android:text="左菜单二" />

22

23

24

25         android:id="@+id/right_menu"

26         android:layout_width="match_parent"

27         android:layout_height="match_parent"

28         android:background="#666"

29         android:orientation="horizontal" >

30

31             android:layout_width="wrap_content"

32             android:layout_height="wrap_content"

33             android:layout_weight="1"

34             android:orientation="vertical" >

35

36

37             android:layout_width="200dp"

38             android:layout_height="wrap_content"

39             android:orientation="vertical" >

40

41                 android:layout_width="match_parent"

42                 android:layout_height="wrap_content"

43                 android:text="右菜单一" />

44

45                 android:layout_width="match_parent"

46                 android:layout_height="wrap_content"

47                 android:text="右菜单二" />

48

49

50

51

52

53         android:layout_width="match_parent"

54         android:orientation="vertical"

55         android:id="@+id/my_scrollLayout"

56         android:layout_height="match_parent">

57

58             android:layout_width="match_parent"

59             android:layout_height="match_parent"

60             android:background="#aaa"

61             android:orientation="vertical" >

62

63

64

65                 android:id="@+id/button1"

66                 android:layout_width="match_parent"

67                 android:layout_height="wrap_content"

68                 android:text="Button Button" />

69

70

71                 android:id="@+id/spinner1"

72                 android:layout_width="match_parent"

73                 android:layout_height="wrap_content" />

74

75

76                 android:id="@+id/seekBar1"

77                 android:layout_width="match_parent"

78                 android:layout_height="wrap_content" />

79

80

81

82

83

84

最后,在activity里面的onCreate函数里加上:

1 setContentView(R.layout.my_layout);

2

3 final LinearLayout left=(LinearLayout)findViewById(R.id.left_menu);

4 final LinearLayout right=(LinearLayout)findViewById(R.id.right_menu);

5 right.setVisibility(View.GONE);

6 left.setVisibility(View.VISIBLE);

7

8 ScrollLayout mScrollLayout=(ScrollLayout)findViewById(R.id.my_scrollLayout);

9 mScrollLayout.setScrollSideChangedListener(new OnScrollSideChangedListener() {

10 @Override

11 public void onScrollSideChanged(View v, boolean leftSide) {

12 if(leftSide)

13 {

14 right.setVisibility(View.GONE);

15 left.setVisibility(View.VISIBLE);

16 }else

17 {

18 right.setVisibility(View.VISIBLE);

19 left.setVisibility(View.GONE);

20 }

21 }

22 });

大功告成!左右滑动是弹性效果也一并实现~

android qq弹出菜单,Android开发实现qqminihd 左右滑动菜单效果相关推荐

  1. android 日期弹出框,Android 日期选择框 简洁常用

    /*** @description 选择日期弹出框 *@paramlistener 选择日期确定后执行的接口 *curDate 当前显示的日期 *@return*@authorwqy * @time ...

  2. android 不停弹出权限,Android部分手机“后台弹出界面权限”解决方案

    在前段时间的编程开发中,突然发现一个小坑的地方,其实在Android官方中并没有限制,但是在很多厂商的系统中却做了修改限制,那就是"后台弹出界面权限" 最开始发现这个问题,是因为我 ...

  3. android timer弹出窗口,android – 如何在服务类中的Timer内显示AlertDialog?

    我想在Service类的Timer中显示AlertDialog,我使用以下代码: timer.scheduleAtFixedRate( new TimerTask() { private Handle ...

  4. android fragment 弹出对话框,Android中使用Dialogfragment显示对话框

    其他注意事项: 1.如何设置自己的Dialogfragment没有标题栏? 可以通过两种方法来设置 ,一种是使用dialogfragment的setStyle函数,另外就是使用getDialog(). ...

  5. android webview 弹出浏览器,android – 防止WebView打开浏览器

    我已经为给定的WebView启用了JavaScript,并在WebView中打开了新链接,而不是在浏览器中. 这是主要活动 package com.Afrogfx.pronouns; import a ...

  6. android fragment 弹出对话框,Android DialogFragment弹框实现

    前言: 网上说了一堆好处,我只说自己深有体会的两点吧 1.屏幕横竖屏切换的时候,弹框可以保存状态 2.可以在popwindow中使用 使用步骤 1.创建继承DialogFragment的dialogF ...

  7. android 上下收缩动画,Android 带有弹出收缩动画的扇形菜单实例

    最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下. 效果如下 public class MainActivity extends AppCompatActivity impl ...

  8. android popupmenu 动态添加,Android PopupMenu弹出菜单的实现

    Android PopupMenu弹出菜单的实现 (1)布局文件:用于弹出菜单的处罚button: xmlns:tools="http://schemas.android.com/tools ...

  9. 解决 android 输入法弹出输入框被遮挡的问题

    解决 android 输入法弹出输入框被遮挡的问题 由于本人懒,也从不写博客,之所以写是因为这次开发 '又遇到' 输入法这个问题了,好久以前有遇到过,突然发现还是很有必要把他分享出来,言归正传,下面就 ...

最新文章

  1. php连接到mysql数据库,PHP MySQL:连接到MySQL数据库
  2. C++ remove、remove_copy、remove_if和remove_copy_if函数使用详解
  3. kafka to mysql_Flink : kafka to mysql example
  4. python中 是什么运算符_Python 运算符
  5. python3异步协程爬虫_Python实现基于协程的异步爬虫
  6. Windows Mobile开发应该选择哪种开发语言?
  7. 我的世界服务器改地皮生态系统,我的世界服务器怎么把地皮世界改为和平模式?...
  8. java.util.regex.PatternSyntaxException: Dangling meta character '?' near index 0特殊字符表达
  9. 曾经的 Java IDE 王者 Eclipse 真的没落了?21 款插件让它强大起来!
  10. linux内存管理_架构师必读:Linux 的内存分页管理
  11. 软件工程师 算法工程师_如何像软件工程师一样撰写文章
  12. 图的m着色问题回溯法求解
  13. 《决战大数据》读书笔记(一) 收集数据和使用数据要有关联
  14. 云栖大会压轴好戏 阿里云智能视频云专场划重点啦!
  15. 二、PCB-layout 中泪滴设置及其作用
  16. line-height绝对值和相对值的区别
  17. 数模查资料会用到的网站
  18. facebook 邀请好友
  19. VC6数据库综合开发资料
  20. Alpha事后诸葛(团队)

热门文章

  1. 调研了32家银行,总结出了银行BI大数据平台建设的一套模式
  2. 浅析数据库设计三范式
  3. 谈谈我这几年的C++学习之路
  4. 飞鸽传书:webbrowser 本生是一个控件
  5. 即时通讯的企业应用和个人应用的区别
  6. 随便说说程序员团队精神的荣辱与共
  7. C++高质量编程点滴
  8. 一种巧妙的删除程序自己的方法
  9. 推荐程序员的求爱技巧
  10. 第五节:简单又强大的数据类型:any任意值