android侧边栏

不久前因项目需要,实现类似人人客户端侧滑栏效果,现整理出来分享,相互学习一下。具体的实现思路就不多说了,直接贴代码,有不明白的地方,沙发即可。

1.SlideMenu.java

package com.galesnjak.base;

import com.galesnjak.utility.Debug;
import android.app.Activity;
import android.content.Context;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.Scroller;

/**
 * 自定义侧滑栏
 * @author galesnjak
 *
 */
public class SlideMenu extends ViewGroup {
	/**
	 * 移动一定距离,触发View的滑动
	 */
	private int touchSlop = 10;
	/**
	 * 右侧View距离左边距离
	 */
	private int rightViewMargin;
	
	//右边视图、中间视图
	private View rightView,middleView;
	
	/**
	 * 第一次触摸的x坐标,用来作事件拦截
	 */
	private float interceptMotion_X;
	private float interceptMotion_Y;
	
	/**
	 * 记录用户滑动手势,ture:向左滑、false:向右滑 
	 */
	private boolean moveLeft = true;
	
	/**
	 * 当前侧滑栏打开状态
	 * true表示打开、false未打开 
	 */
	private boolean isRightOpen = false;

	/**
	 * 滑动事件的X坐标
	 */
	private float mLastMotionX;
	
	private Scroller mScroller;
	//自动回滚线程
	private ScrollerRunable scrollerRunable;
	
	/**
	 * 标识是否点击在侧滑栏打开区域
	 */
	private boolean mIsTapContent = false;
	
	/**
	 * 监听单击手势
	 */
	private GestureDetector mGestureDetector;
	
	/**
	 * 标识用户是否是否单击侧滑栏打开区域,以便关闭侧滑栏
	 */
	private boolean isTap = false;
	
	/**
	 * 默认开启侧滑栏功能
	 */
	private boolean leftSlideEnable = false;
	
	/**
	 * 屏幕宽度
	 */
	private int width;
	
	/**
	 * 右侧视图默认宽度,单位px
	 */
	private int rightViewWidth;
	
	/**
	 * 用来标记是否设置过右侧视图的宽度,如果设置过,子控件将按照该数值测量大小
	 */
	private boolean isSetRightViewWidth;
	
	public SlideMenu(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		initView(context);
	}

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

	public SlideMenu(Context context) {
		super(context);
		initView(context);
	}
	
	/**
	 * 该方法的作用:构造器
	 * @author galesnjak
	 * @date 2013-07-31
	 * @param context
	 * @param rightView
	 * @param middleView
	 */
	public SlideMenu(Context context,View rightView,View middleView){
		super(context);
		initView(context);
		if(null != rightView && null != middleView){
			addView(rightView,0);
			this.rightView = rightView;
			addView(middleView, getChildCount());
			this.middleView = middleView;
		}else{
			checkView();
		}
	}
	
	
	/**
	 * 该方法的作用:初始化
	 * @author galesnjak
	 * @date 2013-07-31
	 * @param context
	 */
	private void initView(Context context){
		Debug.i("SlideMenu", "initView");
		ViewConfiguration configuration =  ViewConfiguration.get(context);
		touchSlop = configuration.getScaledTouchSlop();
		Debug.i("SlideMenu---->touchSlop:::", ""+touchSlop);
		mGestureDetector = new GestureDetector(new CustomerSimpleOnGestureListener());
		setRightViewDefaultWidth(context);
	}
	
	/**
	 * 设置右侧视图默认宽度值
	 * @param context
	 */
	private void setRightViewDefaultWidth(Context context){
		DisplayMetrics metrics = new DisplayMetrics();
		((Activity)context).getWindowManager().getDefaultDisplay().getMetrics(metrics);
		width = metrics.widthPixels;
		Debug.i("SlideMenu---->width:::", ""+width);
	}
	
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev) {
		//如果侧滑栏功能开启,手势监听touch事件
		if(leftSlideEnable){
			mGestureDetector.onTouchEvent(ev);
		}
		return super.dispatchTouchEvent(ev);
	}
	
	@Override
	public boolean onInterceptTouchEvent(MotionEvent ev) {
		//如果侧滑栏功能打开
		if(leftSlideEnable){
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Android 应用程序中实现侧边栏,可以使用 NavigationView 和 DrawerLayout 组件。 以下是实现侧边栏的基本步骤: 1. 首先,在你的布局文件中添加 DrawerLayout 组件,并将其作为根视图。 ``` <android.support.v4.widget.DrawerLayout android:id="@+id/drawer_layout" android:layout_width="match_parent" android:layout_height="match_parent"> //主要内容区域 <FrameLayout android:id="@+id/content_frame" android:layout_width="match_parent" android:layout_height="match_parent" /> //侧边栏 <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start" app:headerLayout="@layout/nav_header" app:menu="@menu/nav_menu" /> </android.support.v4.widget.DrawerLayout> ``` 2. 在 Activity 中,将 NavigationView 组件与 DrawerLayout 组件进行关联,并设置 toggle 按钮。 ``` DrawerLayout drawer = findViewById(R.id.drawer_layout); NavigationView navigationView = findViewById(R.id.nav_view); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); drawer.addDrawerListener(toggle); toggle.syncState(); navigationView.setNavigationItemSelectedListener(this); ``` 3. 创建菜单项和头部布局。 在 res/menu 目录下创建 nav_menu.xml 文件,并在其中定义菜单项。 ``` <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_home" android:icon="@drawable/ic_home" android:title="@string/nav_home" /> <item android:id="@+id/nav_messages" android:icon="@drawable/ic_message" android:title="@string/nav_messages" /> <item android:id="@+id/nav_settings" android:icon="@drawable/ic_settings" android:title="@string/nav_settings" /> </group> </menu> ``` 在 res/layout 目录下创建 nav_header.xml 文件,并在其中定义头部布局。 ``` <ImageView android:id="@+id/nav_header_imageView" android:layout_width="match_parent" android:layout_height="180dp" android:scaleType="centerCrop" android:src="@drawable/header_image" /> <TextView android:id="@+id/nav_header_textView" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" android:paddingBottom="16dp" android:paddingLeft="16dp" android:paddingRight="16dp" android:paddingTop="8dp" android:text="Your Name" android:textAppearance="@style/TextAppearance.AppCompat.Body1" /> ``` 4. 处理菜单项点击事件。 在 Activity 中实现 NavigationView.OnNavigationItemSelectedListener 接口,并处理菜单项点击事件。 ``` @Override public boolean onNavigationItemSelected(MenuItem item) { // Handle navigation view item clicks here. int id = item.getItemId(); if (id == R.id.nav_home) { // Handle the home action } else if (id == R.id.nav_messages) { // Handle the messages action } else if (id == R.id.nav_settings) { // Handle the settings action } DrawerLayout drawer = findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } ``` 这样就可以实现一个基本的侧边栏了。当用户从屏幕的左边缘向右滑动时,侧边栏会出现在屏幕上。用户可以点击菜单项或者在内容区域滑动以关闭侧边栏

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值