前言
Google對Android的刷新控件開刀之後,目前很多APP已經開始在使用SwipeRefreshLayout這個控件了,當我第一次看見這個控件的時候我就決定使用它,只因爲看着簡單實用,不需要對刷新進行過多的修飾。但是這個控件有一個致命的問題就是Google對控件沒有寫加載更多。很多Android同胞於是就對這個控件進行了重寫,補足了這個控件的缺點,但是此次我不是對此控件重寫,我是重頭開始寫,看着這個控件的效果自己來書寫這個控件,這樣自己的書寫的控件就算是出問題了,自己好修改而不過多依賴於Google工程師的View。此次的控件在原控件的效果之上對控件下拉到可以鬆開的時刻,進行陰影顏色的同色處理。當然也可以刷新或者加載的時候對控件本身進行一次陰影顏色的同色處理。
知識
(1)View的Circle和Arc繪製
canvas.drawCircle(centerX, centerY, circleRadius, paint);、
RectF oval = new RectF(centerX - arcRadius, centerY - arcRadius, centerX + arcRadius, centerY + arcRadius);
canvas.drawArc(oval, startAngle, sweepAngle, false, paint);
(2)Arc繪製動畫效果實現
ValueAnimator animator = ValueAnimator.ofFloat(sweepAngle);
animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float animatedValue = (float) animation.getAnimatedValue();
//拿到動畫值,進行重寫繪製即可
}
});
animator.setInterpolator(new LinearInterpolator());
animator.setRepeatCount(Animation.INFINITE);
animator.setDuration(duration);
animator.start();
(3)事件的分發機制
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
downX = event.getX();
downY = event.getY();
break;
case MotionEvent.ACTION_MOVE:
float moveY = event.getY() - downY;
float moveX = event.getX() - downX;
if (Math.abs(moveY) < moveX) {
return super.onInterceptTouchEvent(event);
}
if (moveY > 0 ) {
//isContentViewRefreshEnable()==true.即是對事件進行攔截,交給onTouchEvent,這樣你才能下拉刷新,
//反之不能攔截,你就得不到事件無法操作。
return isContentViewRefreshEnable();
}
if (moveY < 0 ) {
//isContentViewLoadEnable()==true.即是對事件進行攔截,交給onTouchEvent,這樣你才能上拉加載,
//反之不能攔截,你就得不到事件無法操作。
return isContentViewLoadEnable();
}
break;
}
return super.onInterceptTouchEvent(event);
}
@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_UP:
//手指鬆開處理代碼
break;
case MotionEvent.ACTION_MOVE:
float moveY = event.getY() - downY;
if (moveY > 0) {//下滑
} else {//上滑
}
//重繪
requestLayout();
break;
}
return super.onTouchEvent(event);
}
使用
源碼 | apk |
---|---|
下載 | 下載 |
(1)xml佈局
<!---注意類包名-->
<com.android.widget.swipe.SwipeRequestLayout
android:id="@+id/sal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</com.android.widget.swipe.SwipeRequestLayout>
(2)設置刷新監聽
/**
* 設置刷新監聽
*
* @param refreshListener
*/
public void setOnSwipeRefreshListener(OnSwipeRefreshListener refreshListener)
(3)設置加載監聽
/**
* 設置加載監聽
*
* @param loadListener
*/
public void setOnSwipeLoadListener(OnSwipeLoadListener loadListener)
(4)刷新顯示隱藏
/**
* 設置正在刷新
*
* @param isRefreshing 是否開始刷新
*/
public void setRefreshing(boolean isRefreshing)
(5)加載顯示隱藏
/**
* 設置正在加載
*
* @param isLoading 是否開始加載
*/
public void setLoading(boolean isLoading)