android 自定义ViewGroup和对…

来源:互联网 发布:什么是矩阵的秩 编辑:程序博客网 时间:2024/04/27 15:28

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

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

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

    代码如下:

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

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

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

运行效果:

       

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

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


源码下载


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

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

[java] viewplaincopy
  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.   
  7.     <FrameLayout  
  8.         android:id="@+id/slideout_placeholder"  
  9.         android:layout_width="fill_parent"  
  10.         android:layout_height="fill_parent"  
  11.         android:background="#777777"  
  12.   
  13.         <ListView  
  14.             android:id="@+id/list"  
  15.             android:layout_width="fill_parent"  
  16.             android:layout_height="fill_parent"  
  17.             android:cacheColorHint="#00000000" />  
  18.     </FrameLayout>  
  19.   
  20.     <ImageView  
  21.         android:id="@+id/slidedout_cover"  
  22.         android:layout_width="fill_parent"  
  23.         android:layout_height="fill_parent"  
  24.         android:scaleType="fitXY" />  
  25.   
  26. </AbsoluteLayout>  
这种布局目的就是让用户觉得我们操作的是一个view.

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

效果图;



源码下载


这篇讲解比较少,不过大部分都加以注释,相信大家都看得明白.


我看了有的朋友是对HorizontalScrollView进行的自定义,实现方法比较多,因人而异,总之只要实现效果就行.


写到这里,不足的地方请之处,thanks for you.

0 0