android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]
http://blog.csdn.net/jj120522/article/details/8095852
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现.
实现方法:我们自定义一个ViewGroup实现左右滑动,第一屏隐藏,第二屏显示.
代码如下:
- package com.jj.sliding_6;
- import android.content.Context;
- import android.util.AttributeSet;
- import android.util.Log;
- import android.view.View;
- import android.view.ViewGroup;
- import android.view.ViewTreeObserver;
- import android.view.View.MeasureSpec;
- import android.view.ViewTreeObserver.OnGlobalLayoutListener;
- import android.widget.AbsoluteLayout;
- import android.widget.LinearLayout;
- import android.widget.ListView;
- import android.widget.RelativeLayout;
- import android.widget.Scroller;
- /***
- * 自定义view
- *
- * @author zhangjia
- *
- */
- public class MyViewGroup extends ViewGroup {
- private Scroller scroller;// 滑动
- private int distance;// 滑动距离
- private View menu_view, content_view;
- private int duration = 500;
- private ViewTreeObserver viewTreeObserver;
- private Context context;
- private CloseAnimation closeAnimation;
- public static boolean isMenuOpned = false;// 菜单是否打开
- public MyViewGroup(Context context) {
- super(context, null);
- }
- public void setCloseAnimation(CloseAnimation closeAnimation) {
- this.closeAnimation = closeAnimation;
- }
- public MyViewGroup(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- scroller = new Scroller(context);
- }
- public void setDistance(int distance) {
- this.distance = distance;
- }
- @Override
- protected void onLayout(boolean changed, int l, int t, int r, int b) {
- if (changed) {
- menu_view = getChildAt(0);// 获取滑动菜单的view
- content_view = getChildAt(1);// 获得主页view
- // 相当于fill_parent
- content_view.measure(0, 0);
- content_view.layout(0, 0, getWidth(), getHeight());
- }
- }
- @Override
- public void computeScroll() {
- Log.e("jj", "isMenuOpned=" + isMenuOpned);
- if (scroller.computeScrollOffset()) {
- scrollTo(scroller.getCurrX(), scroller.getCurrY());
- postInvalidate();// 刷新
- if (closeAnimation != null)
- closeAnimation.closeMenuAnimation();
- }else{
- MainActivity.isScrolling=false;
- }
- }
- void showMenu() {
- Log.e("jj", "shoeMenu");
- isMenuOpned = true;
- scroller.startScroll(getScrollX(), 0, -distance, 0, duration);
- invalidate();// 刷新
- }
- // 关闭菜单(执行自定义动画)
- void closeMenu() {
- Log.e("jj", "closeMenu");
- isMenuOpned = false;
- scroller.startScroll(getScrollX(), 0, distance, 0, duration);
- invalidate();// 刷新
- }
- // 关闭菜单(执行自定义动画)
- void closeMenu_1() {
- isMenuOpned = false;
- scroller.startScroll(getScrollX(), 0, distance - getWidth(), 0,
- duration);
- invalidate();// 刷新
- }
- // 关闭菜单(执行自定义动画)
- void closeMenu_2() {
- isMenuOpned = false;
- scroller.startScroll(getScrollX(), 0, getWidth(), 0, duration);
- invalidate();// 刷新
- }
- /***
- * Menu startScroll(startX, startY, dx, dy)
- *
- * dx=e1的减去e2的x,所以右移为负,左移动为正 dx为移动的距离,如果为正,则标识向左移动|dx|,如果为负,则标识向右移动|dx|
- */
- void slidingMenu() {
- Log.e("jj", "slidingMenu");
- // 没有超过半屏
- if (getScrollX() > -getWidth() / 2) {
- scroller.startScroll(getScrollX(), 0, -getScrollX(), 0, duration);
- isMenuOpned = false;
- }
- // 超过半屏
- else if (getScrollX() <= -getWidth() / 2) {
- scroller.startScroll(getScrollX(), 0, -(distance + getScrollX()),
- 0, duration);
- isMenuOpned = true;
- }
- invalidate();// 刷新
- Log.v("jj", "getScrollX()=" + getScrollX());
- }
- }
- abstract class CloseAnimation {
- // 点击list item 关闭menu动画
- public void closeMenuAnimation() {
- };
- }
上诉大部分我都加以注释,想必不用我解释太多,大家仔细看都应该可以看懂.
之后我们只需要在MainActivity中把要显示的view添加进去就可以了。
运行效果:
我把源码上传网上,大家可以下载运行,如有不足请留言.
说明一点:listview上下左右滑动冲突没有解决,不过我运行看过很多应用,要么listview不能左右滑动,要么能左右滑动但是listview不到一屏.
下面我介绍另外一种方法,这种方法比较简单,但是有点不实用.不过对SlidingMenu滑动菜单要求不高的应用完全可以了,如:云中书城等,没有用到手势时时滑动.
实现方法:我们在点击或者滑动的时候获取当前view的切图bitmap,然后将这个bitmap传递到打开后的activity,在这个activity中布局具体如下:
- <?xml version="1.0" encoding="utf-8"?>
- <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:id="@+id/layout"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent" >
- <FrameLayout
- android:id="@+id/slideout_placeholder"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:background="#777777" >
- <ListView
- android:id="@+id/list"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:cacheColorHint="#00000000" />
- </FrameLayout>
- <ImageView
- android:id="@+id/slidedout_cover"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:scaleType="fitXY" />
- </AbsoluteLayout>
这种布局目的就是让用户觉得我们操作的是一个view.
具体实现:我将代码上传网上,大家自行下载运行,有不足之处,自行调整.
效果图;
这篇讲解比较少,不过大部分都加以注释,相信大家都看得明白.
我看了有的朋友是对HorizontalScrollView进行的自定义,实现方法比较多,因人而异,总之只要实现效果就行.
写到这里,不足的地方请之处,thanks for you .
android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu[转]的更多相关文章
- android 自定义ViewGroup和对view进行切图动画实现滑动菜单SlidingMenu
示意图就不展示了,和上一节的一样,滑动菜单SlidingMenu效果如何大家都比较熟悉,在这里我简单说明一下用自定义ViewGroup来实现. 实现方法:我们自定义一个ViewGroup实现左右滑动, ...
- android自定义viewgroup之我也玩瀑布流
先看效果图吧, 继上一篇<android自定义viewgroup实现等分格子布局>中实现的布局效果,这里稍微有些区别,每个格子的高度不规则,就是传说的瀑布流布局,一般实现这种效果,要么用第 ...
- Android自定义ViewGroup
视图分类就两类,View和ViewGroup.ViewGroup是View的子类,ViewGroup可以包含所有的View(包括ViewGroup),View只能自我描绘,不能包含其他View. 然而 ...
- Android自定义ViewGroup,实现自动换行
学习<Android开发艺术探索>中自定义ViewGroup章节 自定义ViewGroup总结的知识点 一.自定义ViewGroup中,onMeasure理解 onMeasure(int ...
- Android -- 自定义ViewGroup+贝塞尔+属性动画实现仿QQ点赞效果
1,昨天我们写了篇简单的贝塞尔曲线的应用,今天和大家一起写一个QQ名片上常用的给别人点赞的效果,实现效果图如下: 红心的图片比较丑,见谅见谅(哈哈哈哈哈哈).... 2,实现的思路和原理 从上面的效果 ...
- Android自定义ViewGroup(四、打造自己的布局容器)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51500304 本文出自:[openXu的博客] 目录: 简单实现水平排列效果 自定义Layo ...
- android自定义viewgroup初步之一----抽屉菜单
转载请注明出处 http://blog.csdn.net/wingichoy/article/details/47832151 几天前在慕课网上看到鸿洋老师的 自定义卫星菜单,感觉很有意思,于是看完视 ...
- Android 自定义ViewGroup手把手教你实现ArcMenu
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37567907 逛eoe发现这样的UI效果,感觉很不错,后来知道github上有这 ...
- Android -- 自定义ViewGroup实现FlowLayout效果
1,在开发的时候,常在我们的需求中会有这种效果,添加一个商品的一些热门标签,效果图如下: 2,从上面效果可以看得出来,这是一个自定义的ViewGroup,然后实现换行效果,让我们一起来实现一下 自定义 ...
随机推荐
- jquery 事件委托三种事件绑定方式.bind(),.live(),.delegate()
http://www.ituring.com.cn/article/467# http://www.cnblogs.com/lvdabao/archive/2013/08/30/3290603.htm ...
- linux下so动态库一些不为人知的秘密(上)
linux 下有动态库和静态库,动态库以.so为扩展名,静态库以.a为扩展名.二者都使用广泛.本文主要讲动态库方面知识. 基本上每一个linux 程序都至少会有一个动态库,查看某个程序使 ...
- 2.x ESL第二章习题2.5
题目 描述 $y_i=x_i^T\beta+\epsilon_i$$\epsilon_i\sim N(0,\sigma^2)$ 已有训练集$\tau$,其中$X:n\times p,y:n\times ...
- Red5 1.0 RC1 与tomcat 6 整合
1.0以上版本没整合成功过,如有人整合成功过,也分享下,在此先谢谢 一.下载red5-1.0.0-RC1.zip 下载地址:http://code.google.com/p/red5/ 和http:/ ...
- linux修改系统时间date命令加clock -w
http://m.jb51.net/LINUXjishu/117784.html 修改linux系统时间的方法(date命令) 11-18 23:22:27作者:脚本之家 命令格式为: date -s ...
- Hadoop 7、MapReduce执行环境配置
MR执行环境有两种:本地测试环境,服务器环境 本地测试环境(windows,用于测试) 1.下载Winddows版的Hadoop程序,解压后在Hadoop目录的bin目录放置一个winutils.ex ...
- SecureCRT中文显示乱码的解决方法
注:本文出自:http://riching.iteye.com/blog/349754 最近开始用SecureCRT登陆linux系统,由于是新手,很多问题不清楚,碰到显示中文乱码的问题,困扰了好几天 ...
- [jQuery]无法获取隐藏元素(display:none)宽度(width)和高度(height)的新解决方案
在做茶城网改版工作的时候,又遇到一个新问题,我需要用jQuery写一个通过点击左右图标来翻阅图片的小插件,写好后测试可以正常运行,但是放到Tab中后发现只有第一个Tab中的代码能够正常运行,其它全部罢 ...
- FormData实现文件上传实例
单提交,文件上传是一个常用又十分麻烦的功能,以前要上传文件通常都是借助插件或者flash来实现,噼里啪啦的加载一大堆东西.自从有了HTML5的FormData后,老板再也不用担心我的上传了. Form ...
- Why AIXTHREAD_SCOPE Should Be Set To 'S' On AIX
In a multi-processor environment running on an AIX platform, if you are intending to use multi-threa ...