android開發游記:SpringView 下拉刷新的高效解決方式,定制你自己風格的拖拽頁面


關於下拉刷新/上拉載入很多其它的解決方式網上已經有非常多了,瀏覽了眼下主流的下拉控件比方PullToRefresh庫等。第一:大多數實現庫都難以進行動畫和樣式的自己定義。

第二:不能非常好的兼容多種滾動控件,它們都對listView、RecyclerView等進行了不同程度的又一次實現,你在項目中就得使用庫提供的PullToRefreshListView、PullToRefreshRecyclerView等來取代源生的listView、RecyclerView等。這種方式事實上並不好,隨着android版本號的不斷升級源生的listView、RecyclerView也不斷加入新特性和對之前bug的改動,這使得三方實現的控件非常難跟上google的節奏,當源生listView已經更新多個版本號之后,三方的ListView可能還在使用低版本號的實現方式。

基於如上兩個原因。我開始着手開發SpringView(彈性View)

SpringView有哪些長處?

  1. 能對header/footer(頭部/尾部)的樣式和動畫進行高度自己定義,單獨將header/footer獨立出來。差點兒能夠實現不論什么你想要的效果,僅僅須要繼承BaseHeader/BaseFooter實現相應接口就能夠。

  2. 能動態地替換header/footer。僅僅須要設置不同的頭尾就可以:springView.setHeader(MyHeader());

  3. 在不重寫源生控件的情況下。完美支持系統源生的listView、RecyclerView、ScrollView、WebView等,你依舊使用google提供的官方控件,SpringView全然不做干澀。

  4. 使用簡單。對於簡單的需求甚至不用寫不論什么代碼。僅僅須要在布局中為SpringView設置header=”@layout/…”屬性就可以。

  5. SpringView是非常輕量級的實現。提供了非常easy拓展的對外接口

  6. SpringView支持多點觸控,能夠兩僅僅手連續拖拽。你能夠定制一些趣味的動畫(比如demo5的仿acfun效果)

  7. SpringView提供了2種拖拽方式(重疊和尾隨)。能夠動態地切換

  8. SpringView為不想去自己定義頭/尾的懶人提供了7種默認的實現(模仿了阿里。騰訊,美團等多種風格)例如以下。還會繼續添加

DefaultHeader GearHeader

WebHeader AcfunHeader

QQHeader MeituanHeader

AliHeader

怎樣使用 SpringView?

源代碼及demo下載 gitbub: 下載地址

在布局文件里加入SpringView,並把你想要拖拽的控件放在SpringView中,給SpringView加入app:header=”@layout/…”屬性。設置一個自己編寫的頭部的布局就可以(footer同理):

    <com.liaoinstan.springview.widget.SpringView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:header="@layout/myheader"
            app:footer="@layout/myfooter">

            <listView
                android:layout_width="match_parent"
                android:layout_height="match_parent"/>

     </com.liaoinstan.springview.widget.SpringView>

這樣,最主要的實現就完畢了,執行看看吧。

當然,你也能夠不再布局中設置,使用代碼動態加入:

    //DefaultHeader/Footer是SpringView已經實現的默認頭/尾之中的一個
    //很多其它還有MeituanHeader、AliHeader、RotationHeader等如上圖7種
    springView.setHeader(new DefaultHeader(this));
    springView.setFooter(new DefaultFooter(this));

刷新和載入很多其它的事件處理

假設須要處理的話,僅僅需在代碼中加入監聽:

springView.setListener(new SpringView.OnFreshListener() {
      @Override
      public void onRefresh() {
      }
      @Override
      public void onLoadmore() {
      }
});

怎樣自己定義一個Header或Footer

具體的你能夠看下幾種默認實現的Header源代碼,這里僅僅簡介下:

我們要做一個簡單的能夠記錄拖拽了多少次的Header。

首先新建一個自己定義頭部布局。就是在RelativeLayout中放一個TextView啦:

這里寫圖片描寫敘述

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="80dp" android:background="@drawable/view_post_comment_bg" android:layout_gravity="top">

    <TextView  android:layout_width="120dp" android:gravity="center" android:layout_height="wrap_content" android:text="this is TextView " android:background="#ff0000" android:textColor="#ffffff" android:layout_centerVertical="true" android:layout_centerHorizontal="true" android:id="@+id/textView" />
