Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android仿IOS,滑動隱藏底部ScrollView

android仿IOS,滑動隱藏底部ScrollView

編輯:關於Android編程

在我們開發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. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved