多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全IT社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當前位置:首頁 > php開源 > 綜合技術(shù) > [置頂] Android自定義組件系列【15】――四個方向滑動的菜單實現(xiàn)

[置頂] Android自定義組件系列【15】――四個方向滑動的菜單實現(xiàn)

來源:程序員人生   發(fā)布時間:2015-02-27 08:38:36 閱讀次數(shù):3154次

今天無意中實現(xiàn)了1個4個方向滑動的菜單,感覺挺好玩,滑動起來很順手,既然已做出來了就貼出來讓大家也玩弄1下。

1、效果演示

(說明:目前沒有安裝Android摹擬器,制作的動態(tài)圖片太卡了,就貼1下靜態(tài)圖片吧,實際效果可以下載源代碼查看)


(向上滑動)


(向下滑動)


(向左滑動)


(向右滑動)

2、實現(xiàn)進程介紹

1、放置5個View (分別是上下左右中)

@Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mTopView.layout(0, -mViewHeight, mViewWidth, 0); mBottomView.layout(0, mViewHeight, mViewWidth, 2 * mViewHeight); mCenterView.layout(0, 0, mViewWidth, mViewHeight); mLeftView.layout(-mViewWidth, 0, 0, mViewHeight); mRightView.layout(mViewWidth, 0, 2 * mViewWidth, mViewHeight); }

轉(zhuǎn)載請說明出處:http://blog.csdn.net/dawanganban

2、通過onTouchEvent事件來判斷移動方向

