diff --git a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java index 32ea1e8..5da7b35 100644 --- a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java +++ b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java @@ -9,17 +9,16 @@ import android.view.View; import android.widget.Button; import android.widget.ImageButton; -import android.widget.LinearLayout; import com.chyrta.onboarder.utils.ColorsArrayBuilder; import com.chyrta.onboarder.views.CircleIndicatorView; import java.util.List; -public class OnboarderActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { +public abstract class OnboarderActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { private Integer[] colors; - private LinearLayout llIndicators; + private CircleIndicatorView circleIndicatorView; private ViewPager vpOnboarderPager; private OnboarderAdapter onboarderAdapter; private ImageButton ibNext; @@ -31,10 +30,8 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_onboarder); setStatusBackgroundColor(); - getSupportActionBar().hide(); - - llIndicators = (LinearLayout) findViewById(R.id.ll_indicators); + circleIndicatorView = (CircleIndicatorView) findViewById(R.id.circle_indicator_view); ibNext = (ImageButton) findViewById(R.id.ib_next); btnSkip = (Button) findViewById(R.id.btn_skip); btnFinish = (Button) findViewById(R.id.btn_finish); @@ -49,14 +46,16 @@ protected void onCreate(Bundle savedInstanceState) { public void setOnboardPagesReady(List pages) { onboarderAdapter = new OnboarderAdapter(pages, getSupportFragmentManager()); vpOnboarderPager.setAdapter(onboarderAdapter); - setPageIndicators(pages.size()); colors = ColorsArrayBuilder.getPageBackgroundColors(this, pages); + circleIndicatorView.setPageIndicators(pages.size()); } - public void setPageIndicators(int quantity) { - for (int i = 0; i < quantity; i++) { - llIndicators.addView(new CircleIndicatorView(this)); - } + public void setInactiveIndicatorColor(int color) { + circleIndicatorView.setInactiveIndicatorColor(color); + } + + public void setActiveIndicatorColor(int color) { + circleIndicatorView.setActiveIndicatorColor(color); } public void setStatusBackgroundColor() { @@ -75,6 +74,9 @@ public void onClick(View v) { vpOnboarderPager.setCurrentItem(vpOnboarderPager.getCurrentItem() + 1); } else if (i == R.id.btn_skip) { vpOnboarderPager.setCurrentItem(onboarderAdapter.getCount()); + onSkipButtonPressed(); + } else if (i == R.id.btn_finish) { + onFinishButtonPressed(); } } @@ -90,6 +92,7 @@ public void onPageScrolled(int position, float positionOffset, int positionOffse @Override public void onPageSelected(int position) { int lastPagePosition = onboarderAdapter.getCount() - 1; + circleIndicatorView.setCurrentPage(position); ibNext.setVisibility(position == lastPagePosition ? View.GONE : View.VISIBLE); btnFinish.setVisibility(position == lastPagePosition ? View.VISIBLE : View.GONE); } @@ -99,4 +102,7 @@ public void onPageScrollStateChanged(int state) { } + abstract public void onSkipButtonPressed(); + abstract public void onFinishButtonPressed(); + } diff --git a/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java b/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java index 56b8eee..29a865c 100644 --- a/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java +++ b/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java @@ -2,36 +2,117 @@ import android.content.Context; import android.graphics.Canvas; -import android.graphics.Color; import android.graphics.Paint; -import android.graphics.drawable.shapes.OvalShape; +import android.support.annotation.ColorRes; +import android.util.AttributeSet; import android.view.View; -import android.view.ViewGroup; + +import com.chyrta.onboarder.R; public class CircleIndicatorView extends View { - OvalShape oval; + private Paint activeIndicatorPaint; + private Paint inactiveIndicatorPaint; + private int radius; + private int size; + private int position; + private int indicatorsCount; public CircleIndicatorView(Context context) { super(context); - Canvas canvas = new Canvas(); - Paint paint = new Paint(); - oval = new OvalShape(); - oval.draw(canvas, paint); + init(); + } + + public CircleIndicatorView(Context context, AttributeSet attrs) { + super(context, attrs); + init(); + } + + public CircleIndicatorView(Context context, AttributeSet attrs, int defStyle) { + super(context, attrs, defStyle); + init(); + } + + private void init() { + activeIndicatorPaint = new Paint(); + activeIndicatorPaint.setColor(getResources().getColor(R.color.active_indicator, null)); + activeIndicatorPaint.setAntiAlias(true); + inactiveIndicatorPaint = new Paint(); + inactiveIndicatorPaint.setColor(getResources().getColor(R.color.inactive_indicator, null)); + inactiveIndicatorPaint.setAntiAlias(true); + radius = getResources().getDimensionPixelSize(R.dimen.indicator_size); + size = radius * 2; } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - canvas.drawColor(Color.WHITE); + for (int i = 0; i < indicatorsCount; i++) { + canvas.drawCircle(radius + (size * i), radius, radius / 2, inactiveIndicatorPaint); + } + canvas.drawCircle(radius + (size * position), radius, radius / 2, activeIndicatorPaint); + } + + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); } @Override - public void setLayoutParams(ViewGroup.LayoutParams params) { - super.setLayoutParams(params); - params.height = 8; - params.width = 8; + protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { + setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); + } + + public void setCurrentPage(int position) { + this.position = position; + invalidate(); } + public void setPageIndicators(int size) { + this.indicatorsCount = size; + invalidate(); + } + + private int measureWidth(int measureSpec) { + int result = 0; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + + if (specMode == MeasureSpec.EXACTLY) { + result = specSize; + } else { + result = size * indicatorsCount; + if (specMode == MeasureSpec.AT_MOST) { + result = Math.min(result, specSize); + } + } + return result; + } + + private int measureHeight(int measureSpec) { + int result = 0; + int specMode = MeasureSpec.getMode(measureSpec); + int specSize = MeasureSpec.getSize(measureSpec); + + if (specMode == MeasureSpec.EXACTLY) { + result = specSize; + } else { + result = 2 * radius + getPaddingTop() + getPaddingBottom(); + if (specMode == MeasureSpec.AT_MOST) { + result = Math.min(result, specSize); + } + } + return result; + } + + public void setInactiveIndicatorColor(@ColorRes int color) { + inactiveIndicatorPaint.setColor(getResources().getColor(color, null)); + invalidate(); + } + + public void setActiveIndicatorColor(@ColorRes int color) { + activeIndicatorPaint.setColor(getResources().getColor(color, null)); + invalidate(); + } } diff --git a/onboarder/src/main/res/layout/activity_onboarder.xml b/onboarder/src/main/res/layout/activity_onboarder.xml index aaf9cf4..95e5959 100644 --- a/onboarder/src/main/res/layout/activity_onboarder.xml +++ b/onboarder/src/main/res/layout/activity_onboarder.xml @@ -46,6 +46,11 @@ android:layout_gravity="center" android:orientation="horizontal"> + +