android仿IOS,滑动隐藏底部ScrollView

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

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

       思路:当监听到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);
        }
    }
}


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

       

posted @ 2017-04-28 13:51  jzdwajue  阅读(217)  评论(0编辑  收藏  举报