package com.hitherejoe.bourbon.ui.shot;
import android.content.Context;
import android.content.res.Resources;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import com.hitherejoe.bourbon.R;
public class CircleIndicatorView extends LinearLayout {
private final int mIndicatorSize = dpToPx(4);
private final int mIndicatorMargin = dpToPx(2);
public int dpToPx(int dp) {
float density = Resources.getSystem().getDisplayMetrics().density;
return Math.round(dp * density);
}
private ViewPager mViewPager;
public CircleIndicatorView(Context context) {
super(context);
init();
}
public CircleIndicatorView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public CircleIndicatorView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
public CircleIndicatorView(Context context, AttributeSet attrs, int defStyleAttr,
int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}
private void init() {
setOrientation(HORIZONTAL);
}
public void attachViewPager(ViewPager viewPager) {
detachViewPager();
mViewPager = viewPager;
mViewPager.addOnPageChangeListener(mOnPageChangeListener);
PagerAdapter adapter = mViewPager.getAdapter();
if (adapter == null) {
throw new RuntimeException("Set a PagerAdapter in the ViewPager before attaching it");
}
updateViewIndicators(adapter.getCount());
selectIndicatorAtPosition(viewPager.getCurrentItem(), false);
}
public void detachViewPager() {
if (mViewPager != null) {
mViewPager.removeOnPageChangeListener(mOnPageChangeListener);
mViewPager = null;
}
}
private void updateViewIndicators(int numIndicators) {
removeAllViews();
for (int i = 0; i < numIndicators; i++) {
addView(makeIndicatorView());
}
}
private View makeIndicatorView() {
View view = new View(getContext());
LinearLayout.LayoutParams params =
new LinearLayout.LayoutParams(mIndicatorSize, mIndicatorSize);
params.setMargins(mIndicatorMargin, mIndicatorMargin, mIndicatorMargin, mIndicatorMargin);
view.setLayoutParams(params);
view.setBackgroundResource(R.drawable.circle_accent);
return view;
}
private void selectIndicatorAtPosition(int position, boolean animated) {
for (int i = 0; i < getChildCount(); i++) {
View child = getChildAt(i);
if (i == position) {
child.setBackgroundResource(R.drawable.circle_accent);
scaleViewTo(child, 1.5f, animated);
} else {
child.setBackgroundResource(R.drawable.circle_primary_dark);
scaleViewTo(child, 1, animated);
}
}
}
private void scaleViewTo(View view, float scale, boolean animated) {
if (view.getScaleX() == scale && view.getScaleY() == scale) {
return; // nothing to do here!
}
if (animated) {
view.animate()
.scaleX(scale).scaleY(scale)
.setDuration(200)
.start();
} else {
view.setScaleX(scale);
view.setScaleY(scale);
}
}
private ViewPager.OnPageChangeListener mOnPageChangeListener =
new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
selectIndicatorAtPosition(position, true);
}
@Override
public void onPageScrollStateChanged(int state) {
}
};
}