示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现.

实现方法:我们自定义一个ViewGroup实现左右滑动,第一屏隐藏,第二屏显示.

代码如下:

  1. package com.jj.sliding_6;
  2. import android.content.Context;
  3. import android.util.AttributeSet;
  4. import android.util.Log;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. import android.view.ViewTreeObserver;
  8. import android.view.View.MeasureSpec;
  9. import android.view.ViewTreeObserver.OnGlobalLayoutListener;
  10. import android.widget.AbsoluteLayout;
  11. import android.widget.LinearLayout;
  12. import android.widget.ListView;
  13. import android.widget.RelativeLayout;
  14. import android.widget.Scroller;
  15. /***
  16. * 自定义view
  17. *
  18. * @author zhangjia
  19. *
  20. */
  21. public class MyViewGroup extends ViewGroup {
  22. private Scroller scroller;// 滑动
  23. private int distance;// 滑动距离
  24. private View menu_view, content_view;
  25. private int duration = 500;
  26. private ViewTreeObserver viewTreeObserver;
  27. private Context context;
  28. private CloseAnimation closeAnimation;
  29. public static boolean isMenuOpned = false;// 菜单是否打开
  30. public MyViewGroup(Context context) {
  31. super(context, null);
  32. }
  33. public void setCloseAnimation(CloseAnimation closeAnimation) {
  34. this.closeAnimation = closeAnimation;
  35. }
  36. public MyViewGroup(Context context, AttributeSet attrs) {
  37. super(context, attrs);
  38. this.context = context;
  39. scroller = new Scroller(context);
  40. }
  41. public void setDistance(int distance) {
  42. this.distance = distance;
  43. }
  44. @Override
  45. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  46. if (changed) {
  47. menu_view = getChildAt(0);// 获取滑动菜单的view
  48. content_view = getChildAt(1);// 获得主页view
  49. // 相当于fill_parent
  50. content_view.measure(0, 0);
  51. content_view.layout(0, 0, getWidth(), getHeight());
  52. }
  53. }
  54. @Override
  55. public void computeScroll() {
  56. Log.e("jj", "isMenuOpned=" + isMenuOpned);
  57. if (scroller.computeScrollOffset()) {
  58. scrollTo(scroller.getCurrX(), scroller.getCurrY());
  59. postInvalidate();// 刷新
  60. if (closeAnimation != null)
  61. closeAnimation.closeMenuAnimation();
  62. }else{
  63. MainActivity.isScrolling=false;
  64. }
  65. }
  66. void showMenu() {
  67. Log.e("jj", "shoeMenu");
  68. isMenuOpned = true;
  69. scroller.startScroll(getScrollX(), 0, -distance, 0, duration);
  70. invalidate();// 刷新
  71. }
  72. // 关闭菜单(执行自定义动画)
  73. void closeMenu() {
  74. Log.e("jj", "closeMenu");
  75. isMenuOpned = false;
  76. scroller.startScroll(getScrollX(), 0, distance, 0, duration);
  77. invalidate();// 刷新
  78. }
  79. // 关闭菜单(执行自定义动画)
  80. void closeMenu_1() {
  81. isMenuOpned = false;
  82. scroller.startScroll(getScrollX(), 0, distance - getWidth(), 0,
  83. duration);
  84. invalidate();// 刷新
  85. }
  86. // 关闭菜单(执行自定义动画)
  87. void closeMenu_2() {
  88. isMenuOpned = false;
  89. scroller.startScroll(getScrollX(), 0, getWidth(), 0, duration);
  90. invalidate();// 刷新
  91. }
  92. /***
  93. * Menu startScroll(startX, startY, dx, dy)
  94. *
  95. * dx=e1的减去e2的x,所以右移为负,左移动为正 dx为移动的距离,如果为正,则标识向左移动|dx|,如果为负,则标识向右移动|dx|
  96. */
  97. void slidingMenu() {
  98. Log.e("jj", "slidingMenu");
  99. // 没有超过半屏
  100. if (getScrollX() > -getWidth() / 2) {
  101. scroller.startScroll(getScrollX(), 0, -getScrollX(), 0, duration);
  102. isMenuOpned = false;
  103. }
  104. // 超过半屏
  105. else if (getScrollX() <= -getWidth() / 2) {
  106. scroller.startScroll(getScrollX(), 0, -(distance + getScrollX()),
  107. 0, duration);
  108. isMenuOpned = true;
  109. }
  110. invalidate();// 刷新
  111. Log.v("jj", "getScrollX()=" + getScrollX());
  112. }
  113. }
  114. abstract class CloseAnimation {
  115. // 点击list item 关闭menu动画
  116. public void closeMenuAnimation() {
  117. };
  118. }

上诉大部分我都加以注释,想必不用我解释太多,大家仔细看都应该可以看懂.

之后我们只需要在MainActivity中把要显示的view添加进去就可以了。

运行效果:

      

我把源码上传网上,大家可以下载运行,如有不足请留言.

说明一点:listview上下左右滑动冲突没有解决,不过我运行看过很多应用,要么listview不能左右滑动,要么能左右滑动但是listview不到一屏.

源码下载

下面我介绍另外一种方法,这种方法比较简单,但是有点不实用.不过对SlidingMenu滑动菜单要求不高的应用完全可以了,如:云中书城等,没有用到手势时时滑动.

