https://github.com/liaohuqiu/android-Ultra-Pull-To-Refreshjava
android-Ultra-Pull-To-Refresh (簡稱 UltraPTR )是一個強大的 Andriod 下拉刷新框架。 1.繼承自ViewGroup,Content能夠包含任何View; 2.簡潔完善的Header抽象,方便進行擴展,構建知足需求的Header; 對比於Android-PullToRefresh 來講,UltraPTR沒有實現上拉加載,做者認爲上拉加載於下拉刷新不是同一個層次的功能,上拉加載應該交由Content本身去實現;Googgle官方的SwipeRefreshLayout也是這樣認爲的,對比SwipeRefreshLayout,UltraPTR更加靈活,更容易擴展。 UltraPTR首先抽象出兩個接口,功能接口和UI接口 PtrHandler表明下拉刷新的功能接口,包含刷新功能回調方法以及判斷是否能夠下拉的方法,用戶實現此接口來進行數據刷新工做。 PtrUIHandler表明下拉刷新的UI接口,包含準備下拉、下拉中、下拉完成、下拉重置以及下拉過程當中的位置變化等回調方法。一般狀況下,Header須要實現此接口,來處理下拉刷新過程當中頭部UI的變化。 整個項目圍繞核心類PtrFrameLayout。 PtrFrameLayout表明了一個下拉刷新的自定義控件。 PtrFrameLayout繼承自ViewGroup,有且只能有兩個子View,頭部Header和內容Content。一般狀況下,Header會實現PtrUIHandler接口,Content能夠爲任意的View。 和全部的自定義控件同樣,PtrFrameLayout經過重寫onFinishInflate、onMeasure、onLayout來肯定控件的大小和位置,經過重寫dispatchTouchEvent來肯定控件的下拉行爲。
1.阻尼係數:Resistance
//默認: 1.7f,越大,感受下拉時越吃力。android2.觸發刷新時移動的位置比例:RatioOfHeaderHeightToRefresh
//默認,1.2f,移動達到頭部高度1.2倍時可觸發刷新操做。git3.回彈延時:DurationToClose
//默認 200ms,回彈到刷新高度所用時間github4.頭部回彈時間:DurationToCloseHeader
//默認1000msapp5.刷新是保持頭部:KeepHeaderWhenRefresh
//默認值 true.框架6.下拉刷新 / 釋放刷新:PullToRefreshide
//默認爲釋放刷新,默認false post
<in.srain.cube.views.ptr.PtrFrameLayout android:id="@+id/ptrFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:ptr_resistance="1.7" app:ptr_ratio_of_header_height_to_refresh="1.2" app:ptr_duration_to_close="300" app:ptr_duration_to_close_header="300" app:ptr_keep_header_when_refresh="true" app:ptr_pull_to_fresh="false" > <LinearLayout android:id="@+id/store_house_ptr_image_content" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:padding="10dp"> <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/p5" /> </LinearLayout> </in.srain.cube.views.ptr.PtrFrameLayout>
ptrFrame.setResistance(1.7f); ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f); ptrFrame.setDurationToClose(200); ptrFrame.setDurationToCloseHeader(1000); ptrFrame.setPullToRefresh(false); ptrFrame.setKeepHeaderWhenRefresh(true);
1.StoreHoseHeaderthis
storeHouseHeader=new StoreHouseHeader(this); storeHouseHeader.setBackgroundColor(Color.GRAY); storeHouseHeader.setTextColor(Color.RED); storeHouseHeader.setLineWidth(4); storeHouseHeader.initWithString("update");
2. MeterialHeaderspa
materialHeader = new MaterialHeader(this); materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});
3.PtrClassicDefaultHeader
ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this);
xml文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto" > <in.srain.cube.views.ptr.PtrFrameLayout android:id="@+id/ptrFragment" android:layout_width="match_parent" android:layout_height="match_parent" app:ptr_resistance="1.7" app:ptr_ratio_of_header_height_to_refresh="1.2" app:ptr_duration_to_close="300" app:ptr_duration_to_close_header="300" app:ptr_keep_header_when_refresh="true" app:ptr_pull_to_fresh="false" > <LinearLayout android:id="@+id/store_house_ptr_image_content" android:layout_width="match_parent" android:layout_height="match_parent" android:clickable="true" android:padding="10dp"> <ImageView android:id="@+id/img" android:layout_width="match_parent" android:layout_height="match_parent" android:src="@mipmap/p5" /> </LinearLayout> </in.srain.cube.views.ptr.PtrFrameLayout> </RelativeLayout>
2.activity
public class TestActivity extends BaseActivity { private PtrFrameLayout ptrFrame; private ImageView img; private StoreHouseHeader storeHouseHeader; private MaterialHeader materialHeader; private PtrClassicDefaultHeader ptrClassicDefaultHeader; @Override protected void initView() { ptrFrame=findViewById(R.id.ptrFragment); img=findViewById(R.id.img); initPtrFm(); } private void initPtrFm() { //1. 設置頭部 initHeaders(); //2.添加頭部 ptrFrame.setHeaderView(materialHeader); //3.處理下拉刷新過程頭部UI的變化 ptrFrame.addPtrUIHandler(materialHeader); //4.判斷是否能夠下拉,數據刷新工做 ptrFrame.setPtrHandler(new PtrHandler() { @Override public void onRefreshBegin(PtrFrameLayout frame) { frame.postDelayed(new Runnable() { @Override public void run() { img.setImageResource(R.mipmap.p2); ptrFrame.refreshComplete(); } }, 3000); } @Override public boolean checkCanDoRefresh(PtrFrameLayout frame, View content, View header) { // 默認實現,根據實際狀況作改動 return PtrDefaultHandler.checkContentCanBePulledDown(frame, content, header); } }); } private void initHeaders() { /** * //第一種頭部 * StoreHouse風格的頭部實現 */ storeHouseHeader=new StoreHouseHeader(this); storeHouseHeader.setBackgroundColor(Color.GRAY); storeHouseHeader.setTextColor(Color.RED); storeHouseHeader.setLineWidth(4); storeHouseHeader.initWithString("update"); // storeHouseHeader.initWithString("last updatetime "+new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); //"last update @" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) /** * //第二種頭部 * Material Design風格的頭部實現 */ materialHeader = new MaterialHeader(this); materialHeader.setColorSchemeColors(new int[]{Color.RED, Color.GREEN, Color.BLUE});//相似SwipeRefreshLayout /** * //第三種頭部 * 經典 風格的頭部實現 */ ptrClassicDefaultHeader = new PtrClassicDefaultHeader(this); } @Override protected void initData() { } @Override protected int getLayoutId() { return R.layout.activity_test; } }