Android侧滑菜单(最简)

本文介绍了一种简单的侧滑菜单实现方法,通过监听触摸事件并根据手指移动来切换显示主页面或菜单页面。代码示例详细展示了如何设置布局及滑动监听。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

好了多的就不说了,上代码首先是主页面的布局文件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;
    }
这样侧滑菜单就实现了,如果有什么不懂的可以留言,我有时间会一一为大家做出解释的,如果对你有所帮助,请点个赞,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值