实现方法:我们在点击或者滑动的时候获取当前view的切图bitmap,然后将这个bitmap传递到打开后的activity,在这个activity中布局具体如下:

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:id="@+id/layout"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent" >
  6. <FrameLayout
  7. android:id="@+id/slideout_placeholder"
  8. android:layout_width="fill_parent"
  9. android:layout_height="fill_parent"
  10. android:background="#777777" >
  11. <ListView
  12. android:id="@+id/list"
  13. android:layout_width="fill_parent"
  14. android:layout_height="fill_parent"
  15. android:cacheColorHint="#00000000" />
  16. </FrameLayout>
  17. <ImageView
  18. android:id="@+id/slidedout_cover"
  19. android:layout_width="fill_parent"
  20. android:layout_height="fill_parent"
  21. android:scaleType="fitXY" />
  22. </AbsoluteLayout>

这种布局目的就是让用户觉得我们操作的是一个view.

具体实现:我将代码上传网上,大家自行下载运行,有不足之处,自行调整.

效果图;

android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu的更多相关文章

  1. android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]

    http://blog.csdn.net/jj120522/article/details/8095852 示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这 ...

  2. android自定义viewgroup之我也玩瀑布流

    先看效果图吧, 继上一篇<android自定义viewgroup实现等分格子布局>中实现的布局效果,这里稍微有些区别,每个格子的高度不规则,就是传说的瀑布流布局,一般实现这种效果,要么用第 ...

  3. Android自定义ViewGroup

    视图分类就两类,View和ViewGroup.ViewGroup是View的子类,ViewGroup可以包含所有的View(包括ViewGroup),View只能自我描绘,不能包含其他View. 然而 ...

  4. Android自定义ViewGroup,实现自动换行

    学习<Android开发艺术探索>中自定义ViewGroup章节 自定义ViewGroup总结的知识点 一.自定义ViewGroup中,onMeasure理解 onMeasure(int ...

  5. Android -- 自定义ViewGroup+贝塞尔+属性动画实现仿QQ点赞效果

    1,昨天我们写了篇简单的贝塞尔曲线的应用,今天和大家一起写一个QQ名片上常用的给别人点赞的效果,实现效果图如下: 红心的图片比较丑,见谅见谅(哈哈哈哈哈哈).... 2,实现的思路和原理 从上面的效果 ...

  6. Android自定义ViewGroup(四、打造自己的布局容器)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51500304 本文出自:[openXu的博客] 目录: 简单实现水平排列效果 自定义Layo ...

  7. android自定义viewgroup初步之一----抽屉菜单

    转载请注明出处 http://blog.csdn.net/wingichoy/article/details/47832151 几天前在慕课网上看到鸿洋老师的 自定义卫星菜单,感觉很有意思,于是看完视 ...

  8. Android 自定义ViewGroup手把手教你实现ArcMenu

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...

  9. Android -- 自定义ViewGroup实现FlowLayout效果

    1,在开发的时候,常在我们的需求中会有这种效果,添加一个商品的一些热门标签,效果图如下: 2,从上面效果可以看得出来,这是一个自定义的ViewGroup,然后实现换行效果,让我们一起来实现一下 自定义 ...

随机推荐

  1. WebGoat学习——跨站请求伪造(Cross Site Request Forgery (CSRF))

    跨站请求伪造(Cross Site Request Forgery (CSRF)) 跨站请求伪造(Cross Site Request Forgery (CSRF))也被称为:one click at ...

  2. 认识Agile,Scrum和DevOps

    If everything's under control you are going too slow. 当今的开发,要求faster and faster.所以我们要Agile,become Ag ...

  3. while (cin>>str)退出死循环

    今天在练习的时候突然发现了这个问题,百度之感觉还挺常见的,故记之! //题目描述 // //写出一个程序,接受一个十六进制的数值字符串,输出该数值的十进制字符串. // //输入描述 : //输入一个 ...

  4. debug 64bit dump of a 32bit process in windows 7 64bit

    In Windows 7 the TaskMgr provides one easy way to create dump for the applications. You can right cl ...

  5. dom 绘制正方形

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. 如何通过Android Studio发布library到jCenter和Maven Central

    http://www.jianshu.com/p/3c63ae866e52# 在Android Studio里,如果你想引入任何library到自己的项目中,只需要很简单的在module的build. ...

  7. 让一个div可以编辑加上contenteditable=true 复制来的内容带有样式,需要清除复制的样式

    sEv传keyup进去 function(id,sEv){ id.on(sEv,function(){ var str = $(this).html(); //获取复制进来的内容 var re=/&l ...

  8. 转】MyEclipse使用总结——修改MyEclipse默认的Servlet和jsp代码模板

    原博文出自于: http://www.cnblogs.com/xdp-gacl/p/3769058.html 感谢! 一.修改Servlet的默认模板代码 使用MyEclipse创建Servlet时, ...

  9. POJ1384Piggy-Bank(DP)

    POJ1384http://poj.org/problem?id=1384 最简单的完全背包问题,注意下初始化为INF就可以. #include <map> #include <se ...

  10. ADT下开发环境的配置--个人配置啦 Eclipse Color Themes

    一. Eclipse Color Themes的安装 首先 这个ADT没有Marketplace Client 需要装一个, 节选自: http://blog.csdn.net/liu37226700 ...