android仿IOS,滑动隐藏底部ScrollView

jopen 9年前

       在我们开发android app时,会有很多效果都需要模仿IOS,最近在做一个页面时,其中用到了 ScrollView,但要做成IOS那种在ScrollView滑动时,浮在ScrollView的功能按钮要隐藏,当滑动结束后,功能按钮又要显示出来。效果如下图所示:

      20150707173912384.png
gif实在是不好搞,所以只能截个静态图来表示一下,当ScrollView滑动时,浮在最下面的按钮会以动画的形式隐藏,当停止滑动时,又会已动画的形式回到原位置。

       思路:当监听到ScrollView滑动时,播放属性动画隐藏,当滑动结束的时候播放相反的动画,使View回到原位置。

       代码如下: 

    package view;        /**********************************************************        * @文件名称:CustomScrollView.java        * @文件作者:rzq        * @创建时间:2015年7月7日 下午2:20:16        * @文件描述:滑动隐藏ScrollView        * @修改历史:2015年7月7日创建初始版本        **********************************************************/        public class CustomScrollView extends ScrollView        {            /**            * UI            */            private View contentView;            /**            * data            */            private ValueAnimator apperaAnim;            private ValueAnimator hiddenAnim;            private int downScrollY;            private int moveScrollY;            private boolean isHidding;                    public CustomScrollView(Context context, AttributeSet attrs)            {                super(context, attrs);            }                    @Override            protected void onFinishInflate()            {                if (getChildCount() > 0)                {                    contentView = getChildAt(0);                }            }                    @Override            public boolean onTouchEvent(MotionEvent ev)            {                switch (ev.getAction())                {                case MotionEvent.ACTION_DOWN:                    downScrollY = getScrollY();                    break;                case MotionEvent.ACTION_MOVE:                    moveScrollY = getScrollY();                    if (moveScrollY != downScrollY)                    {                        startHiddenAnimation();                    }                    break;                case MotionEvent.ACTION_UP:                case MotionEvent.ACTION_CANCEL:                    moveScrollY = 0;                    downScrollY = 0;                    break;                }                return super.onTouchEvent(ev);            }                    public void setAnimationView(final View animationView)            {                /**                * 创建动画                */                hiddenAnim = ValueAnimator.ofFloat(0, animationView.getHeight());                hiddenAnim.setDuration(500);                hiddenAnim.setTarget(animationView);                hiddenAnim.addUpdateListener(new AnimatorUpdateListener()                {                    @Override                    public void onAnimationUpdate(ValueAnimator animation)                    {                        animationView.setTranslationY((Float) animation.getAnimatedValue());                    }                });                hiddenAnim.addListener(new AnimatorListenerAdapter()                {                    @Override                    public void onAnimationEnd(Animator animation)                    {                        startApperaAnimation();                    }                            @Override                    public void onAnimationStart(Animator animation)                    {                        isHidding = true;                    }                });                        apperaAnim = ValueAnimator.ofFloat(animationView.getHeight(), 0);                apperaAnim.setDuration(500);                apperaAnim.setTarget(animationView);                apperaAnim.addUpdateListener(new AnimatorUpdateListener()                {                    @Override                    public void onAnimationUpdate(ValueAnimator animation)                    {                        animationView.setTranslationY((Float) animation.getAnimatedValue());                    }                });                        apperaAnim.addListener(new AnimatorListenerAdapter()                {                    @Override                    public void onAnimationEnd(Animator animation)                    {                        isHidding = false;                    }                            @Override                    public void onAnimationStart(Animator animation)                    {                    }                });            }                    private void startHiddenAnimation()            {                if (!hiddenAnim.isRunning() && !isHidding)                {                    hiddenAnim.start();                }            }                    private void startApperaAnimation()            {                if (!apperaAnim.isRunning())                {                    apperaAnim.start();                }            }                    /**            * 是否直接滑动到底部            */            protected boolean isScrollDown()            {                return getHeight() + getScrollY() == contentView.getHeight();            }                    /**            * 是否直接滑到顶部            */            protected boolean isScrollUp()            {                return getScrollY() == 0;            }        }                   /**           * 在Activity中使用           */           public class CustomActivity extends Activity           {            private TextView textView;            private CustomScrollView2 scrollView;                    @Override            protected void onCreate(Bundle savedInstanceState)            {                super.onCreate(savedInstanceState);                setContentView(R.layout.custom_scrollview_layout);                scrollView = (CustomScrollView2) findViewById(R.id.scoll_view);                textView = (TextView) findViewById(R.id.animation_view);            }                    @Override            public void onWindowFocusChanged(boolean hasFocus)            {                super.onWindowFocusChanged(hasFocus);                if (hasFocus)                {                    scrollView.setAnimationView(textView);                }            }        }  

        最后:主要就使用用了一个属性动画,属性动画还是很重要的,一定的学会并熟练应用。