--- /dev/null
+/*
+ The MIT License (MIT)
+
+ Copyright (c) 2014 Nir Hartmann
+
+ Permission is hereby granted, free of charge, to any person obtaining a copy
+ of this software and associated documentation files (the "Software"), to deal
+ in the Software without restriction, including without limitation the rights
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+
+ The above copyright notice and this permission notice shall be included in all
+ copies or substantial portions of the Software.
+
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ SOFTWARE.
+ */
+package com.samsung.srpol.parallax;
+
+import java.lang.ref.WeakReference;
+import java.util.ArrayList;
+import java.util.List;
+
+import android.annotation.SuppressLint;
+import android.os.Build;
+import android.view.View;
+import android.view.animation.AlphaAnimation;
+import android.view.animation.Animation;
+import android.view.animation.AnimationSet;
+
+public abstract class ParallaxedView {
+ static public boolean isAPI11 = Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB;
+ protected WeakReference<View> view;
+ protected int lastOffset;
+ protected List<Animation> animations;
+
+ abstract protected void translatePreICS(View view, float offset);
+
+ public ParallaxedView(View view) {
+ this.lastOffset = 0;
+ this.animations = new ArrayList<Animation>();
+ this.view = new WeakReference<View>(view);
+ }
+
+ public boolean is(View v) {
+ return (v != null && view != null && view.get() != null && view.get()
+ .equals(v));
+ }
+
+ @SuppressLint("NewApi")
+ public void setOffset(float offset) {
+ View view = this.view.get();
+ if (view != null)
+ if (isAPI11) {
+ view.setTranslationY(offset);
+ } else {
+ translatePreICS(view, offset);
+ }
+ }
+
+ public void setAlpha(float alpha) {
+ View view = this.view.get();
+ if (view != null)
+ if (isAPI11) {
+ view.setAlpha(alpha);
+ } else {
+ alphaPreICS(view, alpha);
+ }
+ }
+
+ protected synchronized void addAnimation(Animation animation) {
+ animations.add(animation);
+ }
+
+ protected void alphaPreICS(View view, float alpha) {
+ addAnimation(new AlphaAnimation(alpha, alpha));
+ }
+
+ protected synchronized void animateNow() {
+ View view = this.view.get();
+ if (view != null) {
+ AnimationSet set = new AnimationSet(true);
+ for (Animation animation : animations)
+ if (animation != null)
+ set.addAnimation(animation);
+ set.setDuration(0);
+ set.setFillAfter(true);
+ view.setAnimation(set);
+ set.start();
+ animations.clear();
+ }
+ }
+
+ public void setView(View view) {
+ this.view = new WeakReference<View>(view);
+ }
+
+ public View getView() {
+ return this.view.get();
+ }
+}