</RelativeLayout>

接着,新建一個MyHeader基礎自BaseHeader:

public class MyHeader extends BaseHeader{
    //獲取Header
    @Override
    public View getView(LayoutInflater inflater, ViewGroup viewGroup) {}

    //拖拽開始前回調
    @Override
    public void onPreDrag(View rootView) {}

    //手指拖拽過程中不斷回調。dy為拖拽的距離,能夠依據拖動的距離加入拖動過程動畫
    @Override
    public void onDropAnim(View rootView, int dy) {}

    //手指拖拽過程中每次經過臨界點時回調。upORdown是向上經過還是向下經過
    @Override
    public void onLimitDes(View rootView, boolean upORdown) {}

    //拉動超過臨界點后松開時回調
    @Override
    public void onStartAnim() {}

    //頭部已經所有彈回時回調
    @Override
    public void onFinishAnim() {}
}

凝視已經非常清楚了。當中必須實現的方法是getView(),將頭部的View實例返回給SpringView。其余方法有需求就實現。

實現getView()方法,加入一個成員變量保存頭部中的TextView:

    private TextView textView;
    @Override
    public View getView(LayoutInflater inflater, ViewGroup viewGroup) {
        View view = inflater.inflate(R.layout.header_my, viewGroup, true);
        textView = (TextView)view.findViewById(R.id.textView);
        return view;
    }

實現onLimitDes方法。在每次經過臨界點時改變TextView的內容:

    private int i = 0;
    @Override
    public void onLimitDes(View rootView, boolean upORdown) {
        i++;
        textView.setText("this is TextView "+i);
    }

OK,在Activity中為SpringView設置我們自己定義的MyHeader就能夠了。再設置一個監聽器,在刷新和載入很多其它的時候等待1秒調用onFinishFreshAndLoad()結束刷新動作。

        springView = (SpringView) findViewById(R.id.springview);
        springView.setHeader(new MyHeader());

        springView.setListener(new SpringView.OnFreshListener() {
            @Override
            public void onRefresh() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        springView.onFinishFreshAndLoad();
                    }
                }, 1000);
            }
            @Override
            public void onLoadmore() {
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        springView.onFinishFreshAndLoad();
                    }
                }, 1000);
            }
        });

這里寫圖片描寫敘述

這樣就完畢了一個簡單的自己定義Header,Footer同理。

怎樣自己定義最大下拉高度,臨界高度。和回彈高度

在BaseHeader(BaseFooter同理)中默認已經實現3個方法。分別返回的是臨界高度(limit hight),下拉最大高度(max height)。下拉彈動高度(spring height):
假設有更加復雜的需求,須要更改這些高度的話。就在自己的Header中重寫這些方法。凝視已經非常清楚了:

public abstract class BaseHeader implements SpringView.DragHander{
    /** * 這種方法用於設置當前View的臨界高度(limit hight),即拉動到多少會被認定為刷新超作,而沒到達該高度則不會執行刷新 * 返回值大於0才有效,假設<=0 則設置為默認header的高度 * 默認返回0 */
    @Override
    public int getDragLimitHeight(View rootView) {
        return 0;
    }

    /** * 這種方法用於設置下拉最大高度(max height),不管怎么拉動都不會超過這個高度 * 返回值大於0才有效,假設<=0 則默認600px * 默認返回0 */
    @Override
    public int getDragMaxHeight(View rootView) {
        return 0;
    }

    /** * 這種方法用於設置下拉彈動高度(spring height),即彈動后停止狀態的高度 * 返回值大於0才有效,假設<=0 則設置為默認header的高度 * 默認返回0 */
    @Override
    public int getDragSpringHeight(View rootView) {
        return 0;
    }
}

到這里,SpringView的用法基本介紹完了,后面的文章會陸續從源代碼介紹SpringView的實現,和自帶的各種默認Header的實現

下載請移步gitbub:

我的github

認為不錯的話。以下有個贊能夠點一下:)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM