package com.luciofm.droidcon.ifican.fragment;
import android.animation.Animator;
import android.animation.ObjectAnimator;
import android.app.Fragment;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.os.AsyncTask;
import android.os.Bundle;
import android.transition.ChangeBounds;
import android.transition.ChangeTransform;
import android.transition.CircularPropagation;
import android.transition.Scene;
import android.transition.SidePropagation;
import android.transition.Slide;
import android.transition.Transition;
import android.transition.TransitionManager;
import android.transition.TransitionSet;
import android.transition.TransitionValues;
import android.transition.VisibilityPropagation;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.DecelerateInterpolator;
import android.widget.ImageView;
import com.luciofm.droidcon.ifican.R;
import com.luciofm.droidcon.ifican.activity.MainActivity;
import com.luciofm.droidcon.ifican.anim.AnimUtils;
import com.luciofm.droidcon.ifican.anim.XFractionProperty;
import butterknife.ButterKnife;
import butterknife.InjectView;
import butterknife.OnClick;
/**
* A simple {@link Fragment} subclass.
*
*/
public class MyselfFragment extends BaseFragment {
@InjectView(R.id.container)
ViewGroup container;
ImageView image;
Bitmap originalBitmap;
Scene scene1;
Scene scene2;
TransitionSet set;
BitmapDrawable drawable;
public MyselfFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
originalBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.me);
set = new TransitionSet();
set.setOrdering(TransitionSet.ORDERING_TOGETHER);
Slide slide = new Slide();
slide.setSlideEdge(Gravity.LEFT);
slide.setPropagation(new CircularPropagation() {
@Override
public long getStartDelay(ViewGroup sceneRoot, Transition transition, TransitionValues startValues, TransitionValues endValues) {
long delay = super.getStartDelay(sceneRoot, transition, startValues, endValues);
return delay * 8;
}
});
slide.setEpicenterCallback(new Transition.EpicenterCallback() {
@Override
public Rect onGetEpicenter(Transition transition) {
int[] loc = new int[2];
container.getLocationOnScreen(loc);
return new Rect((container.getWidth() / 2) - 40, loc[1], (container.getWidth() / 2) + 40, loc[1] + 40);
}
});
set.addTransition(new ChangeTransform()).addTransition(new ChangeBounds()).addTransition(slide);
}
@Override
public int getLayout() {
return R.layout.fragment_myself;
}
@Override
public String getMessage() {
return "Introduce myself, coming from Brasil, developing Android full time since 2010, before that, low level system programming, Linux, C, Daemons, Kernel modules, etc.\n" +
"Contact information, bla bla";
}
@Override
public View onCreateView(LayoutInflater inflater, final ViewGroup parent,
Bundle savedInstanceState) {
View v = super.onCreateView(inflater, parent, savedInstanceState);
ButterKnife.inject(this, v);
currentStep = 1;
scene1 = Scene.getSceneForLayout(container, R.layout.scene_myself_1, getActivity());
scene2 = Scene.getSceneForLayout(container, R.layout.scene_myself_2, getActivity());
scene1.setEnterAction(new Runnable() {
@Override
public void run() {
image = (ImageView) container.findViewById(R.id.image);
container.postOnAnimationDelayed(new Runnable() {
@Override
public void run() {
if (!isResumed())
return;
image = (ImageView) container.findViewById(R.id.image);
image.animate().alpha(1f).setDuration(300);
ObjectAnimator pixelate = ObjectAnimator.ofInt(MyselfFragment.this, "pixelateFactor", 100, 0);
pixelate.setDuration(1200);
pixelate.setInterpolator(new DecelerateInterpolator());
pixelate.start();
}
}, 600);
}
});
scene2.setEnterAction(new Runnable() {
@Override
public void run() {
image = (ImageView) container.findViewById(R.id.image);
image.setImageDrawable(drawable);
}
});
scene1.enter();
return v;
}
@Override
public void onNextPressed() {
switch (++currentStep) {
case 2:
TransitionManager.go(scene2, set);
break;
default:
((MainActivity) getActivity()).nextFragment();
}
}
@OnClick(R.id.container)
public void onClick() {
onNextPressed();
}
@Override
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim) {
if (transit == 0) {
return null;
}
//Target will be filled in by the framework
return enter ? ObjectAnimator.ofFloat(null, new XFractionProperty(), 1f, 0f) :
null;
}
final private static float PROGRESS_TO_PIXELIZATION_FACTOR = 1000.0f;
public void setPixelateFactor(int number) {
float factor = number / PROGRESS_TO_PIXELIZATION_FACTOR;
PixelizeImageAsyncTask asyncPixelateTask = new PixelizeImageAsyncTask();
asyncPixelateTask.execute(factor, originalBitmap);
}
/**
* Implementation of the AsyncTask class showing how to run the
* pixelization algorithm in the background, and retrieving the
* pixelated image from the resulting operation.
*/
private class PixelizeImageAsyncTask extends AsyncTask<Object, Void, BitmapDrawable> {
@Override
protected BitmapDrawable doInBackground(Object... params) {
if (!isResumed())
return null;
float pixelizationFactor = (Float)params[0];
Bitmap originalBitmap = (Bitmap)params[1];
return AnimUtils.builtInPixelization(getActivity(), pixelizationFactor, originalBitmap);
}
@Override
protected void onPostExecute(BitmapDrawable result) {
if (isResumed() && result != null)
image.setImageDrawable(result);
drawable = result;
}
}
}