仿网易新闻最新版的下拉刷新

今天一天做了一个仿照网易的下拉刷新,先上效果图:

代码还有一点问题。我先说怎么用把:

1.   布局文件。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

xmlns:tools="http://schemas.android.com/tools"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingBottom="@dimen/activity_vertical_margin"

tools:context=".MyActivity">

<com.flyme.mylistview.PullTop

android:paddingTop="30dip"

android:id="@+id/top"

android:layout_width="match_parent"

android:layout_height="180dip"

/>

<com.flyme.mylistview.PullToRefreshLayout

android:id="@+id/move"

android:text="@string/hello_world"

android:layout_width="match_parent"

android:layout_height="match_parent" >

<ListView

android:divider="@null"

android:dividerHeight="0dip"

android:background="#ffffff"

android:id="@+id/mlistview"

android:layout_width="match_parent"

android:layout_height="match_parent">

</ListView>

</com.flyme.mylistview.PullToRefreshLayout>

</RelativeLayout>

我写的是PullToRefreshLayout,在这个继承了RelativeLayout的类中,只能添加一个ListView布局。

PullTop则是显示的红标题,这个可以随意的添加。

2.主要类就是PullToRefreshLayout类了,我觉得在主要的难点依然是手势的控制。

直接上代码:

分发手势:

@Override

public boolean dispatchTouchEvent(MotionEvent ev) {

switch (ev.getAction()) {

case MotionEvent.ACTION_DOWN:

startY = stateY = (int) ev.getRawY();

return super.dispatchTouchEvent(ev);

case MotionEvent.ACTION_MOVE:

return dispatchMoveTouch(ev);

case MotionEvent.ACTION_UP:

return dispatchUpTouch(ev);

}

return super.dispatchTouchEvent(ev);

}

private boolean dispatchMoveTouch(MotionEvent ev){

if (getScrollY() < 0 ) {

onTouchEvent(ev);

return true;

}

if (verdictLocation()){

int moveY = (int) ev.getRawY();

int dy = moveY - startY;

if (dy > 16 ){

onTouchEvent(ev);

return true ;

}

}

startY = (int) ev.getRawY();

return super.dispatchTouchEvent(ev);

}

private boolean dispatchUpTouch(MotionEvent ev){

int moveY = (int) ev.getRawY();

if (Math.abs((moveY - stateY)) < 16) {

return super.dispatchTouchEvent(ev);

}

if (getScrollY() < - minDistance) {

startMove(getScrollY(),minDistance);

if (!isRefreshing) {

if (mPullToRefreshListener != null) {

isRefreshing = true ;

mPullToRefreshListener.onRefresh();

}

}

totelDistance = 0 ;

return true;

}else {

if (!isRefreshing) {

startMove(getScrollY() ,0);

return super.dispatchTouchEvent(ev);

}

if (isRefreshing && !verdictLocation()) {

return super.dispatchTouchEvent(ev);

}

totelDistance = 0 ;

return true ;

}

}

处理手势:

@Override

public boolean onTouchEvent(MotionEvent event) {

if (event.getAction() == MotionEvent.ACTION_DOWN) {

return super.onTouchEvent(event);

}

if (event.getAction() == MotionEvent.ACTION_MOVE) {

if (verdictLocation()){

pullListView(event);

return true;

}else {

return super.onTouchEvent(event);

}

}

return super.onTouchEvent(event);

}

private  void pullListView(MotionEvent event){

int moveY = (int) event.getRawY();

int dy = slowPullDy(startY - moveY);

scrollTo(0, dy + getScrollY());

startY = (int) event.getRawY();

if (mPullToDistanceListener != null  && !isRefreshing) {

mPullToDistanceListener.pullDistance(Math.abs(totelDistance));

}

}

这些都是核心的代码。

3.代码中的主要问题,已知的bug:

1)可以从效果图上看出来,在手势按下去的一刻,ListView中的Item是被选中的状态,你下拉的时候是正常的下拉,但是当你的手指松开的时候,Item的选中状态依然是选中的。我分析的原因是,我在MotionEvent.DOWN 的时候,返回的super.dispatchTouchEvent,导致的选中状态。这个是不可避免的。因为我尝试在Move的时候去调用ListVIew的分发方法,但是没效果。如果直接返回true,则ListVIew就不会接受事件了。

有哪位大牛能够解决这个问题,请及时的不吝赐教告知,谢谢。

