自定义侧滑菜单

类似于QQ侧滑菜单的效果,这个最重要的就是改变摆放方式,从而达到自己想要的效果,首先先弄明白onLayout方法里的参数

这个自定义里最主要的就是通过touch事件来移动显示的范围,移动viewgroup主要有几个方法,onLayout

offsetTopAndBottom(offset)和offsetLeftAndRight(offset);
scrollTo和scrollBy方法;
注意:滚动的并不是viewgroup内容本身,而是它的矩形边框
它是瞬间移动,

这里我们用的是scrollTo。

开始上代码:侧滑菜单布局

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="240dp"
    android:layout_height="match_parent"
    android:background="@drawable/menu_bg"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical" >

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_news"
            android:text="新闻" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_read"
            android:text="订阅" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_ties"
            android:text="跟帖" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_pics"
            android:text="图片" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_ugc"
            android:text="话题" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_pics"
            android:text="图片" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />

        <TextView
            style="@style/TabMenu"
            android:drawableLeft="@drawable/tab_vote"
            android:text="投票" />
    </LinearLayout>

</ScrollView>

主布局

<?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:background="#D3D3D3"
    android:orientation="vertical" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="70dp"
        android:background="@drawable/top_bar_bg"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/img"
            android:layout_width="70dp"
            android:layout_height="70dp"
            android:src="@drawable/main_back" />

        <TextView
            style="@style/TabMenu"
            android:text="新闻主页" />
    </LinearLayout>

</LinearLayout>

父布局

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.slidemenu.MainActivity" >

    <com.example.slidemenu.view.SlideMenu
        android:id="@+id/slide"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
        <!--侧滑菜单-->
        <include layout="@layout/menu_layout"/>

        <!--主布局-->
        <include layout="@layout/main_layout"/>
    </com.example.slidemenu.view.SlideMenu>

</RelativeLayout>

代码

package com.example.slidemenu.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import android.widget.RelativeLayout;

public class SlideMenu extends RelativeLayout{
    private View menuView;
    private View mainView;

    public SlideMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public SlideMenu(Context context) {
        super(context);
        init();
    }

    private void init() {
        // TODO Auto-generated method stub

    }

    /**
     * 完成一级布局的加载,在这里进行布局的初始化
     */
    @Override
    protected void onFinishInflate() {

        menuView = getChildAt(0);

        mainView = getChildAt(1);
    }

    /**
     * 参数是xml里定义的,都是match_parent,一般自定义viewGroup都不会重写此方法,继承已经有的layout就可以了
     */
//    @Override
//    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//        // TODO Auto-generated method stub
//        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
//        // 侧滑菜单的测量,所有参数封装在LayoutParams里
//        System.out.println(menuView.getLayoutParams().width+">>>>>>>>>");
//        menuView.measure(menuView.getLayoutParams().width, heightMeasureSpec);
//        // 主界面的测量
//        mainView.measure(widthMeasureSpec, heightMeasureSpec);
//    }

    @Override
    protected void onLayout(boolean arg0, int l, int t, int r, int b) {
        // 进行放置,菜单布局在屏幕的左侧
        menuView.layout(-menuView.getLayoutParams().width, 0, 0, b);
        mainView.layout(l, t, r, b);

    }

    private int downX = 0;
    private int newScrollX=0;

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            downX = (int) event.getX();
            break;
        case MotionEvent.ACTION_MOVE:
            int moveX = (int) event.getX();
            // 移动距离
            int detalX = (int) moveX - downX;
            newScrollX = getScrollX() - detalX;
            System.out.println(newScrollX + "-----------");
            if (newScrollX < -menuView.getLayoutParams().width) {
                newScrollX = -menuView.getLayoutParams().width;
            }
            if (newScrollX > 0) {
                newScrollX = 0;
            }
            // 并不是内容移动,而是这个窗口在移动,所以这个内容相对窗体来说是相反的方向
            scrollTo(newScrollX, 0);
            downX = moveX;
            break;
        case MotionEvent.ACTION_UP:
            if (newScrollX < -menuView.getLayoutParams().width/2) {
                newScrollX = -menuView.getLayoutParams().width;
            }
            if (newScrollX > -menuView.getLayoutParams().width/2) {
                newScrollX = 0;
            }
            scrollTo(newScrollX, 0);
            break;
        }
        return true;
    }
    /**
     * 打开菜单方法
     */
    public void open(){
        scrollTo(-menuView.getLayoutParams().width, 0);
    }
}
时间: 2024-10-25 20:13:11

自定义侧滑菜单的相关文章

Android 自定义View修炼-打造完美的自定义侧滑菜单/侧滑View控件(转)

