From bbc8a35899c0f4d5a6254ab9d2c6d892f48d1662 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=A1vio=20Faria?= Date: Sat, 18 Oct 2014 17:00:12 -0300 Subject: [PATCH] Let flavioarfaria/KenBurnsView do the image animation. --- App/build.gradle | 1 + .../notboringactionbar/KenBurnsView.java | 149 ------------------ .../NoBoringActionBarActivity.java | 58 ++++++- .../res/layout/activity_noboringactionbar.xml | 19 ++- App/src/main/res/layout/view_kenburns.xml | 18 --- 5 files changed, 71 insertions(+), 174 deletions(-) delete mode 100644 App/src/main/java/com/flavienlaurent/notboringactionbar/KenBurnsView.java delete mode 100644 App/src/main/res/layout/view_kenburns.xml diff --git a/App/build.gradle b/App/build.gradle index 9c426e5..851e363 100644 --- a/App/build.gradle +++ b/App/build.gradle @@ -35,4 +35,5 @@ android { dependencies { compile 'com.android.support:support-v4:19.1.0' + compile 'com.flaviofaria:kenburnsview:1.0.4' } diff --git a/App/src/main/java/com/flavienlaurent/notboringactionbar/KenBurnsView.java b/App/src/main/java/com/flavienlaurent/notboringactionbar/KenBurnsView.java deleted file mode 100644 index 5ce04a5..0000000 --- a/App/src/main/java/com/flavienlaurent/notboringactionbar/KenBurnsView.java +++ /dev/null @@ -1,149 +0,0 @@ -package com.flavienlaurent.notboringactionbar; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.AnimatorSet; -import android.animation.ObjectAnimator; -import android.content.Context; -import android.os.Handler; -import android.util.AttributeSet; -import android.util.Log; -import android.view.View; -import android.view.ViewPropertyAnimator; -import android.widget.FrameLayout; -import android.widget.ImageView; - -import java.util.Random; - -/** - * Created by f.laurent on 21/11/13. - */ -public class KenBurnsView extends FrameLayout { - - private static final String TAG = "KenBurnsView"; - - private final Handler mHandler; - private int[] mResourceIds; - private ImageView[] mImageViews; - private int mActiveImageIndex = -1; - - private final Random random = new Random(); - private int mSwapMs = 10000; - private int mFadeInOutMs = 400; - - private float maxScaleFactor = 1.5F; - private float minScaleFactor = 1.2F; - - private Runnable mSwapImageRunnable = new Runnable() { - @Override - public void run() { - swapImage(); - mHandler.postDelayed(mSwapImageRunnable, mSwapMs - mFadeInOutMs*2); - } - }; - - public KenBurnsView(Context context) { - this(context, null); - } - - public KenBurnsView(Context context, AttributeSet attrs) { - this(context, attrs, 0); - } - - public KenBurnsView(Context context, AttributeSet attrs, int defStyle) { - super(context, attrs, defStyle); - mHandler = new Handler(); - } - - public void setResourceIds(int... resourceIds) { - mResourceIds = resourceIds; - fillImageViews(); - } - - private void swapImage() { - Log.d(TAG, "swapImage active=" + mActiveImageIndex); - if(mActiveImageIndex == -1) { - mActiveImageIndex = 1; - animate(mImageViews[mActiveImageIndex]); - return; - } - - int inactiveIndex = mActiveImageIndex; - mActiveImageIndex = (1 + mActiveImageIndex) % mImageViews.length; - Log.d(TAG, "new active=" + mActiveImageIndex); - - final ImageView activeImageView = mImageViews[mActiveImageIndex]; - activeImageView.setAlpha(0.0f); - ImageView inactiveImageView = mImageViews[inactiveIndex]; - - animate(activeImageView); - - AnimatorSet animatorSet = new AnimatorSet(); - animatorSet.setDuration(mFadeInOutMs); - animatorSet.playTogether( - ObjectAnimator.ofFloat(inactiveImageView, "alpha", 1.0f, 0.0f), - ObjectAnimator.ofFloat(activeImageView, "alpha", 0.0f, 1.0f) - ); - animatorSet.start(); - } - - private void start(View view, long duration, float fromScale, float toScale, float fromTranslationX, float fromTranslationY, float toTranslationX, float toTranslationY) { - view.setScaleX(fromScale); - view.setScaleY(fromScale); - view.setTranslationX(fromTranslationX); - view.setTranslationY(fromTranslationY); - ViewPropertyAnimator propertyAnimator = view.animate().translationX(toTranslationX).translationY(toTranslationY).scaleX(toScale).scaleY(toScale).setDuration(duration); - propertyAnimator.start(); - Log.d(TAG, "starting Ken Burns animation " + propertyAnimator); - } - - private float pickScale() { - return this.minScaleFactor + this.random.nextFloat() * (this.maxScaleFactor - this.minScaleFactor); - } - - private float pickTranslation(int value, float ratio) { - return value * (ratio - 1.0f) * (this.random.nextFloat() - 0.5f); - } - - public void animate(View view) { - float fromScale = pickScale(); - float toScale = pickScale(); - float fromTranslationX = pickTranslation(view.getWidth(), fromScale); - float fromTranslationY = pickTranslation(view.getHeight(), fromScale); - float toTranslationX = pickTranslation(view.getWidth(), toScale); - float toTranslationY = pickTranslation(view.getHeight(), toScale); - start(view, this.mSwapMs, fromScale, toScale, fromTranslationX, fromTranslationY, toTranslationX, toTranslationY); - } - - @Override - protected void onAttachedToWindow() { - super.onAttachedToWindow(); - startKenBurnsAnimation(); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - mHandler.removeCallbacks(mSwapImageRunnable); - } - - private void startKenBurnsAnimation() { - mHandler.post(mSwapImageRunnable); - } - - @Override - protected void onFinishInflate() { - super.onFinishInflate(); - View view = inflate(getContext(), R.layout.view_kenburns, this); - - mImageViews = new ImageView[2]; - mImageViews[0] = (ImageView) view.findViewById(R.id.image0); - mImageViews[1] = (ImageView) view.findViewById(R.id.image1); - } - - private void fillImageViews() { - for (int i = 0; i < mImageViews.length; i++) { - mImageViews[i].setImageResource(mResourceIds[i]); - } - } -} diff --git a/App/src/main/java/com/flavienlaurent/notboringactionbar/NoBoringActionBarActivity.java b/App/src/main/java/com/flavienlaurent/notboringactionbar/NoBoringActionBarActivity.java index 9b1af95..8fd90d7 100644 --- a/App/src/main/java/com/flavienlaurent/notboringactionbar/NoBoringActionBarActivity.java +++ b/App/src/main/java/com/flavienlaurent/notboringactionbar/NoBoringActionBarActivity.java @@ -1,5 +1,6 @@ package com.flavienlaurent.notboringactionbar; +import android.animation.LayoutTransition; import android.app.ActionBar; import android.app.Activity; import android.content.Context; @@ -7,6 +8,7 @@ import android.content.res.TypedArray; import android.graphics.Color; import android.graphics.RectF; +import android.graphics.drawable.Drawable; import android.os.Bundle; import android.text.Spannable; import android.text.SpannableString; @@ -14,16 +16,29 @@ import android.text.style.TypefaceSpan; import android.util.TypedValue; import android.view.View; +import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.AbsListView; import android.widget.ArrayAdapter; import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; +import android.widget.ViewSwitcher; + +import com.flaviofaria.kenburnsview.KenBurnsView; +import com.flaviofaria.kenburnsview.KenBurnsView.TransitionListener; +import com.flaviofaria.kenburnsview.Transition; import java.util.ArrayList; -public class NoBoringActionBarActivity extends Activity { +public class NoBoringActionBarActivity extends Activity implements TransitionListener { + + private static final int TRANSITIONS_TO_SWITCH = 3; + + private static final int[] PICTURE_RES_IDS = { + R.drawable.picture0, + R.drawable.picture1 + }; private static final String TAG = "NoBoringActionBarActivity"; private int mActionBarTitleColor; @@ -31,7 +46,9 @@ public class NoBoringActionBarActivity extends Activity { private int mHeaderHeight; private int mMinHeaderTranslation; private ListView mListView; - private KenBurnsView mHeaderPicture; + private ViewSwitcher mPictureSwitcher; + private KenBurnsView mPicture0; + private KenBurnsView mPicture1; private ImageView mHeaderLogo; private View mHeader; private View mPlaceHolderView; @@ -40,6 +57,9 @@ public class NoBoringActionBarActivity extends Activity { private RectF mRect1 = new RectF(); private RectF mRect2 = new RectF(); + private int mTransitionsCount = 0; + private int mCurrentPictureIndex = 0; + private AlphaForegroundColorSpan mAlphaForegroundColorSpan; private SpannableString mSpannableString; @@ -57,8 +77,12 @@ protected void onCreate(Bundle savedInstanceState) { mListView = (ListView) findViewById(R.id.listview); mHeader = findViewById(R.id.header); - mHeaderPicture = (KenBurnsView) findViewById(R.id.header_picture); - mHeaderPicture.setResourceIds(R.drawable.picture0, R.drawable.picture1); + mPictureSwitcher = (ViewSwitcher) findViewById(R.id.header_switcher); + mPicture0 = (KenBurnsView) findViewById(R.id.picture0); + mPicture0.setTransitionListener(this); + mPicture1 = (KenBurnsView) findViewById(R.id.picture1); + mPicture1.setTransitionListener(this); + swapPicture(); mHeaderLogo = (ImageView) findViewById(R.id.header_logo); mActionBarTitleColor = getResources().getColor(R.color.actionbar_title_color); @@ -70,6 +94,7 @@ protected void onCreate(Bundle savedInstanceState) { setupListView(); } + private void setupListView() { ArrayList FAKES = new ArrayList(); for (int i = 0; i < 1000; i++) { @@ -171,4 +196,29 @@ public int getActionBarHeight() { mActionBarHeight = TypedValue.complexToDimensionPixelSize(mTypedValue.data, getResources().getDisplayMetrics()); return mActionBarHeight; } + + + @Override + public void onTransitionStart(Transition transition) { + + } + + + @Override + public void onTransitionEnd(Transition transition) { + mTransitionsCount++; + if (mTransitionsCount == TRANSITIONS_TO_SWITCH) { + swapPicture(); + mTransitionsCount = 0; + } + } + + + private void swapPicture() { + KenBurnsView kenBurnsView = (KenBurnsView) mPictureSwitcher.getNextView(); + mCurrentPictureIndex = (mCurrentPictureIndex + 1) % PICTURE_RES_IDS.length; + int drawableResId = PICTURE_RES_IDS[mCurrentPictureIndex]; + kenBurnsView.setImageResource(drawableResId); + mPictureSwitcher.showNext(); + } } diff --git a/App/src/main/res/layout/activity_noboringactionbar.xml b/App/src/main/res/layout/activity_noboringactionbar.xml index 87aa2b4..cdd52d1 100644 --- a/App/src/main/res/layout/activity_noboringactionbar.xml +++ b/App/src/main/res/layout/activity_noboringactionbar.xml @@ -17,11 +17,24 @@ android:layout_width="match_parent" android:layout_height="@dimen/header_height"> - + android:inAnimation="@android:anim/fade_in" + android:outAnimation="@android:anim/fade_out"> + + + + + + - - - - - - - \ No newline at end of file