利用FrameLayout连接一组view实现流畅的左右滑动

简介:
     前段时间在网上找到一个左右滑动的例子,广泛使用在uc,墨迹天气等知名软件中,网上实现了一个布局的类(具体代码详见附件),继承FrameLayout ,声明 如下:

        public class FlingGallery extends FrameLayout;

 
该类声明的变量如下:
 
 
  1. private int mGalleryWidth = 0;  
  2. private boolean mIsTouched = false;  
  3. private boolean mIsDragging = false;  
  4. private float mCurrentOffset = 0.0f;  
  5. private long mScrollTimestamp = 0;  
  6. private int mFlingDirection = 0;  
  7. private int mCurrentPosition = 0;  
  8. private int mCurrentViewNumber = 0;  
  9.  
  10. private Context mContext;  
  11. private Adapter mAdapter;  
  12. private FlingGalleryView[] mViews;  
  13. private FlingGalleryAnimation mAnimation;  
  14. private GestureDetector mGestureDetector;  
  15. private Interpolator mDecelerateInterpolater;  
 
其中主要变量有  mCurrentPosition:当前索引。
                             mCurrentViewNumber:当前view的索引。
                             mViews 用来存放一组滑动的view。
                             mAnimation 动画动作。
 
        类中还封装了类似跳转到下一个view和上一个view的常用切换方法,以及一些常用的布局方法。
 
activity 中可以这样使用:
 
 
 
 
  1. @Override 
  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         mGallery = new FlingGallery(this);  
  5.         //mGallery.setPaddingWidth(5);  
  6.         mGallery.setAdapter(mBabyListAdapter);  
  7.         mGallery.setIsGalleryCircular(true);  
  8.  
  9.         LinearLayout layout = new LinearLayout(getApplicationContext());  
  10.         layout = (LinearLayout) PublicFunctionAndUnit.getMainView(  
  11.                 GalleryTest.this, layout, mGallery);  
  12.         layout.setBackgroundResource(R.drawable.main_bg);  
  13.  
  14.         setContentView(layout);  
  15.  
  16.     }  
adapter 中把要显示的 views 放入其中 , 代码如下:

 

 
 
  1. BaseAdapter mBabyListAdapter = new BaseAdapter() {  
  2.  
  3. @Override 
  4. public int getCount() {  
  5. return 7;  
  6. }  
  7.  
  8. @Override 
  9. public Object getItem(int position) {  
  10. return null;  
  11. }  
  12.  
  13. @Override 
  14. public long getItemId(int position) {  
  15. return 0;  
  16. }  
  17.  
  18. @Override 
  19. public View getView(int position, View convertView, ViewGroup parent) {  
  20. // GalleryViewItem item = new GalleryViewItem(GalleryTest.this,  
  21. // position);  
  22. LinearLayout item = getLinearLayout(GalleryTest.this, position);  
  23. return item;  
  24. }  
  25. };  
  26. private int[] itemViewIds = new int[] { R.layout.item1, R.layout.item2,  
  27. R.layout.item3, R.layout.item4, R.layout.item5, R.layout.item6,  
  28. R.layout.item7 };  
  29.  
  30. private LinearLayout getLinearLayout(Context context, int position) {  
  31. LinearLayout layout = new LinearLayout(context);  
  32. LayoutInflater factory = LayoutInflater.from(context);  
  33. View item = factory.inflate(itemViewIds[position], null);  
  34. layout.addView(item, new LinearLayout.LayoutParams(  
  35. LinearLayout.LayoutParams.FILL_PARENT,  
  36. LinearLayout.LayoutParams.FILL_PARENT));  
  37. return layout;  
  38. }  

        在使用过程中,发现该类,只有跳转到上一个和下一个view 的方法,不能指定跳转到某个view,仔细观察代码后,这个方法可以使用它所给的nextd等实现,代码如下:
 
  
  1. public void moveToViewbyId(int id)  
  2.         {  
  3.                   int num=id-mCurrentPosition;  
  4.                   if(num!=0)  
  5.                   {  
  6.                            if(num>0)  
  7.                            {  
  8.                                     for(int i=0;i<num;i++)  
  9.                                     {  
  10.                                               moveNext();  
  11.                                     }  
  12.                            }  
  13.                            else 
  14.                            {  
  15.                                     for(int i=0;i<(0-num);i++)  
  16.                                     {  
  17.                                               movePrevious();  
  18.                                     }  
  19.                            }  
  20.                   }  
  21.                     
  22.         }  
        这里这样写这个方法实际上是取巧自上一步与下一步方法,把当前id与要跳转的id相减,得出要跳转次数,进行跳转,如果深入修改该类中的moveNext方法或者movePrevious方法同样可以完成该操作,不过没有这个方法简洁明了。

 


本文转自HDDevTeam 51CTO博客,原文链接:http://blog.51cto.com/hddev/623009,如需转载请自行联系原作者

相关文章
|
Android开发 开发者 存储
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二)
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二) 如今Android这种可收缩伸展的Expandable RecyclerView是如此常用,在附录1的基础上,我重新把模型进行了抽象和封装,设计了一套新的架构和简洁的使用方式支持这种功能。
3780 0
|
XML Android开发 数据格式
一个Adapter+recycleview实现多种布局,区分布局中
最近因为需要所以学习了一下recycleview,使用Adapter修饰器修饰,使用一个Adapter+recycleview实现多种布局,而不是之前的三个Adapter在同一个recycleview中实现三个布局。点击区分布局中的gridview的图片和姓名。
53 0
|
Android开发
Android 屏幕发生旋转对应的生命周期发生变化解析
Android 屏幕发生旋转对应的生命周期发生变化解析
175 0
|
XML Android开发 数据格式
Android控件显示、隐藏时,增加动画效果
Android控件显示、隐藏时,增加动画效果
497 0
Android控件显示、隐藏时,增加动画效果
|
Linux Android开发 开发者
Android窗口管理分析(1):View如何绘制到屏幕上的主观理解
Android窗口管理分析(1):View如何绘制到屏幕上的主观理解
266 0
Android窗口管理分析(1):View如何绘制到屏幕上的主观理解
|
XML Android开发 数据格式
Android中使控件保持固定宽高比的几种方式
我们在android开发过程中可能会遇到一种情况,一个组件需要保持固定的宽高比,但是组件本身大小却不定。比如我们需要让一个组件宽度与屏幕宽度一致,这样就无法确定宽度。那么如何让控件保持固定宽高比?有几种方法供大家选择。
922 0
|
算法 Android开发
Android嵌套滑动机制分析
Android嵌套滑动机制分析
Android嵌套滑动机制分析
|
Android开发 数据格式 XML
Android dispatchTouchEvent检测多点触摸事件是否落入在某一个View区域内
Android dispatchTouchEvent检测多点触摸事件是否落入在某一个View区域内 检测发生在Android设备屏幕上到的点击事件是否发生在某一个View的区域内,重点方法是touchEventInView,该方法进行具体的检测,如果返回true,则表明该事件是发生在当前的参数view范围内,返回false则不是。
2441 0