一.概述 在App中,经常会出现侧滑菜单,侧滑滑出View等效果,虽然说Android有很多第三方开源库,但是实际上 咱们可以自己也写一个自定义的侧滑View控件,其实不难,主要涉及到以下几个要点: 1.对Android中Window类中的DecorView有所了解 2.对Scroller类实现平滑移动效果 3.自定义ViewGroup的实现 首先来看看效果图吧:    下面现在就来说说这里咱们实现侧滑View的基本思路吧,这里我采用的是自定义一个继承于RelativeLayout的控件叫做XC

自定义android侧滑菜单

这里实现两种侧滑菜单效果,第一种拖拽内容部分,菜单像是被拖出来的感觉的这种效果,第二种是拖拽内容部分,菜单在内容后面不动,感觉有一种层次感的效果,如下 第一种效果的代码实现如下: package com.tenghu.customsideslip.menu.view; import android.content.Context; import android.os.AsyncTask; import android.util.AttributeSet; import android.util.

自定义Android侧滑菜单控件

package com.tenghu.sideslipmenu.view; import android.content.Context; import android.os.AsyncTask; import android.util.AttributeSet; import android.util.DisplayMetrics; import android.view.MotionEvent; import android.view.VelocityTracker; import andr

彷QQ5.0侧滑菜单(自定义控件--SlideMenu的实现)

一般的侧滑的实现 ViewGroup  Menu + Content onTouchEvent MOVE:ViewGroup的leftMargin UP:根据显示菜单的高度,决定将其隐藏或者显示 1.Scroller 2.LeftMargin + Thread 彷QQ5.0侧滑菜单的实现,使用另外的一种方法,继承HorizontalScrollView 一.自定义ViewGroup 1.构造方法的选择,获得一些需要用到的值 2.onMeasure 计算子View的宽和高,以及设置自己的宽和高 3

Android Studio官方版DrawerLayout侧滑菜单解析

效果图如下 这是使用Android Studio新建的一个DrawerLayout项目跑出来后的效果(没有Android Studio的盆友赶紧去下载个吧). 生成后的代码有点混乱,稍微整理一下,那么先看布局文件 activity_main.xml: <?xml version="1.0" encoding="utf-8"?>   <android.support.v4.widget.DrawerLayout xmlns:android="

嗯嗯,一句代码就搞定 RecycleView 侧滑菜单、添加头部底部、加载更多

很早就萌生了将这种方案封装为一个开源库的想法,旨在实现调用方式最简单,且又不失可定制性.本库最大的特点的是采用了 Glide 简洁明了的链式调用方式,一句代码即可添加侧滑菜单.头部底部等. 特性: 1.自定义侧滑菜单布局 2.添加头部.底部 3.轻松实现加载更多 4.设置 item 间距 5.多种 item 类型 6.支持 LinearLayout 及 GridLayout 7.一句代码实现所有功能 效果: 左侧滑菜单.右侧滑菜单.自定义菜单布局:      头部.多头部:      底部.多底

仿QQ5.0 里的侧滑菜单效果的实现

今天,我来分享下,侧滑菜单的实现原理,一般android侧滑的实现原理和步骤如下:(源码下载在下面最后给出哈) 1.使用ViewGroup 放2个view,一个是menu菜单,一个是content内容 2.监听onTouchEvent事件 处理ACTION_MOVE中的leftMargin位置,从而改变menu菜单的滑动位置 当ACTION_UP时,根据显示菜单的宽度,决定将其显示或隐藏动画效果: (1)使用Scroller这个辅助类实现动画效果 (2)单起一个Thread(或Task)来改变l

仿QQ侧滑菜单

仿QQ侧滑菜单 1.仿QQ侧滑(淡入淡出) 2.点击侧滑菜单相应地方响应事件 3.可以自定义侧滑菜单哦 下载地址:http://www.devstore.cn/code/info/846.html  运行截图:

Android自定义View之仿QQ侧滑菜单实现

最近,由于正在做的一个应用中要用到侧滑菜单,所以通过查资料看视频,学习了一下自定义View,实现一个类似于QQ的侧滑菜单,顺便还将其封装为自定义组件,可以实现类似QQ的侧滑菜单和抽屉式侧滑菜单两种菜单. 下面先放上效果图: 我们这里的侧滑菜单主要是利用HorizontalScrollView来实现的,基本的思路是,一个布局中左边是菜单布局,右边是内容布局,默认情况下,菜单布局隐藏,内容布局显示,当我们向右侧滑,就会将菜单拉出来,而将内容布局的一部分隐藏,如下图所示: 下面我们就一步步开始实现一个