Android Open Source - FootyNews Effects Controller






From Project

Back to project page FootyNews.

License

The source code is released under:

MIT License

If you think the Android project FootyNews listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.

Java Source Code

/*******************************************************************************
 * Copyright 2013 Steven Rudenko//w w  w  .  j a  v  a2 s .  co m
 * 
 * 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 shared.ui.actionscontentview;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Matrix;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.Animation;
import android.view.animation.AnimationSet;
import android.view.animation.AnimationUtils;
import android.view.animation.Transformation;

class EffectsController {
  private static final String TAG = EffectsController.class.getSimpleName();
  private static final boolean DEBUG = false;

  private static final Method APPLY_TRANSFORMATION;

  public static final int EFFECT_OPEN = 0;
  public static final int EFFECT_CLOSE = 1;

  private static final int EFFECTS_COUNT = 2;

  static {
    APPLY_TRANSFORMATION = getApplyTransformation();
  }

  private final Transformation mTransformation = new Transformation();
  private final Matrix mMatrix = new Matrix();
  private float mEffectsAlpha = 1f;

  private final Effect[] mEffects = new Effect[EFFECTS_COUNT];

  public void setEffects(Context context, int resId) {
    final String resourceType = context.getResources().getResourceTypeName(resId);

    if ( !resourceType.equals("array") ) {
      final Animation anim = AnimationUtils.loadAnimation(context, resId);
      setEffects(anim);
      return;
    }

    final TypedArray effects = context.getResources().obtainTypedArray(resId);

    final int count = effects.length();
    final int size = Math.min(EFFECTS_COUNT, count);
    for ( int i=0; i<size; ++i ) {
      final int id = effects.getResourceId(i, -1);
      if (id > 0) {
        final Animation anim = AnimationUtils.loadAnimation(context, id);
        mEffects[i] = new Effect(anim);
      }
    }
    effects.recycle();
  }

  public void setEffects(Animation animation) {
    mEffects[0] = mEffects[1] = new Effect(animation);
  }

  public Effect[] getEffects() {
    return mEffects;
  }

  public void initialize(View v) {
    if ( mEffects == null )
      return;

    final ViewGroup parent = (ViewGroup) v.getParent();
    if ( parent != null ) {
      for ( Effect effect : mEffects ) {
        if ( effect == null )
          continue;
        effect.anim.initialize(v.getWidth(), v.getHeight(), parent.getWidth(), parent.getHeight());
      }
    }
  }

  public Matrix getEffectsMatrix() {
    return mMatrix;
  }

  public float getEffectsAlpha() {
    return mEffectsAlpha;
  }

  public void reset() {
    mMatrix.reset();
    mEffectsAlpha = 1f;
  }

  public boolean apply(float factor, int effectType) {
    if (mEffects == null)
      return false;

    reset();

    final Effect effect = mEffects[effectType];
    if ( effect == null )
      return false;

    final Animation anim = effect.anim;
    final long totalTime = effect.totalTime;

    if (anim instanceof AnimationSet) {
      return apply(factor, (AnimationSet) anim, totalTime);
    } else {
      return apply(factor, anim, totalTime);
    }
  }

  private boolean apply(float factor, Animation animation, long totalTime) {
    final float animationFactor;

    final long animationDuration = animation.getDuration();
    if (animationDuration == 0 || totalTime == 0) {
      animationFactor = factor;
    } else {
      final long effectTime = (int) (totalTime * factor);

      final long animationStartOffset = animation.getStartOffset();
      final long animationEndTime = animationStartOffset + animationDuration;

      if (effectTime < animationStartOffset || effectTime > animationEndTime)
        return true;

      animationFactor = (float)(effectTime - animationStartOffset) / (float)animationDuration;
    }

    try {
      // we need reset transformation for every animation
      mTransformation.clear();

      final float interpolatedFactor = animation.getInterpolator().getInterpolation(animationFactor);
      APPLY_TRANSFORMATION.invoke(animation, interpolatedFactor, mTransformation);
      if ((mTransformation.getTransformationType() & Transformation.TYPE_MATRIX) == Transformation.TYPE_MATRIX)
        mMatrix.postConcat(mTransformation.getMatrix());
      if ((mTransformation.getTransformationType() & Transformation.TYPE_ALPHA) == Transformation.TYPE_ALPHA)
        mEffectsAlpha *= mTransformation.getAlpha();

      if (DEBUG) {
        Log.d(TAG, "Transformation: " + animation);
        Log.d(TAG, " - " + mTransformation.toShortString());
      }

      return true;
    } catch (IllegalArgumentException e) {
      // we don't care because this exception should never happen
    } catch (IllegalAccessException e) {
      // we don't care because this exception should never happen
    } catch (InvocationTargetException e) {
      // we don't care because this exception should never happen
    }
    return false;
  }

  private boolean apply(float factor, AnimationSet set, long totalTime) {
    final List<Animation> animations = set.getAnimations();
    for (Animation a : animations) {
      if (a instanceof AnimationSet) {
        if (!apply(factor, (AnimationSet) a, totalTime))
          return false;
      } else {
        if (!apply(factor, a, totalTime))
          return false;
      }
    }
    return true;
  }

  private static Method getApplyTransformation() {
    try {
      final Method m = Animation.class.getDeclaredMethod("applyTransformation", float.class, Transformation.class);
      m.setAccessible(true);
      return m;
    } catch (NoSuchMethodException e) {
      // we don't care because this exception should never happen
    }
    return null;
  }

  public static class Effect {
    public final Animation anim;
    public final long totalTime;

    public Effect(Animation anim) {
      this.anim = anim;
      totalTime = anim.computeDurationHint();
    }
  }
}




Java Source Code List

com.nirhart.parallaxscroll.BuildConfig.java
com.nirhart.parallaxscroll.BuildConfig.java
com.nirhart.parallaxscroll.views.ParallaxExpandableListView.java
com.nirhart.parallaxscroll.views.ParallaxListViewHelper.java
com.nirhart.parallaxscroll.views.ParallaxListView.java
com.nirhart.parallaxscroll.views.ParallaxScrollView.java
com.nirhart.parallaxscroll.views.ParallaxedView.java
org.arasthel.googlenavdrawermenu.adapters.GoogleNavigationDrawerAdapter.java
org.arasthel.googlenavdrawermenu.utils.Utils.java
org.arasthel.googlenavdrawermenu.views.CheckableImageView.java
org.arasthel.googlenavdrawermenu.views.CheckableRelativeLayout.java
org.arasthel.googlenavdrawermenu.views.CheckedTextView.java
org.arasthel.googlenavdrawermenu.views.GoogleNavigationDrawer.java
shared.ui.actionscontentview.ActionsContentView.java
shared.ui.actionscontentview.ActionsLayout.java
shared.ui.actionscontentview.BaseContainerController.java
shared.ui.actionscontentview.BuildConfig.java
shared.ui.actionscontentview.ContainerController.java
shared.ui.actionscontentview.ContentLayout.java
shared.ui.actionscontentview.EffectsController.java
taz.starz.footynews.MainActivity.java
taz.starz.footynews.OfflineReadActivity.java
taz.starz.footynews.SplashScreen.java
taz.starz.footynews.ViewOfflineActivity.java
taz.starz.footynews.ViewStoryActivity.java
taz.starz.footynews.adapter.CustomListAdapter.java
taz.starz.footynews.adapter.CustomOfflineReaderAdapter.java
taz.starz.footynews.fragments.BundesLigaFragment.java
taz.starz.footynews.fragments.LigaBBVAFragment.java
taz.starz.footynews.fragments.PremierLeagueFragment.java
taz.starz.footynews.fragments.SerieAFragment.java
taz.starz.footynews.library.DatabaseHandler.java
taz.starz.footynews.library.JSONParser.java
taz.starz.footynews.library.NetworkFunctions.java
taz.starz.footynews.library.NewsItem.java
taz.starz.footynews.library.SharedPref.java