package com.duckduckgo.mobile.android.util;
import android.graphics.Color;
import android.os.Build;
import android.support.annotation.ColorInt;
import android.support.annotation.FloatRange;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.duckduckgo.mobile.android.R;
import com.duckduckgo.mobile.android.adapters.OnboardingPageAdapter;
import com.duckduckgo.mobile.android.views.pageindicator.OnboardingPageIndicator;
import java.util.List;
/**
* Created by fgei on 4/4/17.
*/
public class OnboardingTransformer implements ViewPager.PageTransformer {
private OnboardingPageAdapter onboardingPageAdapter;
private OnboardingPageIndicator pageIndicator;
private List<View> fadeViews;
public OnboardingTransformer(OnboardingPageAdapter onboardingPageAdapter, OnboardingPageIndicator pageIndicator, List<View> fadeViews) {
this.onboardingPageAdapter = onboardingPageAdapter;
this.pageIndicator = pageIndicator;
this.fadeViews = fadeViews;
}
@Override
public void transformPage(View page, float position) {
final View image = page.findViewById(R.id.icon_image_view);
final float absolutePosition = Math.abs(position);
int pageIndex = (Integer) page.getTag();
if(position >= -1.0 && position <= 1.0) {
if(position > 0) {
int leftColor = onboardingPageAdapter.getBackgroundColor(pageIndex - 1);
int rightColor = onboardingPageAdapter.getBackgroundColor(pageIndex);
int color = blendARGB(rightColor, leftColor, position);
page.setBackgroundColor(color);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
image.setScaleX(1 - absolutePosition);
image.setScaleY(1 - absolutePosition);
if(pageIndex == (onboardingPageAdapter.getCount() - 1)) {
for(View v : fadeViews) {
v.setAlpha(absolutePosition);
}
}
}
pageIndicator.setPositionSelected(pageIndex - 1, 1 - absolutePosition);
pageIndicator.setPositionSelected(pageIndex, absolutePosition);
} else if(position < 0) {
int nextIndex = pageIndex + 1;
int leftColor = onboardingPageAdapter.getBackgroundColor(pageIndex);
int rightColor = onboardingPageAdapter.getBackgroundColor(nextIndex);
int color = blendARGB(rightColor, leftColor, 1 - absolutePosition);
page.setBackgroundColor(color);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
image.setScaleX(1 - absolutePosition);
image.setScaleY(1 - absolutePosition);
if(nextIndex == (onboardingPageAdapter.getCount() - 1)) {
for(View v : fadeViews) {
v.setAlpha(1 - absolutePosition);
}
}
}
pageIndicator.setPositionSelected(pageIndex, absolutePosition);
pageIndicator.setPositionSelected(pageIndex + 1, 1 - absolutePosition);
} else {
page.setBackgroundColor(onboardingPageAdapter.getBackgroundColor(pageIndex));
}
} else {
page.setBackgroundColor(onboardingPageAdapter.getBackgroundColor(pageIndex));
}
}
public static int blendARGB(@ColorInt int color1, @ColorInt int color2,
@FloatRange(from = 0.0, to = 1.0) float ratio) {
final float inverseRatio = 1 - ratio;
float a = Color.alpha(color1) * inverseRatio + Color.alpha(color2) * ratio;
float r = Color.red(color1) * inverseRatio + Color.red(color2) * ratio;
float g = Color.green(color1) * inverseRatio + Color.green(color2) * ratio;
float b = Color.blue(color1) * inverseRatio + Color.blue(color2) * ratio;
return Color.argb((int) a, (int) r, (int) g, (int) b);
}
}