Android

android viewpager indicator 인디케이터

Machine_웅 2020. 9. 17. 16:30
728x90
반응형
public class MainActivity extends AppCompatActivity {
 
    private ViewPager viewPager;
 
    private List<String> numberList;
 
    private CircleAnimIndicator circleAnimIndicator;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        initLayout();
        init();
    }
 
 
    /**
     * 레이아웃 초기화
     */
    private void initLayout(){
 
        viewPager = (ViewPager) findViewById(R.id.viewPager);
        circleAnimIndicator = (CircleAnimIndicator) findViewById(R.id.circleAnimIndicator);
    }
 
 
    /**
     * 데이터 초기화
     */
    private void init(){
 
        //데이터 초기화
        initData();
        //ViewPager 초기화
        initViewPager();
    }
 
 
    /**
     * 데이터 초기화
     */
    private void initData(){
 
        numberList = new ArrayList<>();
        numberList.add("1");
        numberList.add("2");
        numberList.add("3");
        numberList.add("4");
        numberList.add("5");
 
    }
 
 
    /**
     * ViewPager 초기화
     */
    private void initViewPager(){
 
        ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getApplicationContext(),numberList);
        viewPager.setAdapter(viewPagerAdapter);
        viewPager.addOnPageChangeListener(mOnPageChangeListener);
 
 
        //Indicator 초기화
        initIndicaotor();
    }
 
 
    /**
     * Indicator 초기화
     */
    private void initIndicaotor(){
 
        //원사이의 간격
        circleAnimIndicator.setItemMargin(15);
        //애니메이션 속도
        circleAnimIndicator.setAnimDuration(300);
        //indecator 생성
        circleAnimIndicator.createDotPanel(numberList.size(), R.drawable.indicator_non , R.drawable.indicator_on);
    }
 
 
    /**
     * ViewPager 전환시 호출되는 메서드
     */
    private ViewPager.OnPageChangeListener mOnPageChangeListener = new ViewPager.OnPageChangeListener() {
 
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {}
 
        @Override
        public void onPageSelected(int position) {
            circleAnimIndicator.selectDot(position);
        }
 
        @Override
        public void onPageScrollStateChanged(int state) {
        }
    };
 
 
}
 
​
public class CircleAnimIndicator extends LinearLayout{
 
    private Context mContext;
 
    //원 사이의 간격
    private int itemMargin = 10;
 
    //애니메이션 시간
    private int animDuration = 250;
 
    private int mDefaultCircle;
    private int mSelectCircle;
 
    private ImageView[] imageDot;
 
    public void setAnimDuration(int animDuration) {
        this.animDuration = animDuration;
    }
 
    public void setItemMargin(int itemMargin) {
        this.itemMargin = itemMargin;
    }
 
    public CircleAnimIndicator(Context context) {
        super(context);
 
        mContext = context;
    }
 
    public CircleAnimIndicator(Context context, AttributeSet attrs) {
        super(context, attrs);
 
        mContext = context;
    }
 
 
    /**
     * 기본 점 생성
     * @param count 점의 갯수
     * @param defaultCircle 점의 이미지
     */
    public void createDotPanel(int count , int defaultCircle , int selectCircle) {
 
        mDefaultCircle = defaultCircle;
        mSelectCircle = selectCircle;
 
        imageDot = new ImageView[count];
 
        for (int i = 0; i < count; i++) {
 
            imageDot[i] = new ImageView(mContext);
            LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
                    (LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
            params.topMargin = itemMargin;
            params.bottomMargin = itemMargin;
            params.leftMargin = itemMargin;
            params.rightMargin = itemMargin;
            params.gravity = Gravity.CENTER;
 
            imageDot[i].setLayoutParams(params);
            imageDot[i].setImageResource(defaultCircle);
            imageDot[i].setTag(imageDot[i].getId(), false);
            this.addView(imageDot[i]);
        }
 
 
        //첫인덱스 선택
        selectDot(0);
    }
 
 
    /**
     * 선택된 점 표시
     * @param position
     */
    public void selectDot(int position) {
 
        for (int i = 0; i < imageDot.length; i++) {
            if (i == position) {
                imageDot[i].setImageResource(mSelectCircle);
                selectScaleAnim(imageDot[i],1f,1.5f);
            } else {
 
                if((boolean)imageDot[i].getTag(imageDot[i].getId()) == true){
                    imageDot[i].setImageResource(mDefaultCircle);
                    defaultScaleAnim(imageDot[i], 1.5f, 1f);
                }
            }
        }
    }
 
 
    /**
     * 선택된 점의 애니메이션
     * @param view
     * @param startScale
     * @param endScale
     */
    public void selectScaleAnim(View view, float startScale, float endScale) {
        Animation anim = new ScaleAnimation(
                startScale, endScale,
                startScale, endScale,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        anim.setFillAfter(true);
        anim.setDuration(animDuration);
        view.startAnimation(anim);
        view.setTag(view.getId(),true);
    }
 
 
    /**
     * 선택되지 않은 점의 애니메이션
     * @param view
     * @param startScale
     * @param endScale
     */
    public void defaultScaleAnim(View view, float startScale, float endScale) {
        Animation anim = new ScaleAnimation(
                startScale, endScale,
                startScale, endScale,
                Animation.RELATIVE_TO_SELF, 0.5f,
                Animation.RELATIVE_TO_SELF, 0.5f);
        anim.setFillAfter(true);
        anim.setDuration(animDuration);
        view.startAnimation(anim);
        view.setTag(view.getId(),false);
    }
}


 

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000">
 
    <android.support.v4.view.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
 
    <com.android.woong.viewpagerindicator.custom.CircleAnimIndicator
        android:id="@+id/circleAnimIndicator"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="50dp" />
 
 

</RelativeLayout>
 
728x90
반응형

'Android' 카테고리의 다른 글

Glide 옵션 캐시관련  (0) 2020.09.23
정규식  (0) 2020.09.21
구분자 붙이기  (0) 2020.09.10
바코드 만들기  (0) 2020.09.08
FCM 푸시 헤드업 알림 안뜨는 경우 ( 포어그라운드 상태 )  (1) 2020.09.03