Android自訂群組件系列【15】——四個方向滑動的菜單實現,android自訂

來源:互聯網
上載者:User

Android自訂群組件系列【15】——四個方向滑動的菜單實現,android自訂

今天無意中實現了一個四個方向滑動的菜單,感覺挺好玩,滑動起來很順手,目前還沒有見過這樣的應用,以後能不能在應用中出現或者說有沒有實用價值就不好說了,既然已經做出來了就貼出來讓大家也玩弄一下,說不定對你有所啟發。

一、效果示範

(說明:目前沒有安裝Android模擬器,製作的動態圖片太卡了,就貼一下靜態圖片吧,實際效果可以下載原始碼查看)


(向上滑動)


(向下滑動)


(向左滑動)


(向右滑動)

二、實現過程介紹

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

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

轉載請說明出處:http://blog.csdn.net/dawanganban

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

private float mDownY;private float mDownX;@Overridepublic 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()方法實現平滑移動

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

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

三、整個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;@Overridepublic 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();}@Overridepublic void computeScroll() {super.computeScroll();if(mScroller.computeScrollOffset()){scrollTo(mScroller.getCurrX(), mScroller.getCurrY());postInvalidate();}}@Overrideprotected 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);}@Overrideprotected 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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.