diff --git a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java index 964e2e4..32ea1e8 100644 --- a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java +++ b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderActivity.java @@ -1,5 +1,6 @@ package com.chyrta.onboarder; +import android.animation.ArgbEvaluator; import android.os.Build; import android.os.Bundle; import android.support.v4.content.ContextCompat; @@ -8,34 +9,54 @@ 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.ArrayList; import java.util.List; -public class OnboarderActivity extends AppCompatActivity implements View.OnClickListener { +public class OnboarderActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener { - ViewPager vpOnboarderPager; - OnboarderAdapter onboarderAdapter; - ImageButton ibNext; - Button btnSkip, btnFinish; + private Integer[] colors; + private LinearLayout llIndicators; + private ViewPager vpOnboarderPager; + private OnboarderAdapter onboarderAdapter; + private ImageButton ibNext; + private Button btnSkip, btnFinish; + private ArgbEvaluator evaluator; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setStatusBackgroundColor(); setContentView(R.layout.activity_onboarder); + setStatusBackgroundColor(); + + getSupportActionBar().hide(); + + llIndicators = (LinearLayout) findViewById(R.id.ll_indicators); ibNext = (ImageButton) findViewById(R.id.ib_next); btnSkip = (Button) findViewById(R.id.btn_skip); btnFinish = (Button) findViewById(R.id.btn_finish); vpOnboarderPager = (ViewPager) findViewById(R.id.vp_onboarder_pager); + vpOnboarderPager.addOnPageChangeListener(this); ibNext.setOnClickListener(this); btnSkip.setOnClickListener(this); btnFinish.setOnClickListener(this); + evaluator = new ArgbEvaluator(); } public void setOnboardPagesReady(List pages) { onboarderAdapter = new OnboarderAdapter(pages, getSupportFragmentManager()); vpOnboarderPager.setAdapter(onboarderAdapter); + setPageIndicators(pages.size()); + colors = ColorsArrayBuilder.getPageBackgroundColors(this, pages); + } + + public void setPageIndicators(int quantity) { + for (int i = 0; i < quantity; i++) { + llIndicators.addView(new CircleIndicatorView(this)); + } } public void setStatusBackgroundColor() { @@ -51,11 +72,31 @@ public void setStatusBackgroundColor() { public void onClick(View v) { int i = v.getId(); if (i == R.id.ib_next) { + vpOnboarderPager.setCurrentItem(vpOnboarderPager.getCurrentItem() + 1); } else if (i == R.id.btn_skip) { - } else if (i == R.id.btn_finish) { + vpOnboarderPager.setCurrentItem(onboarderAdapter.getCount()); + } + } + + @Override + public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { + if(position < (onboarderAdapter.getCount() - 1) && position < (colors.length - 1)) { + vpOnboarderPager.setBackgroundColor((Integer) evaluator.evaluate(positionOffset, colors[position], colors[position + 1])); } else { + vpOnboarderPager.setBackgroundColor(colors[colors.length - 1]); } } + @Override + public void onPageSelected(int position) { + int lastPagePosition = onboarderAdapter.getCount() - 1; + ibNext.setVisibility(position == lastPagePosition ? View.GONE : View.VISIBLE); + btnFinish.setVisibility(position == lastPagePosition ? View.VISIBLE : View.GONE); + } + + @Override + public void onPageScrollStateChanged(int state) { + + } } diff --git a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderFragment.java b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderFragment.java index 5ef3295..b581391 100644 --- a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderFragment.java +++ b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderFragment.java @@ -93,17 +93,14 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle sa } if (onboarderTitleColor != 0) { - Log.v("ONBOARD_TITLE_COLOR", String.valueOf(onboarderTitleColor)); tvOnboarderTitle.setTextColor(ContextCompat.getColor(getActivity(), onboarderTitleColor)); } if (onboarderDescriptionColor != 0) { - Log.v("ONBOARD_DESC_COLOR", String.valueOf(onboarderDescriptionColor)); tvOnboarderDescription.setTextColor(ContextCompat.getColor(getActivity(), onboarderDescriptionColor)); } if (onboarderImageResId != 0) { - Log.v("ONBOARD_IMAGE", String.valueOf(onboarderImageResId)); ivOnboarderImage.setImageDrawable(ContextCompat.getDrawable(getActivity(), onboarderImageResId)); } diff --git a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderPage.java b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderPage.java index 401584d..5e3371e 100644 --- a/onboarder/src/main/java/com/chyrta/onboarder/OnboarderPage.java +++ b/onboarder/src/main/java/com/chyrta/onboarder/OnboarderPage.java @@ -15,6 +15,7 @@ public class OnboarderPage { @DrawableRes public int imageResourceId; @ColorRes public int titleColor; @ColorRes public int descriptionColor; + @ColorRes public int backgroundColor; public OnboarderPage(String title, String description) { this.title = title; @@ -90,4 +91,11 @@ public int getImageResourceId() { return imageResourceId; } + public void setBackgroundColor(int backgroundColor) { + this.backgroundColor = backgroundColor; + } + + public int getBackgroundColor() { + return backgroundColor; + } } diff --git a/onboarder/src/main/java/com/chyrta/onboarder/utils/ColorsArrayBuilder.java b/onboarder/src/main/java/com/chyrta/onboarder/utils/ColorsArrayBuilder.java new file mode 100644 index 0000000..a827f32 --- /dev/null +++ b/onboarder/src/main/java/com/chyrta/onboarder/utils/ColorsArrayBuilder.java @@ -0,0 +1,21 @@ +package com.chyrta.onboarder.utils; + +import android.content.Context; +import android.support.v4.content.ContextCompat; + +import com.chyrta.onboarder.OnboarderPage; + +import java.util.ArrayList; +import java.util.List; + +public class ColorsArrayBuilder { + + public static Integer[] getPageBackgroundColors(Context context, List pages) { + List colorsList = new ArrayList<>(); + for (OnboarderPage page : pages) { + colorsList.add(ContextCompat.getColor(context, page.getBackgroundColor())); + } + return colorsList.toArray(new Integer[pages.size()]); + } + +} diff --git a/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java b/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java new file mode 100644 index 0000000..56b8eee --- /dev/null +++ b/onboarder/src/main/java/com/chyrta/onboarder/views/CircleIndicatorView.java @@ -0,0 +1,37 @@ +package com.chyrta.onboarder.views; + +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.drawable.shapes.OvalShape; +import android.view.View; +import android.view.ViewGroup; + +public class CircleIndicatorView extends View { + + OvalShape oval; + + public CircleIndicatorView(Context context) { + super(context); + Canvas canvas = new Canvas(); + Paint paint = new Paint(); + oval = new OvalShape(); + oval.draw(canvas, paint); + } + + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + canvas.drawColor(Color.WHITE); + } + + @Override + public void setLayoutParams(ViewGroup.LayoutParams params) { + super.setLayoutParams(params); + params.height = 8; + params.width = 8; + } + + +} diff --git a/onboarder/src/main/res/layout/activity_onboarder.xml b/onboarder/src/main/res/layout/activity_onboarder.xml index 78901f5..aaf9cf4 100644 --- a/onboarder/src/main/res/layout/activity_onboarder.xml +++ b/onboarder/src/main/res/layout/activity_onboarder.xml @@ -1,8 +1,10 @@ - + android:layout_height="match_parent" + tools:context=".OnboarderActivity"> + android:layout_marginBottom="?attr/actionBarSize" + android:alpha="0.12" + android:background="@android:color/white"/> + android:paddingEnd="@dimen/activity_margin" + android:paddingLeft="@dimen/activity_margin" + android:paddingRight="@dimen/activity_margin" + android:paddingStart="@dimen/activity_margin"> +