package com.luciofm.droidcon.ifican.fragment; import android.animation.Animator; import android.animation.ObjectAnimator; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.TextView; import com.luciofm.droidcon.ifican.R; import com.luciofm.droidcon.ifican.anim.XFractionProperty; import com.luciofm.droidcon.ifican.anim.YFractionProperty; import com.luciofm.droidcon.ifican.util.Utils; import com.luciofm.droidcon.ifican.widget.SquareGridLayout; import java.io.IOException; import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import pl.droidsonroids.gif.GifDrawable; import pl.droidsonroids.gif.GifImageView; public class FeedbackFragment extends BaseFragment { @InjectView(R.id.container) ViewGroup container; @InjectView(R.id.container2) SquareGridLayout container2; @InjectView(R.id.text1) TextView text1; GifImageView gif1; GifImageView gif2; GifImageView gif3; GifImageView gif4; @InjectView(R.id.gif5) GifImageView gif5; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } @Override public int getLayout() { return R.layout.fragment_feedback; } @Override public String getMessage() { return "Feedback… always give feedback to the user..."; } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View v = super.onCreateView(inflater, container, savedInstanceState); ButterKnife.inject(this, v); currentStep = 1; //text2.setText(Html.fromHtml(IOUtils.readFile(getActivity(), "source/touch_anim.xml.html"))); return v; } @Override public void onNextPressed() { try { GifDrawable gifFromResource; GifImageView gif = new GifImageView(getActivity()); gif.setOnClickListener(clickListener); ViewGroup.LayoutParams params = new SquareGridLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, getResources().getDimensionPixelSize(R.dimen.grid_heiht)); switch (++currentStep) { case 2: text1.animate().scaleY(0.6f).scaleX(0.6f); container2.setVisibility(View.VISIBLE); gifFromResource = new GifDrawable(getResources(), R.drawable.feedback1); gif.setImageDrawable(gifFromResource); gifFromResource.start(); gif1 = gif; container2.addView(gif1, 0, params); break; case 3: gif2 = gif; Utils.stopGif(gif1); gifFromResource = new GifDrawable(getResources(), R.drawable.feedback2); gif.setImageDrawable(gifFromResource); gifFromResource.start(); container2.addView(gif2, 0, params); break; case 4: gif3 = gif; Utils.stopGif(gif2); gifFromResource = new GifDrawable(getResources(), R.drawable.feedback3); gif.setImageDrawable(gifFromResource); gifFromResource.start(); container2.addView(gif3, 0, params); break; case 5: gif4 = gif; Utils.stopGif(gif3); gifFromResource = new GifDrawable(getResources(), R.drawable.feedback4); gif.setImageDrawable(gifFromResource); gifFromResource.start(); container2.addView(gif4, 0, params); break; case 6: animateOut(); /*container2.setVisibility(View.GONE); gif5.setVisibility(View.VISIBLE);*/ break; case 7: container2.removeAllViews(); super.onNextPressed(); } } catch (IOException e) { e.printStackTrace(); } } private void animateOut() { container.getOverlay().add(gif1); container.getOverlay().add(gif2); container.getOverlay().add(gif3); container.getOverlay().add(gif4); int[] p = new int[2]; gif4.getLocationOnScreen(p); gif4.animate().translationX(-(p[0] + gif4.getWidth())).translationY(-(p[1] + gif4.getHeight())); gif3.getLocationOnScreen(p); gif3.animate().translationX(p[0] + gif3.getWidth()).translationY(-(p[1] + gif3.getHeight())); gif2.getLocationOnScreen(p); gif2.animate().translationX(-(p[0] + gif2.getWidth())).translationY((p[1] + gif2.getHeight())); gif1.getLocationOnScreen(p); gif1.animate().translationX(p[0] + gif1.getWidth()) .translationY(p[1] + gif1.getHeight()).withEndAction(new Runnable() { @Override public void run() { if (!isAdded() || isDetached() || isRemoving() || !isResumed() || !isVisible()) return; container2.setVisibility(View.GONE); container2.removeAllViews(); gif5.setVisibility(View.VISIBLE); container.getOverlay().remove(gif1); container.getOverlay().remove(gif2); container.getOverlay().remove(gif3); container.getOverlay().remove(gif4); container2.addView(gif1, 0); container2.addView(gif2, 0); container2.addView(gif3, 0); container2.addView(gif4, 0); } }); } @Override public void onPrevPressed() { if (--currentStep > 0) { int position = container2.getChildCount() - 1; GifImageView gif = null; if (position >= 0) gif = (GifImageView) container2.getChildAt(position); /* UGLY HACK to hide last example */ if (currentStep == 5) position = 5; switch (position) { case 0: Utils.stopGif(gif); container2.setVisibility(View.GONE); text1.animate().scaleY(1f).scaleX(1f); container2.removeViewAt(0); break; case 1: Utils.stopGif(gif); container2.removeViewAt(0); Utils.startGif((GifImageView) container2.getChildAt(position - 1)); break; case 2: Utils.stopGif(gif); container2.removeViewAt(0); Utils.startGif((GifImageView) container2.getChildAt(position - 1)); break; case 3: Utils.stopGif(gif); container2.removeViewAt(0); Utils.startGif((GifImageView) container2.getChildAt(position - 1)); break; case 5: /*gif5.setVisibility(View.GONE); container2.setVisibility(View.VISIBLE); currentStep = 1;*/ animateBack(gif); break; } return; } super.onPrevPressed(); } private void animateBack(final GifImageView gif) { gif5.setVisibility(View.GONE); container2.setVisibility(View.VISIBLE); gif1.animate().translationX(0f).translationY(0f); gif2.animate().translationX(0f).translationY(0f); gif3.animate().translationX(0f).translationY(0f); gif4.animate().translationX(0f).translationY(0f).withEndAction(new Runnable() { @Override public void run() { if (gif != null) Utils.startGif(gif); } }); } @OnClick(R.id.container) public void onClick() { onNextPressed(); } View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { GifDrawable drawable = (GifDrawable) ((GifImageView) v).getDrawable(); if (drawable.isPlaying()) drawable.stop(); else drawable.start(); } }; @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) : ObjectAnimator.ofFloat(null, new YFractionProperty(), 0f, -1f); } }