zoukankan      html  css  js  c++  java
  • 仿网易新闻最新版的下拉刷新

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

    123.gif
    代码还有一点问题。我先说怎么用把:
    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上也可以下载。
     
     
    我的github地址:https://github.com/flyme2012
     



    附件列表

  • 相关阅读:
    Asp.Net 加密 web.config中的某个敏感信息
    异步模型中HttpWebRequest的Timeout
    WCF路由所有的请求到一个方法route all request to one operation
    .Net中直接操作内存
    【转】.NET AJAX实例
    【原】IE/FF 强制浏览器不读取缓存(强制刷新)
    【精】经典的css技巧
    【转】C#如何获取客户端/服务端IP地址
    【原】FireFox显示滚动条 [解决页面左右移动]
    【原】Function Import in Entity Framework 4 issue
  • 原文地址:https://www.cnblogs.com/flyme2012/p/4084045.html
Copyright © 2011-2022 走看看