Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用
阿新 • • 發佈:2018-10-25
com 過程 kcon ava false design cube can out
一.gitHub地址及介紹
https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh
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來確定控件的下拉行為。
二.6個配置參數
1.阻尼系數:Resistance
//默認: 1.7f,越大,感覺下拉時越吃力。2.觸發刷新時移動的位置比例:RatioOfHeaderHeightToRefresh
//默認,1.2f,移動達到頭部高度1.2倍時可觸發刷新操作。3.回彈延時:DurationToClose
//默認 200ms,回彈到刷新高度所用時間4.頭部回彈時間:DurationToCloseHeader
//默認1000ms5.刷新是保持頭部:KeepHeaderWhenRefresh
//默認值 true.6.下拉刷新 / 釋放刷新:PullToRefresh
//默認為釋放刷新,默認false
xml文件中設置
<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>
java代碼設置
ptrFrame.setResistance(1.7f); ptrFrame.setRatioOfHeaderHeightToRefresh(1.2f); ptrFrame.setDurationToClose(200); ptrFrame.setDurationToCloseHeader(1000); ptrFrame.setPullToRefresh(false); ptrFrame.setKeepHeaderWhenRefresh(true);
三、頭部風格
1.StoreHoseHeader
storeHouseHeader=new StoreHouseHeader(this); storeHouseHeader.setBackgroundColor(Color.GRAY); storeHouseHeader.setTextColor(Color.RED); storeHouseHeader.setLineWidth(4); storeHouseHeader.initWithString("update");
2. MeterialHeader
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; } }
Android下拉刷新控件android-Ultra-Pull-To-Refresh 使用