andbase框架實現上拉載入,下拉重新整理和自定義旋轉動畫的方式
阿新 • • 發佈:2019-02-20
1、今天做列表時,需求上需要做一個下拉重新整理,下拉載入更多的功能,就上網找了一些例子,由於我原來用的就是andbase框架,就還是用它原來寫的了。其中同事給我推薦另一個框架BGARefreshLayout-Android,下載地址https://github.com/bingoogolapple/BGARefreshLayout-Android,看著感覺也挺好的,但是程式碼寫的可能太好了,不太容易讀懂,就還是用andbase自帶的AbPullToRefreshView方法。
2、先上圖,其中上面的滾動導航可以根據列表一起滾動,實現方式如下:原來就是在listview上加一個表頭。
LayoutInflater mInflater = LayoutInflater.from(this);
headerView = mInflater.inflate(R.layout.building_top_advert,null);
main_building_listivew.addHeaderView(headerView);
4、先寫一個xml檔案:其中AbPullToRefreshView下的listview不能再寫在Linearout中。
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawer_screen" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white"> <!--顯示的內容--> <LinearLayout android:layout_width="match_parent" android:orientation="vertical" android:layout_height="match_parent"> <include layout="@layout/top" android:visibility="gone"android:id="@+id/top_isvisible" /> <!--滑動功能--> <com.ab.view.pullview.AbPullToRefreshView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mPullRefreshView" android:layout_width="fill_parent" android:orientation="vertical" android:layout_height="fill_parent" android:background="@color/white"> <ListView android:id="@+id/main_building_listivew" android:layout_width="match_parent" android:layout_height="match_parent" android:dividerHeight="1dp" android:listSelector="#00000000" > </ListView> </com.ab.view.pullview.AbPullToRefreshView> </LinearLayout> <LinearLayout android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="end" android:orientation="vertical" /> </android.support.v4.widget.DrawerLayout>
5、java程式碼如下:
public class MainBuildingActivity extends MainActivity implements OnFooterLoadListener
private AbPullToRefreshView mPullRefreshView; //當前頁 private int currentPage = 1; //總頁數 private int total = 100; //每頁顯示的條數 private int pageSize = 15; //上方顯示迴圈廣告的view,headerView private View headerView;
mPullRefreshView=findViewById(R.id.mPullRefreshView);
/*資料重新整理的方法*/ private void refreshData(){ //設定不可以進行下拉重新整理 mPullRefreshView.setPullRefreshEnable(false); // 設定監聽器 mPullRefreshView.setOnFooterLoadListener(this); // 設定進度條的樣式 mPullRefreshView.getFooterView().setFooterProgressBarDrawable( this.getResources().getDrawable(R.drawable.progress_circular)); }
@Override public void onFooterLoad(AbPullToRefreshView abPullToRefreshView) { loadMoreTask(); } /*下拉列表時載入更多內容*/ public void loadMoreTask() { AbTaskMy mAbTask = AbTaskMy.newInstance(); final AbTaskItem item = new AbTaskItem(); item.setListener(new AbTaskListListener() { @Override //將資料載入到顯示的list集合中 public void update(List<?> paramList) { List<String[]> newList = (List<String[]>) paramList; if (newList != null && newList.size() > 0) { listBuilding.addAll(newList); adapter.notifyDataSetChanged(); newList.clear(); } mPullRefreshView.onFooterLoadFinish(); } //獲得新的資料 @Override public List<?> getList() { List<String[]> newList = null; try { currentPage++; Thread.sleep(1000); newList = new ArrayList<>(); Map<String, Object> map = null; for(int i=0;i<pageSize;i++){ String[] s=new String[2]; s[0]="http://61.161.221.254:1234/upload/project/20180109.jpg"; s[1]="樓盤名稱__"+(currentPage*pageSize+i); newList.add(s); } } catch (Exception e) { currentPage--; newList.clear(); } return newList; }; }); mAbTask.execute(item); }
6、其中下拉載入時有一個旋轉動畫效果:具體含義可以去網上查詢
<?xml version="1.0" encoding="utf-8"?> <animated-rotate xmlns:android="http://schemas.android.com/apk/res/android" android:duration="200" android:fromDegrees="0.0" android:interpolator="@android:anim/accelerate_decelerate_interpolator" android:pivotX="50.0%" android:pivotY="50.0%" android:repeatMode="restart" android:toDegrees="360.0" android:drawable="@drawable/progress_loading2"> </animated-rotate>duration:動畫開始到結束的執行時間
fromDegrees: 設定動畫開始時的角度
toDegrees:設定動畫結束時的旋轉角度
pivotX : 設定動畫相對於控制元件的 x 座標的位置
pivotY:設定動畫相對於控制元件的 y 座標的位置
repeatMode:
動畫的進度使用 Interpolator 控制。Interpolator 定義了動畫的變化速度,可以實現勻速、正加速、負加速、無規則變加速等。Interpolator 是基類,封裝了所有 Interpolator 的共同方法,它只有一個方法,即 getInterpolation (float input),該方法 maps a point on the timeline to a multiplier to be applied to the transformations of an animation。Android 提供了幾個 Interpolator 子類,實現了不同的速度曲線,如下:
AccelerateDecelerateInterpolator 在動畫開始與介紹的地方速率改變比較慢,在中間的時侯加速
AccelerateInterpolator 在動畫開始的地方速率改變比較慢,然後開始加速
CycleInterpolator 動畫迴圈播放特定的次數,速率改變沿著正弦曲線
DecelerateInterpolator 在動畫開始的地方速率改變比較慢,然後開始減速
LinearInterpolator 在動畫的以均勻的速率改變
對於 LinearInterpolator ,變化率是個常數,即 f (x) = x.
public float getInterpolation(float input) {
return input;
}