关闭

android仿IOS,滑动隐藏底部ScrollView

1094人阅读 评论(0) 收藏 举报
分类:

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

      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);
        }
    }
}


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

       

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:81366次
    • 积分:1482
    • 等级:
    • 排名:千里之外
    • 原创:60篇
    • 转载:0篇
    • 译文:0篇
    • 评论:68条
    最新评论