附上源码下载地址:http://pan.baidu.com/s/1dDENnHZ

我的github上也可以下载。

我的博客: http://www.cnblogs.com/flyme2012/

我的github地址:https://github.com/flyme2012

附件列表

时间: 2024-10-07 03:15:02

仿网易新闻最新版的下拉刷新的相关文章

仿头条新闻app,实现下拉刷新,上拉加载分页

---恢复内容开始--- 环境appcan appcan.ready(function() { page = 1; type = 0; searchDate = getNowTime(); highSearch(type); appcan.frame.setBounce([0,1], function(type) { //$("#pullstatus"+type).html(!type?"开始下拉":"开始上拖"); }, function(ty

iOS界面-仿网易新闻左侧抽屉式交互

1.介绍 用过网易新闻客户端的同学都会发现,网易新闻向左滑动时,左侧的导航栏会跟着拖动出来,新闻内容列表会拉到最右侧.像一个抽屉拉出来一样.很酷.除了网易新闻,现在好多应用都采用了这样的交互. 对手势识别不熟悉的请参考上篇: iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势) 这个交互效果主要用到两个手势,一个是pan拖拽,一个是tap点击.拖拽可以把抽屉拉出来,再推回去.点击可以把抽屉推回去. 效果如下:     那么这个效果如何实现呢? 2.实现思路和步骤 思路:从实现

关于仿网易新闻中详细页图文混排功能的实现

最近在了解关于新闻内容的图文混排的效果,网上有人开源一个仿网易新闻的代码,本文就是简单记录学习其详细页面显示的效果实现: 下载地址:https://github.com/dsxNiubility/SXNews 效果图: 其原理:通过网络请求获得相关的信息,再通过手机端进行拼HTML,然后在WebView进行展示,此处还对文章中的图片增加点击效果,可以保存到相册中:文章的样式已经存在项目中,直接去调用: 1:首先了解两个相关的实体对象,一个是新闻的主体内容,另外一个就是图片的相关信息实体: 1:主

Android应用经典主界面框架之二:仿网易新闻client、CSDN client (Fragment ViewPager)

另外一种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表.使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View.而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter仅仅在这个包里有,在android.app.*这个包以

Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签

之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻客户端Tab标签的功能,ActionBarSherlock是在3.0以下的机器支持ActionBar的功能,有兴趣的可以看看开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端,今天用到的是JakeWharton的另一开源控件ViewPageIndicator,ViewPager想必大家都知道,Indicator指示器的意思,所以ViewPageIndica

Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻clientTab标签

之前用JakeWharton的开源框架ActionBarSherlock和ViewPager实现了对网易新闻clientTab标签的功能,ActionBarSherlock是在3.0下面的机器支持ActionBar的功能,有兴趣的能够看看开源框架ActionBarSherlock 和 ViewPager 仿网易新闻client,今天用到的是JakeWharton的还有一开源控件ViewPageIndicator.ViewPager想必大家都知道,Indicator指示器的意思,所以ViewPag

Android应用经典主界面框架之二:仿网易新闻客户端、CSDN 客户端 (Fragment ViewPager)

第二种主界面风格则是以网易新闻.凤凰新闻以及新推出的新浪博客(阅读版)为代表,使用ViewPager+Fragment,即ViewPager里适配器里放的不是一般的View,而是Fragment.所以适配器不能继承PagerAdapter,而要继承FragmentPagerAdapter,这是在android.support.v4.app.FragmentPagerAdapter包里的.有点奇葩的是,FragmentPagerAdapter只在这个包里有,在android.app.*这个包下面么

Android 开源框架ActionBarSherlock 和 ViewPager 仿网易新闻客户端

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/9971721 大家都知道Android的ActionBar是在3.0以上才有的,那么在3.0以下呢,google并没有给我提供在3.0以下支持ActionBar的包,但是外国的大牛JakeWharton实现了在3.0以下使用ActionBar, JakeWharton这位大牛是ActionBarSherlock,Android-ViewPagerIndicator ,NineOldAn

Android自定义控制(五)仿新浪微博的下拉刷新

网上有很多很有名的开源框架,这里就来拉拉PullToRefresh这个框架,也就是我们平时用的下拉刷新啦,当然你问我这个有什么用啊?别人已经写好了,这里主要是学习以及练习,练习的次数多了,一切就顺其自然的会了. 废话少说,先上图,再上代码: 1.要想实现下拉刷新功能必须要有个下拉刷新的布局,是吧? <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="htt