/* * ****************************************************************************** * Copyright (c) 2013-2014 Gabriele Mariotti. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ***************************************************************************** */ package it.gmariotti.cardslib.library.internal.overflowanimation; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.AnimatorSet; import android.animation.ObjectAnimator; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import it.gmariotti.cardslib.library.R; import it.gmariotti.cardslib.library.internal.Card; /** * Simple implementation with only 2 card (the original and the overlay) * * @author Gabriele Mariotti (gabri.mariotti@gmail.com) */ public abstract class TwoCardOverlayAnimation extends BaseCardOverlayAnimation { // ------------------------------------------------------------- // Constructors // ------------------------------------------------------------- public TwoCardOverlayAnimation(Context context, Card card) { super(context,card); } /** * */ public abstract class TwoCardToAnimate extends CardInfoToAnimate{ @Override public int[] getLayoutsIdToAdd() { int[] layouts= new int[1]; layouts[0]=getLayoutIdToAdd(); return layouts; } public abstract int getLayoutIdToAdd(); } // ------------------------------------------------------------- // Animation // ------------------------------------------------------------- @Override protected void doOverFirstAnimation(final Card card, CardInfoToAnimate infoAnimation, View imageOverflow) { if (infoAnimation==null) return; final ViewGroup mInternalLayoutOverlay = (ViewGroup)card.getCardView().findViewById(R.id.card_overlap); //Checks if (mInternalLayoutOverlay==null){ Log.e(TAG, "Overlap layout not found!"); return; } if (infoAnimation.getLayoutsIdToAdd()==null){ Log.e(TAG,"You have to specify layouts to add!"); return; } //Views to remove View[] viewsOut= getOutViews(card,infoAnimation); //Get the layout to add final int layoutIdIn= infoAnimation.getLayoutsIdToAdd()[0]; AnimatorSet animAlpha = new AnimatorSet(); if (viewsOut != null && layoutIdIn > 0) { ArrayList<Animator> animators= new ArrayList<Animator>(); for (final View viewOut:viewsOut){ if (viewOut!=null){ ObjectAnimator anim = ObjectAnimator.ofFloat(viewOut, "alpha", 1f, 0f); anim.setDuration(getAnimationDuration()); anim.addListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { viewOut.setVisibility(View.GONE); } }); animators.add(anim); } } animAlpha.playTogether(animators); } animAlpha.addListener(new AnimatorListenerAdapter(){ @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); View viewIn= inflater.inflate(layoutIdIn,mInternalLayoutOverlay,false); if (viewIn!=null){ if (card.getCardView()!=null && card.getCardView().getInternalMainCardLayout()!=null && card.getCardView().getInternalHeaderLayout()!=null && card.getCardView().getInternalHeaderLayout().getFrameButton()!=null){ int h1=card.getCardView().getInternalMainCardLayout().getMeasuredHeight(); int h2=card.getCardView().getInternalHeaderLayout().getFrameButton().getMeasuredHeight(); viewIn.setMinimumHeight(h1-h2); } mInternalLayoutOverlay.addView(viewIn); viewIn.setAlpha(0); viewIn.setVisibility(View.VISIBLE); viewIn.animate() .alpha(1f) .setDuration(getAnimationDuration()) .setListener(null); } } }); animAlpha.start(); } @Override protected void doOverOtherAnimation(final Card card, CardInfoToAnimate infoAnimation, View imageOverflow) { //Checks if (infoAnimation == null) return; final ViewGroup mInternalLayoutOverlay = (ViewGroup) card.getCardView().findViewById(R.id.card_overlap); if (mInternalLayoutOverlay == null) { Log.e(TAG, "Overlap layout not found!"); return; } if (infoAnimation.getLayoutsIdToAdd() == null) { Log.e(TAG, "You have to specify layouts to add!"); return; } final View[] viewsLastOut = getOutViews(card, infoAnimation); //int layoutIdIn= infoAnimation.getLayoutsIdToAdd()[0]; final View viewLastIn = mInternalLayoutOverlay.getChildAt(0); //final View viewIn = card.getCardView().findViewById(R.id.afterContent); //Views to remove final View[] viewsFirstOut = getOutViews(card, infoAnimation); if (viewLastIn != null) { viewLastIn.animate() .alpha(0f) .setDuration(getAnimationDuration()) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationEnd(Animator animation) { viewLastIn.setVisibility(View.GONE); for (final View viewOut : viewsLastOut) { if (viewOut != null) { viewOut.setVisibility(View.VISIBLE); } } if (mInternalLayoutOverlay != null) { mInternalLayoutOverlay.removeView(viewLastIn); } for (final View viewOut : viewsLastOut) { if (viewOut != null) { viewOut.animate() .alpha(1f) .setDuration(getAnimationDuration()); } } } }); } } protected View[] getOutViews(Card card,CardInfoToAnimate infoAnimation){ //Views to remove View[] viewsOut=null; if (infoAnimation.mLayoutsIdToRemove!=null){ viewsOut = new View[infoAnimation.mLayoutsIdToRemove.length]; int i=0; for (int layoutIdOut:infoAnimation.mLayoutsIdToRemove){ View viewOut =card.getCardView().findViewById(layoutIdOut); viewsOut[i]=viewOut; i++; } } return viewsOut; } // ------------------------------------------------------------- // Getters and Setters // ------------------------------------------------------------- /** * Returns the animation duration * * @return */ protected int getAnimationDuration() { return mAnimationDuration = mContext.getResources().getInteger( android.R.integer.config_shortAnimTime); } }