Android侧滑菜单(最简)

来源:互联网 发布:淘宝店铺首页的作用 编辑:程序博客网 时间:2024/06/10 21:27

作为新手,对于侧滑菜单的使用,当然也是用最简单的实现方式。

一样的,首先来讲一下侧滑菜单的原理,其实很简单,就是关于屏幕的触碰事件,监听手指的移动来判断是显示菜单栏还是显示主页面,所以只需要在主页面横着放两个布局(一个菜单布局和一个主页面布局)即可,然后进行判断!

好了多的就不说了,上代码首先是主页面的布局文件activity_main.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:orientation="horizontal">    <LinearLayout        android:id="@+id/main_linear_menu"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical"        android:gravity="center">        <TextView            style="@style/text"            android:text="右边菜单"/>    </LinearLayout>    <LinearLayout        android:id="@+id/main_linear_content"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical">        <TextView            style="@style/text"            android:text="主页面"/>    </LinearLayout></LinearLayout>
关于上面的style="@style/text"也贴出来供大家参考吧,其实大家完全可以自己写的,这个大家应该会的
<style name="text">        <item name="android:layout_height">wrap_content</item>        <item name="android:layout_width">wrap_content</item>        <item name="android:textColor">@color/red</item>        <item name="android:textSize">18dp</item></style>
最后便是重点了,主页面的滑动监听是显示主页面还是菜单页面,代码注释写的还算比较清楚就不多咯嗦了,大家看代码,有什么不懂的可以留言,有我时间会为大家解决的
public class MainActivity extends BaseActivity {    public int screenWidth;//屏幕的宽度    public int leftEdge;//左边菜单的左边距    /**     * menu布局的参数,通过此参数来更改leftMargin的值。     */    private LinearLayout.LayoutParams menuParams;    public float xDown;//手指按下的横坐标    public float xMove;//手指移动的横坐标    public float xup;//手指抬起的横坐标    private boolean isMenuVisible;    /**     * 用于计算手指滑动的速度。     */    private VelocityTracker mVelocityTracker;    /**     * 滚动显示和隐藏menu时,手指滑动需要达到的速度。     */    public static final int SNAP_VELOCITY = 200;    @InjectView(R.id.main_linear_menu)    LinearLayout mainLinearMenu;    @InjectView(R.id.main_linear_content)    LinearLayout mainLinearContent;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        ButterKnife.inject(this);        initValues();        /**         * 监听主页面的滑动页面         */        mainLinearContent.setOnTouchListener(new View.OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                if (mVelocityTracker == null) {                    mVelocityTracker = VelocityTracker.obtain();                }                mVelocityTracker.addMovement(event);                switch (event.getAction()){                    case MotionEvent.ACTION_DOWN:                        xDown = event.getRawX();                        break;                    case MotionEvent.ACTION_MOVE:                        xMove = event.getRawX();                        if (isMenuVisible){                            menuParams.leftMargin = (int)(xMove-xDown);                        }else{                            menuParams.leftMargin = leftEdge+(int)(xMove-xDown);                        }                        if(menuParams.leftMargin<leftEdge){                            menuParams.leftMargin=leftEdge;                        }else if(menuParams.leftMargin>0){                            menuParams.leftMargin = 0;                        }                        mainLinearMenu.setLayoutParams(menuParams);                        break;                    case MotionEvent.ACTION_UP:                        xup = event.getRawX();                        if(wantToShowMenu()){                            if(shouldShowMenu()){                                scrollToMenu();                            }else{                                scrollToContent();                            }                        }else if(wantToShowContent()){                            if(shouldShowContent()){                                scrollToContent();                            }else{                                scrollToMenu();                            }                        }                        recycleVelocityTracker();                        break;                }                return true;            }        });    }    //是否想去显示左边菜单    public boolean wantToShowMenu(){        return xup-xDown>0&&!isMenuVisible;    }    //是否能够显示左边菜单    public boolean shouldShowMenu(){        return xup-xDown>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY;    }    //滑动显示左边菜单    public void scrollToMenu(){        new ScrollTask().execute(30);    }    //是否想去显示主页面    public boolean wantToShowContent(){        return xup-xDown<0&&isMenuVisible;    }    //是否能够显示主页面    public boolean shouldShowContent(){        return xDown-xup+80>screenWidth/2||getScrollVelocity()>SNAP_VELOCITY;    }    //滑动显示主页面    public void scrollToContent(){        new ScrollTask().execute(-30);    }    //滑动的速度    public int getScrollVelocity(){        mVelocityTracker.computeCurrentVelocity(1000);        return Math.abs((int)mVelocityTracker.getXVelocity());    }    /**     * 回收VelocityTracker对象。     */    private void recycleVelocityTracker() {        mVelocityTracker.recycle();        mVelocityTracker = null;    }    class ScrollTask extends AsyncTask<Integer,Integer,Integer>{        @Override        protected Integer doInBackground(Integer... params) {            int leftMargin = menuParams.leftMargin;            while (true){                leftMargin+=params[0];                if(leftMargin>0){                    leftMargin = 0;                    break;                }                if(leftMargin<leftEdge){                    leftMargin = leftEdge;                    break;                }                publishProgress(leftMargin);                try {                    Thread.sleep(20);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }            if (params[0] > 0) {                isMenuVisible = true;            } else {                isMenuVisible = false;            }            return leftMargin;        }        @Override        protected void onProgressUpdate(Integer... leftMargin) {            menuParams.leftMargin = leftMargin[0];            mainLinearMenu.setLayoutParams(menuParams);        }        @Override        protected void onPostExecute(Integer leftMargin) {            menuParams.leftMargin = leftMargin;            mainLinearMenu.setLayoutParams(menuParams);        }    }    /**     * 初始化一些关键性数据。包括获取屏幕的宽度,给content布局重新设置宽度,给menu布局重新设置宽度和偏移距离等。     */    private void initValues() {        screenWidth = getWindowManager().getDefaultDisplay().getWidth();//获取屏幕宽度        menuParams = (LinearLayout.LayoutParams)mainLinearMenu.getLayoutParams();//获取左边菜单的父容器        menuParams.width = screenWidth-80;        leftEdge = -menuParams.width;        menuParams.leftMargin = leftEdge;        mainLinearContent.getLayoutParams().width = screenWidth;    }
这样侧滑菜单就实现了,如果有什么不懂的可以留言,我有时间会一一为大家做出解释的,如果对你有所帮助,请点个赞,谢谢!

2 0