Android Open Source - QuickReturn Quick Return Target View






From Project

Back to project page QuickReturn.

License

The source code is released under:

MIT License

If you think the Android project QuickReturn 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

package com.felipecsl.quickreturn.library.widget;
//w w w.j a va  2  s  . c o  m
import android.annotation.TargetApi;
import android.os.Build;
import android.util.Log;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;

import com.felipecsl.quickreturn.library.QuickReturnStateTransition;
import com.felipecsl.quickreturn.library.SimpleAnimationListener;

public abstract class QuickReturnTargetView {

    protected static final String TAG = "QuickReturnTargetView";

    protected static final int STATE_ONSCREEN = 0;
    protected static final int STATE_OFFSCREEN = 1;
    protected static final int STATE_RETURNING = 2;
    protected static final int STATE_EXPANDED = 3;

    public static final int POSITION_TOP = 0;
    public static final int POSITION_BOTTOM = 1;

    protected int currentState = STATE_ONSCREEN;
    protected int minRawY;
    protected View quickReturnView;
    protected boolean noAnimation;

    protected final SimpleQuickReturnStateTransition defaultTransition = new SimpleQuickReturnStateTransition();
    protected final AnimatedQuickReturnStateTransition animatedTransition = new AnimatedQuickReturnStateTransition();
    protected final BottomQuickReturnStateTransition bottomTransition = new BottomQuickReturnStateTransition();

    protected QuickReturnStateTransition currentTransition;

    protected abstract int getComputedScrollY();

    public QuickReturnTargetView(final View targetView, final int position) {
        quickReturnView = targetView;
        setPosition(position);
    }

    /**
     * Returns the quick return target view alignment.
     * Will be either 0 (POSITION_TOP) or 1 (POSITION_BOTTOM)
     */
    public int getPosition() {
        if (currentTransition.equals(defaultTransition) ||
                currentTransition.equals(animatedTransition))
            return POSITION_TOP;

        return POSITION_BOTTOM;
    }

    /**
     * Sets the quick return target view alignment to
     * either 0 (POSITION_TOP) or 1 (POSITION_BOTTOM).
     *
     * @param newPosition The new position
     */
    public void setPosition(int newPosition) {
        currentTransition = newPosition == POSITION_TOP
                ? defaultTransition
                : bottomTransition;
    }

    public boolean isAnimatedTransition() {
        return currentTransition.equals(animatedTransition);
    }

