1. 程式人生 > >andbase框架實現上拉載入,下拉重新整理和自定義旋轉動畫的方式

andbase框架實現上拉載入,下拉重新整理和自定義旋轉動畫的方式

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;
//上方顯示迴圈廣告的viewheaderView
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;
}