利用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,如需转载请自行联系原作者

相关文章
N..
|
前端开发 开发者
HTML表格
HTML表格
N..
200 1
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
|
关系型数据库 MySQL 数据库
InnoDB 的 MVCC 实现原理
InnoDB 的 MVCC 实现原理
211 0
|
Linux 网络安全
NFS 服务器安装
NFS(Network File System)网络文件系统,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。当我们在 NFS 服务器设置好一个共享目录后,其他的有权访问 NFS 客户端就可以将这个共享目录挂载到文件系统自定义的挂载点,挂载好后客户端在本地能够看到服务端共享目录中的所有数据
434 1
|
前端开发 JavaScript
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
Elementplus如何使面包屑往左边移动,右边头像下拉菜单如何写,下拉菜单如何靠中一点,下拉菜单出现文字不对齐怎么办,如何设置鼠标样式,如何使用阿里妈妈icon,如何点击icon全屏
springboot全局异常处理BasicErrorController和RestControllerAdvice
springboot全局异常处理BasicErrorController和RestControllerAdvice
|
存储 JavaScript 前端开发
JavaScript内存管理与优化:避免内存泄漏的垃圾收集机制
JavaScript作为一种动态语言,在执行过程中使用内存来存储数据和变量。然而,疏忽或错误可能导致内存泄漏,进而造成物理内存溢出。为了解决这个问题,JavaScript具备了垃圾收集机制,通过管理和释放不再使用的内存来避免内存泄漏。本文将深入探讨JavaScript内存管理与优化的重要性,垃圾收集机制的工作原理,以及优化内存分配的实践方法。
715 2
JavaScript内存管理与优化:避免内存泄漏的垃圾收集机制
|
存储 Go UED
如何使用 Go 语言生成二维码?
如何使用 Go 语言生成二维码?
485 1
|
弹性计算 PHP 应用服务中间件
【ECS生长万物之开源】搭建ThinkPHP框架
ThinkPHP是一款免费、开源、快速、简单、面向对象的轻量级PHP开发框架,遵循Apache2开源协议发布,是为了敏捷Web应用开发和简化企业应用开发而诞生的。本篇教程介绍如何使用云市场镜像快速搭建ThinkPHP框架。
【ECS生长万物之开源】搭建ThinkPHP框架
|
存储 缓存 Java
【Java I/O 流】文件字符输入输出流:FileReader 和 FileWriter
本篇文章主要讲述“文件字符输入流”和“文件字符输出流”两个类的使用,并列举了一些读写案例,帮助学习。
768 0