android推拉門效果(Scroller)

來源:互聯網
上載者:User

標籤:scroller   animation   推拉   自訂view   

下面就使用Scroller來給大家展示一下推拉門的效果


思路:

1.自訂一個類PushPullDoorView,繼承RelativeLayout、

2.初始化Scroller對象,並且設有彈動效果。根據你的手勢移動繪畫的時候展示的比較光滑。

3.在onTouchEvent方法中,會在手勢移動的中,使用scrollTo移動View。在手指離開螢幕的時候,會調用Scroller中滑動的動畫。

4.重寫computeScroll方法,判斷Scroller對象動畫是否結束,如果沒有結束,那麼使用scrollTo方法,不斷的移動View,直到動畫結束。

注意點:

在啟動Scroller對象的移動的時候,要使用invalidate表示開始重新整理介面,那麼就會執行computeScroll中的代碼,在裡面不要忘了寫postInvalidate()進行重新整理介面,這樣才把整個View移動的效果表現的淋淋盡致。


下面跟據代碼進行解釋:

public class PushPullDoorView extends RelativeLayout {private final String TAG = PushPullDoorView.class.getSimpleName();private Context mContext;private Scroller mScroller;// 平滑滾動器private int mScreenHeigh = 0;private int mLastDownY = 0;private int mCurryY;private int mDelY;private boolean mCloseFlag = false;// 是否隱藏Viewprivate ImageView mImgView;private Interpolator polator;// 滾動效果public PushPullDoorView(Context context) {super(context);mContext = context;setupView();}public PushPullDoorView(Context context, AttributeSet attrs) {super(context, attrs);mContext = context;setupView();}@SuppressLint("NewApi")private void setupView() {initScroller();getWindowInfo();initImageView();}public void initScroller() {polator = new BounceInterpolator();// 彈跳效果,當然也可以設定其他的效果,例如:加快效果mScroller = new Scroller(mContext, polator);}public void getWindowInfo() {// 擷取螢幕解析度WindowManager wm = (WindowManager) (mContext.getSystemService(Context.WINDOW_SERVICE));DisplayMetrics dm = new DisplayMetrics();wm.getDefaultDisplay().getMetrics(dm);mScreenHeigh = dm.heightPixels;}public void initImageView() {// 這裡你一定要設定成透明背景,不然會影響你看到底層布局this.setBackgroundColor(Color.argb(0, 0, 0, 0));mImgView = new ImageView(mContext);mImgView.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));mImgView.setScaleType(ImageView.ScaleType.FIT_XY);// 填充整個螢幕mImgView.setImageResource(R.drawable.bg); // 預設背景addView(mImgView);}/** * 設定推動門背景 *  * @param id */public void setBgImage(int id) {mImgView.setImageResource(id);}/** * 設定推動門背景 *  * @param drawable */public void setBgImage(Drawable drawable) {mImgView.setImageDrawable(drawable);}/** * 推動門的動畫 *  * @param startY *            Y方向開始的位置 * @param dy *            Y方向移動的距離 * @param duration *            時間 */public void startBounceAnim(int startY, int dy, int duration) {mScroller.startScroll(0, startY, 0, dy, duration);invalidate();// 一定不要忘了寫這句代碼}@Overridepublic boolean onTouchEvent(MotionEvent event) {int action = event.getAction();switch (action) {case MotionEvent.ACTION_DOWN:// 記錄按下的Y抽座標mLastDownY = (int) event.getY();return true;case MotionEvent.ACTION_MOVE:mCurryY = (int) event.getY();mDelY = mCurryY - mLastDownY;// 只准上滑有效if (mDelY < 0) {scrollTo(0, -mDelY);// 跟著移動事件的觸發,不斷的移動}break;case MotionEvent.ACTION_UP:mCurryY = (int) event.getY();mDelY = mCurryY - mLastDownY;if (mDelY < 0) {if (Math.abs(mDelY) > mScreenHeigh / 2) {// 向上滑動超過半個螢幕高的時候 開啟向上消失動畫startBounceAnim(this.getScrollY(), mScreenHeigh, 450);mCloseFlag = true;} else {// 向上滑動未超過半個螢幕高的時候 開啟向下彈動動畫startBounceAnim(this.getScrollY(), -this.getScrollY(), 1000);}}break;}return super.onTouchEvent(event);}@Overridepublic void computeScroll() {if (mScroller.computeScrollOffset()) {scrollTo(mScroller.getCurrX(), mScroller.getCurrY());// 不要忘記更新介面Log.d(TAG, "computeScroll");postInvalidate();} else {if (mCloseFlag) {this.setVisibility(View.GONE);}}}}

在構造方法中是要進行的操作,初始化Scroller,擷取螢幕的解析度,增加ImageView作為View的背景,當然也可以是其他的View,這裡以ImageView作為背景。

在onTouchEvent的 MotionEvent.ACTION_MOVE:動作下,注意必須是當前Y值-MotionEvent.ACTION_DOWN的Y小於0,才表示是向上滑動,此時在可以使用scrollTo()來移動View。

scrollTo(X方向位置,Y方法位置),初始化狀態都是(0,0),當向上滑動的距離為10,那麼其實就是10就是Y方向移動的差值,相當於Y方向10移動到了0.

當收離開了螢幕,當移動的距離小於螢幕高的一半,那麼就向下移動,如果移動的距離大於螢幕高的一半,那麼就向上滑動,並且隱藏此View。

在computeScroll方法中,因為在手離開螢幕的時候會調用scroller的開始滾動,那麼在此會根據滾動是否結束,一直不斷的移動螢幕,當然這是invalidate和postInvalidate互動的作用,才可以不斷的重新整理和scrollTo()移動View。


源碼:http://download.csdn.net/detail/forwardyzk/8327775

:

        


android推拉門效果(Scroller)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.