Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法
本文实例讲述了Android编程使用LinearLayout和PullRefreshView实现上下翻页功能的方法。分享给大家供大家参考,具体如下:
前看过网易云阅读客户端,里面的文章可以实现上下拉动实现上下翻页的效果,感觉体验效果很不错。
公司新版本项目的开发中也要求实现类似的效果,不过还好项目需求里面可以提前知道需要实现上下拉动翻页的总的页数。如果像网易那种不提前知道总的页数感觉控制好LinearLayout里面的childView应该也可以达到效果。
好记性不如烂笔头,先写下我提前知道总页数实现上下拉翻页的问题吧!
首先布局仅仅是一个简单的LinearLayout包裹着
<LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" android:id="@+id/fenleiPullContentLayout" android:orientation="vertical"> </LinearLayout>
然后通过一个for循环把PullRefreshView包裹进来
pullContentLayout.removeAllViews(); pullViews.clear(); for(int i=0;i<leftEntityData.size();i++){ PullToRefreshProView pullview = (PullToRefreshProView) inflater.inflate(R.layout.fenleipro_item, null); LayoutParams param = new LayoutParams(LayoutParams.MATCH_PARENT, scrollHeight); pullview.setLayoutParams(param); LinearLayout pullayout = (LinearLayout) pullview.findViewById(R.id.fenleirightlayout); RightAdapter adapter = new RightAdapter(rightEntityList.get(i)); pullayout.removeAllViews(); for(int k=0;k<adapter.getCount();k++){ View view = adapter.getView(k, null, null); pullayout.addView(view,k); } pullViews.add(pullview); pullContentLayout.addView(pullview, i); if(i==0){ pullview.setHeaderRefresh(false); pullview.setOnFooterRefreshListener(new MyOnRefreshListener(i)); }else if(i==leftEntityData.size()-1){ pullview.setFooterRefresh(false); pullview.setOnHeaderRefreshListener(new MyOnRefreshListener(i)); }else{ pullview.setOnHeaderRefreshListener(new MyOnRefreshListener(i)); pullview.setOnFooterRefreshListener(new MyOnRefreshListener(i)); } }
代码说明下:这里的PullToRefreshProView就是一个开源的下拉刷新控件,继承的是一个LinearLayout实现的。网上有源码;然后RightAdapter是一个BaseAdapter,通过这个adapter的getview得到每个view,然后把view添加到inflater出的PullToRefreshProView的子Linearlayoyut里面。然后给每个PullToRefreshProView设置上啦下拉的回调接口,第一个没有上啦,最后个没下拉。这里的MyOnRefreshListener是自己定义的下拉接口
private class MyOnRefreshListener implements OnHeaderRefreshListener,OnFooterRefreshListener{ @Override public void onFooterRefresh(PullToRefreshProView view) { } @Override public void onHeaderRefresh(PullToRefreshProView view) { } }
然后再onFooter和onHeader里面写下拉上拉逻辑。
这里关键是在动画效果交互的实现。
上代码,上拉的动画
public class PullToRefreshUpAnimation extends Animation{ private View view1,view2; private int delt; private int topMarginView1 = 0; public PullToRefreshUpAnimation(Context context,View v1,View v2,int from,int to){ super(); view1 = v1; view2 = v2; delt = to - from; topMarginView1 = view1.getMeasuredHeight(); setDuration(450); setFillAfter(true); setInterpolator(new DecelerateInterpolator()); } public PullToRefreshUpAnimation(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub setDuration(450); setFillAfter(true); setInterpolator(new DecelerateInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view2.getLayoutParams(); param.topMargin = (int) (interpolatedTime*delt); param.height = Math.abs(delt); android.widget.LinearLayout.LayoutParams param1 = (android.widget.LinearLayout.LayoutParams) view1.getLayoutParams(); param1.topMargin = (int) (topMarginView1*(interpolatedTime-1)); param1.height = topMarginView1; view1.setLayoutParams(param1); view2.setLayoutParams(param); } @Override public boolean willChangeBounds() { // TODO Auto-generated method stub return true; } }
下拉动画
public class PullToRefreshAnimation extends Animation{ private View view; private int delt; public PullToRefreshAnimation(Context context,View v,int from,int to){ super(); view = v; delt = to - from; setDuration(450); setFillAfter(true); setInterpolator(new DecelerateInterpolator()); } public PullToRefreshAnimation(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub setDuration(450); setFillAfter(true); setInterpolator(new DecelerateInterpolator()); } @Override protected void applyTransformation(float interpolatedTime, Transformation t) { android.widget.LinearLayout.LayoutParams param = (android.widget.LinearLayout.LayoutParams)view.getLayoutParams(); param.topMargin = (int) (interpolatedTime*delt); param.height = Math.abs(delt); param.width = android.widget.LinearLayout.LayoutParams.MATCH_PARENT; view.setLayoutParams(param); } @Override public boolean willChangeBounds() { // TODO Auto-generated method stub return true; } }
这两个动画的后果是导致最后最外层的LinearLayout包裹的每个子LinearLayout改变了自己的height和topMargin,
所以需要给这个动画设置animationListener,然后每次需要上啦下拉动画前把LinearLayout的height和topMargin重新设置过来,具体怎么实现看具体情况。
PS:这里的核心实现方式其实就是控制好Linearlayout子LinearLayout的height和topMargin
更多关于Android相关内容感兴趣的读者可查看本站专题:《Android布局layout技巧总结》、《Android开发动画技巧汇总》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android资源操作技巧汇总》及《Android控件用法总结》
希望本文所述对大家Android程序设计有所帮助。
相关文章
android 仿微信demo——微信通讯录界面功能实现(移动端,服务端)
本系列文章主要介绍了微信小程序-阅读小程序实例(demo),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧,希望能给你们提供帮助2021-06-06Android编程使用自定义shape实现shadow阴影效果的方法
这篇文章主要介绍了Android编程使用自定义shape实现shadow阴影效果的方法,涉及Android中xml文件布局的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下2015-11-11Android编程之ActionBar Tabs用法实例分析
这篇文章主要介绍了Android编程之ActionBar Tabs用法,结合实例形式分析了ActionBar Tabs的功能及Tab切换不同的Fragment的相关实现技巧,需要的朋友可以参考下2017-03-03Android SDK 百度地图通过poi城市内检索简介接口的使用
这篇文章主要介绍了Android SDK 百度地图通过poi城市内检索简介接口的使用的相关资料,需要的朋友可以参考下2016-02-02
最新评论