1. 程式人生 > >Android 實現輪播圖效果(三) 底部圓點狀態改變

Android 實現輪播圖效果(三) 底部圓點狀態改變

自動輪播和手動輪播之後應該實現圓點的切換

自定義改變圓點狀態的監聽器

新建介面public interface DotChangeListener,新增方法void dotChangeListener(int index);並在ImageBannerFramLayout實現改介面,方法的具體實現:

    /**
     * 改變圓點狀態方法的實現
     * @param index
     */
    @Override
    public void dotChangeListener(int index) {
        //傳入的index為當前輪播圖片的索引

        //獲得圓點個數
        int count = linearLayout.getChildCount();

        for (int i = 0; i < count; i++) {
            ImageView imageView = (ImageView) linearLayout.getChildAt(i);

            //設定圓點的選中狀態
            if (i == index) {
                imageView.setImageResource(R.drawable.dot_select);
            } else {
                imageView.setImageResource(R.drawable.dot_normal);
            }
        }
    }

修改ImageBannerViewGroup.java中的onTouchEvent方法,在MotionEvent.ACTION_MOVE事件中呼叫自定義的改變圓點狀態的監聽器

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {//表示的是使用者按下的一瞬間
                isClick = true;

                stopAuto();//使用者按下禁止自動輪播

                //第二種方法優化:
                if (!scroller.isFinished()) {
                    scroller.abortAnimation();
                }

                startX = (int) event.getX();
                break;
            }
            case MotionEvent.ACTION_MOVE: {//表示的是使用者按下之後在螢幕上移動的過程
                int moveX = (int) event.getX();
                int distance = moveX - startX;//移動的距離
                scrollBy(-distance, 0);
                startX = moveX;
                isClick = false;
                break;
            }
            case MotionEvent.ACTION_UP: {//表示的是使用者擡起的一瞬間
                int scrollX = getScrollX();//當前位置
                index = (scrollX + childWidth / 2) / childWidth;
                if (index < 0) {//說明此時已經滑動到左邊第一張圖片
                    index = 0;
                } else if (index > childCount - 1) {//說明此時已經滑動到最右邊最後第一張圖片
                    index = childCount - 1;
                }

                if (isClick) {//代表是點選事件
                    imageBannerLister.clickImageLister(index);
                } else {

                    //第二種方法第三步:
                    int dx = index * childWidth - scrollX;
                    scroller.startScroll(scrollX, 0, dx, 0);
                    postInvalidate();
                    dotChangeListener.dotChangeListener(index);
                    //第一種方法
//                scrollTo(index * childWidth, 0);//滑動設定

                }

                startAuto();//使用者離開螢幕開啟自動輪播
                break;
            }
            default: {
                break;
            }
        }
//        return super.onTouchEvent(event);
        return true;//返回true的目的是告訴 我們該Viewgroup容器的父View 我們已經處理好了該事件。
    }