android仿IOS,滑動隱藏底部ScrollView

jopen 9年前發布 | 25K 次閱讀 Android開發 移動開發 ScrollView

       在我們開發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);  
        }  
    }  
}  </pre><br />

        最后:主要就使用用了一個屬性動畫,屬性動畫還是很重要的,一定的學會并熟練應用。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!