    public void setAnimatedTransition(final boolean isAnimatedTransition) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) {
            Log.w(TAG, "Animated QuickReturn is only supported by Android API Level 11+");
            return;
        }
        this.currentTransition = isAnimatedTransition ? animatedTransition : defaultTransition;
        currentState = STATE_ONSCREEN;
        minRawY = 0;
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    protected void translateTo(final int translationY) {
        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.HONEYCOMB) {
            final TranslateAnimation anim = new TranslateAnimation(0, 0, translationY, translationY);
            anim.setFillAfter(true);
            anim.setDuration(0);
            quickReturnView.startAnimation(anim);
        } else {
            quickReturnView.setTranslationY(translationY);
        }
    }

    class SimpleQuickReturnStateTransition implements QuickReturnStateTransition {
        public int determineState(int rawY, int quickReturnHeight) {
            int translationY = 0;

            switch (currentState) {
                case STATE_OFFSCREEN:
                    if (rawY <= minRawY)
                        minRawY = rawY;
                    else
                        currentState = STATE_RETURNING;

                    translationY = rawY;
                    break;

                case STATE_ONSCREEN:
                    if (rawY < -quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    }
                    translationY = rawY;
                    break;

                case STATE_RETURNING:
                    translationY = (rawY - minRawY) - quickReturnHeight;
                    if (translationY > 0) {
                        translationY = 0;
                        minRawY = rawY - quickReturnHeight;
                    }

                    if (rawY > 0) {
                        currentState = STATE_ONSCREEN;
                        translationY = rawY;
                    }

                    if (translationY < -quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    }
                    break;
            }
            return translationY;
        }
    }

    class AnimatedQuickReturnStateTransition implements QuickReturnStateTransition {
        @TargetApi(Build.VERSION_CODES.HONEYCOMB)
        public int determineState(final int rawY, int quickReturnHeight) {
            int translationY = 0;

            switch (currentState) {
                case STATE_OFFSCREEN:
                    if (rawY <= minRawY)
                        minRawY = rawY;
                    else
                        currentState = STATE_RETURNING;

                    translationY = rawY;
                    break;

                case STATE_ONSCREEN:
                    if (rawY < -quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    }
                    translationY = rawY;
                    break;

                case STATE_RETURNING:
                    if (translationY > 0) {
                        translationY = 0;
                        minRawY = rawY - quickReturnHeight;
                    } else if (rawY > 0) {
                        currentState = STATE_ONSCREEN;
                        translationY = rawY;
                    } else if (translationY < -quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;

                    } else if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB && quickReturnView.getTranslationY() != 0) &&
                            !noAnimation) {

                        noAnimation = true;
                        final TranslateAnimation anim = new TranslateAnimation(0, 0, -quickReturnHeight, 0);
                        anim.setFillAfter(true);
                        anim.setDuration(250);
                        quickReturnView.startAnimation(anim);
                        anim.setAnimationListener(new SimpleAnimationListener() {
                            @Override
                            public void onAnimationEnd(Animation animation) {
                                noAnimation = false;
                                minRawY = rawY;
                                currentState = STATE_EXPANDED;
                            }
                        });
                    }
                    break;

                case STATE_EXPANDED:
                    if (rawY < minRawY - 2 && !noAnimation) {
                        noAnimation = true;
                        TranslateAnimation anim = new TranslateAnimation(0, 0, 0, -quickReturnHeight);
                        anim.setFillAfter(true);
                        anim.setDuration(250);
                        anim.setAnimationListener(new SimpleAnimationListener() {
                            @Override
                            public void onAnimationEnd(Animation animation) {
                                noAnimation = false;
                                currentState = STATE_OFFSCREEN;
                            }
                        });
                        quickReturnView.startAnimation(anim);
                    } else if (translationY > 0) {
                        translationY = 0;
                        minRawY = rawY - quickReturnHeight;
                    } else if (rawY > 0) {
                        currentState = STATE_ONSCREEN;
                        translationY = rawY;
                    } else if (translationY < -quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    } else {
                        minRawY = rawY;
                    }
            }
            return translationY;
        }
    }

    class BottomQuickReturnStateTransition implements QuickReturnStateTransition {
        public int determineState(final int _rawY, int quickReturnHeight) {
            int rawY = getComputedScrollY();
            int translationY = 0;

            switch (currentState) {
                case STATE_OFFSCREEN:
                    if (rawY >= minRawY)
                        minRawY = rawY;
                    else
                        currentState = STATE_RETURNING;

                    translationY = rawY;
                    break;

                case STATE_ONSCREEN:
                    if (rawY > quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    }
                    translationY = rawY;
                    break;

                case STATE_RETURNING:
                    translationY = (rawY - minRawY) + quickReturnHeight;

                    if (translationY < 0) {
                        translationY = 0;
                        minRawY = rawY + quickReturnHeight;
                    }

                    if (rawY == 0) {
                        currentState = STATE_ONSCREEN;
                        translationY = 0;
                    }

                    if (translationY > quickReturnHeight) {
                        currentState = STATE_OFFSCREEN;
                        minRawY = rawY;
                    }
                    break;
            }

            return translationY;
        }
    }
}




Java Source Code List

com.felipecsl.quickreturn.app.MainActivity.java
com.felipecsl.quickreturn.library.AbsListViewQuickReturnAttacher.java
com.felipecsl.quickreturn.library.CompositeAbsListViewOnScrollListener.java
com.felipecsl.quickreturn.library.CompositeOnScrollListener.java
com.felipecsl.quickreturn.library.QuickReturnAttacher.java
com.felipecsl.quickreturn.library.QuickReturnStateTransition.java
com.felipecsl.quickreturn.library.ScrollViewQuickReturnAttacher.java
com.felipecsl.quickreturn.library.SimpleAnimationListener.java
com.felipecsl.quickreturn.library.widget.AbsListViewScrollTarget.java
com.felipecsl.quickreturn.library.widget.ObservableScrollView.java
com.felipecsl.quickreturn.library.widget.QuickReturnAdapter.java
com.felipecsl.quickreturn.library.widget.QuickReturnTargetView.java
com.felipecsl.quickreturn.library.widget.ScrollViewScrollTarget.java