private float mDownY; private float mDownX; @Override public boolean onTouchEvent(MotionEvent event) { int disY; int disX; float eventY = event.getY(); float eventX = event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mDownY = eventY; mDownX = eventX; break; case MotionEvent.ACTION_UP: disY = (int)(eventY - mDownY); disX = (int)(eventX - mDownX); if(Math.abs(disY) > Math.abs(disX)){ if(Math.abs(disY) > MIN_VIEW_HEIGHT / 2){ if(disY > 0){ //向下滑動 Log.d(TAG, "TO_BOTTOM"); changeToBottom(); }else{ //向上滑動 Log.d(TAG, "TO_TOP"); changeToTop(); } } }else{ if(Math.abs(disX) > MIN_VIEW_WIDTH / 2){ if(disX > 0){ //向右滑動 Log.d(TAG, "TO_RIGHT"); changeToRight(); }else{ //向左滑動 Log.d(TAG, "TO_LEFT"); changeToLeft(); } } } break; default: break; } return true; }
3、通過computerScroll()方法實現(xiàn)平滑移動

@Override public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } }
4、判斷臨界條件(否則會1直向1個方向滑動)

int[] location = new int[2]; mCenterView.getLocationOnScreen(location); if(location[1] >= mViewHeight - MIN_VIEW_HEIGHT * 2) return;
例如上面代碼就是判斷向下滑動的臨界條件,location[1]代表中間View的y坐標(相對屏幕)。

3、全部View的源碼

package com.example.testmx4update; import android.content.Context; import android.graphics.Color; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.Scroller; /** * 自定義可以拖動的View * @author 陽光小強 http://blog.csdn.net/dawanganban * */ public class MyCanPullView extends ViewGroup{ private static final int MIN_VIEW_HEIGHT = 200; private static final int MIN_VIEW_WIDTH = 400; private static final String TAG = "TEST"; private int mViewHeight; private int mViewWidth; private View mTopView; private View mBottomView; private View mCenterView; private View mLeftView; private View mRightView; private Scroller mScroller; public MyCanPullView(Context context, AttributeSet attrs) { super(context, attrs); initView(context); mScroller = new Scroller(context); } private void initView(Context context) { setTopView(context); setBottomView(context); setCenterView(context); setLeftView(context); setRightView(context); } private float mDownY; private float mDownX; @Override public boolean onTouchEvent(MotionEvent event) { int disY; int disX; float eventY = event.getY(); float eventX = event.getX(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: mDownY = eventY; mDownX = eventX; break; case MotionEvent.ACTION_UP: disY = (int)(eventY - mDownY); disX = (int)(eventX - mDownX); if(Math.abs(disY) > Math.abs(disX)){ if(Math.abs(disY) > MIN_VIEW_HEIGHT / 2){ if(disY > 0){ //向下滑動 Log.d(TAG, "TO_BOTTOM"); changeToBottom(); }else{ //向上滑動 Log.d(TAG, "TO_TOP"); changeToTop(); } } }else{ if(Math.abs(disX) > MIN_VIEW_WIDTH / 2){ if(disX > 0){ //向右滑動 Log.d(TAG, "TO_RIGHT"); changeToRight(); }else{ //向左滑動 Log.d(TAG, "TO_LEFT"); changeToLeft(); } } } break; default: break; } return true; } private void changeToBottom(){ int[] location = new int[2]; mCenterView.getLocationOnScreen(location); if(location[1] >= mViewHeight - MIN_VIEW_HEIGHT * 2) return; int dy = (int)(mViewHeight - MIN_VIEW_HEIGHT); mScroller.startScroll(0, getScrollY(), 0, -dy, 500); invalidate(); } private void changeToTop(){ int[] location = new int[2]; mTopView.getLocationOnScreen(location); if(location[1] <= -mViewHeight - MIN_VIEW_HEIGHT / 2) return; int dy = (int)(mViewHeight - MIN_VIEW_HEIGHT); mScroller.startScroll(0, getScrollY(), 0, dy, 500); invalidate(); } private void changeToRight(){ int[] location = new int[2]; mCenterView.getLocationOnScreen(location); if(location[0] >= mViewWidth - MIN_VIEW_WIDTH * 2) return; int dx = (int)(mViewWidth - MIN_VIEW_WIDTH); mScroller.startScroll(getScrollX(), 0, -dx, 0, 500); invalidate(); } private void changeToLeft(){ Log.d(TAG, "TO_LEFT"); int[] location = new int[2]; mLeftView.getLocationOnScreen(location); if(location[0] <= -mViewWidth - MIN_VIEW_WIDTH / 2) return; int dx = (int)(mViewWidth - MIN_VIEW_WIDTH); mScroller.startScroll(getScrollX(), 0, dx, 0, 500); invalidate(); } @Override public void computeScroll() { super.computeScroll(); if(mScroller.computeScrollOffset()){ scrollTo(mScroller.getCurrX(), mScroller.getCurrY()); postInvalidate(); } } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mTopView.layout(0, -mViewHeight, mViewWidth, 0); mBottomView.layout(0, mViewHeight, mViewWidth, 2 * mViewHeight); mCenterView.layout(0, 0, mViewWidth, mViewHeight); mLeftView.layout(-mViewWidth, 0, 0, mViewHeight); mRightView.layout(mViewWidth, 0, 2 * mViewWidth, mViewHeight); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); //獲得全部View的寬高 mViewWidth = MeasureSpec.getSize(widthMeasureSpec); mViewHeight = MeasureSpec.getSize(heightMeasureSpec); } private void setTopView(Context context){ View topButton = new View(context); topButton.setBackgroundColor(Color.RED); mTopView = topButton; this.addView(mTopView); } private void setBottomView(Context context){ View bottomButton = new View(context); bottomButton.setBackgroundColor(Color.GREEN); mBottomView = bottomButton; this.addView(mBottomView); } private void setCenterView(Context context){ View centerButton = new View(context); centerButton.setBackgroundColor(Color.WHITE); mCenterView = centerButton; this.addView(mCenterView); } private void setLeftView(Context context){ View leftButton = new View(context); leftButton.setBackgroundColor(Color.BLUE); mLeftView = leftButton; this.addView(mLeftView); } private void setRightView(Context context){ View rightButton = new View(context); rightButton.setBackgroundColor(Color.YELLOW); mRightView = rightButton; this.addView(mRightView); } }
獲得全部源代碼,請加群在群同享中獲得(142979499)

生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: 国产综合久久久久久 | 国产一区视频在线播放 | 精品中文字幕一区二区三区四区 | 欧美性受| 国产精品一区二区三区免费视频 | 久久r这里只有精品 | a级网站 | 一区亚洲| 片在线观看免费观看视频 | 国产性tv国产精品 | 热热色视频| 国产欧美久久久另类精品 | 红豆视频在线观看日本 | tube欧美69xxxx| 五月婷婷在线视频 | 亚洲 欧美 国产 制服 动漫 | 午夜网站免费版在线观看 | japan高清日本乱xxxx | 国产三级精品三级在线专区1 | 在线播放国产一区 | 五月天综合在线 | 欧美成人综合在线观看视频 | 国产激情久久久久久影院 | 亚洲三级图片 | 免费国产高清精品一区在线 | 欧美xxxx做受欧美 | 国产亚洲一区二区三区在线观看 | 最新国产在线观看福利 | 乱在线伦视频免费 | 男女一区二区三区免费 | 91精品久久久久久久久久 | 在线视频播放网站 | 日本久久综合 | 嫩草影院在线观看未满十八 | 动漫精品成人免费网站 | 少妇下面好紧好多水真爽播放 | 伊人久久大香线蕉综合亚洲 | 亚洲图片欧美视频 | 国内视频自拍 | 欧美性xxxx | xxxxx性欧美 xxxxx性欧美hd另类 |