天天看點

Android SwipeRequestLayout(類似Google重新整理控件)

Android SwipeRequestLayout(類似Google重新整理控件)

前言

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)
           

繼續閱讀