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 |