全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android实现3种侧滑效果(仿qq侧滑、抽屉侧滑、普通侧滑)

自己实现了一下侧滑的三种方式(注释都写代码里了)

本文Demo下载地址:Andriod侧滑

本文实现所需框架:nineoldandroids下载地址:nineoldandroids

1.普通侧滑:

主要是基于HorizontalScrollView做的:示例代码如下

主要布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

 xmlns:gaoyu="http://schemas.android.com/apk/res/gaoyu.com.myapplication"

 xmlns:tools="http://schemas.android.com/tools"
 android:id="@+id/activity_qqsideslip"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 tools:context="gaoyu.com.myapplication.sideslip.QQSideslipActivity">

 <!--xmlns:gaoyu自定义命名空间 原有到res+包名-->

 <gaoyu.com.myapplication.sideslip.SlidingMenu_qq
 android:id="@+id/SlMenu_sideslip"
 android:layout_width="wrap_content"
 android:layout_height="fill_parent"
 gaoyu:rightPadding="100dp">

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

 <include layout="@layout/sideslip_menu" />
 <!--这个LinearLayout就是content-->
 <LinearLayout

 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="@drawable/sliding">

 <Button
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:onClick="onClick_sideslip_qq"
 android:text="切换菜单" />
 </LinearLayout>

 </LinearLayout>
 </gaoyu.com.myapplication.sideslip.SlidingMenu_qq>


</RelativeLayout>

菜单的布局

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical">

 <LinearLayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:orientation="vertical"
 android:layout_centerInParent="true">
 <RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
 android:id="@+id/iv_sideslip1"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginTop="20dp"
 android:layout_marginBottom="20dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/icon"/>
 <TextView
 android:layout_centerVertical="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/iv_sideslip1"
 android:layout_marginLeft="20dp"
 android:text="第一个item"/>
 </RelativeLayout>
 <RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
 android:id="@+id/iv_sideslip2"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginTop="20dp"
 android:layout_marginBottom="20dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/icon"/>
 <TextView
 android:layout_centerVertical="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/iv_sideslip2"
 android:layout_marginLeft="20dp"
 android:text="第二个item"/>
 </RelativeLayout><RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
 android:id="@+id/iv_sideslip3"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginTop="20dp"
 android:layout_marginBottom="20dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/icon"/>
 <TextView
 android:layout_centerVertical="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/iv_sideslip3"
 android:layout_marginLeft="20dp"
 android:text="第三个item"/>
 </RelativeLayout><RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
 android:id="@+id/iv_sideslip4"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginTop="20dp"
 android:layout_marginBottom="20dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/icon"/>
 <TextView
 android:layout_centerVertical="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/iv_sideslip4"
 android:layout_marginLeft="20dp"
 android:text="第四个item"/>
 </RelativeLayout><RelativeLayout
 android:layout_width="fill_parent"
 android:layout_height="wrap_content">
 <ImageView
 android:id="@+id/iv_sideslip5"
 android:layout_width="50dp"
 android:layout_height="50dp"
 android:layout_marginTop="20dp"
 android:layout_marginBottom="20dp"
 android:layout_marginLeft="20dp"
 android:src="@drawable/icon"/>
 <TextView
 android:layout_centerVertical="true"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:layout_toRightOf="@+id/iv_sideslip5"
 android:layout_marginLeft="20dp"
 android:text="第五个item"/>
 </RelativeLayout>
 </LinearLayout>

</RelativeLayout>

定义view类

public class SlidingMenu_qq extends HorizontalScrollView {

 private LinearLayout mWapper;
 private ViewGroup mMenu;
 private ViewGroup mContent;
 //menu的宽度
 private int mMenuWidth;
 //屏幕的宽度(内容区的宽度就是屏幕宽度)
 private int mScreenWdith;
 //菜单与右边的距离50dp
 private int mMenuRightPidding = 50;
 //调用一次
 private boolean once;
 //标识状态
 private boolean isOPen;

 /**
 * 未使用自定义属性时调用
 * 由于设置了attr所以...
 *
 * @param context
 * @param attrs
 */
 public SlidingMenu_qq(Context context, AttributeSet attrs) {
 //调用三个参数的构造方法
 this(context, attrs, 0);
 //获取屏幕宽度(窗口管理器)
 /*WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
 //展示度量
 DisplayMetrics outMetrics = new DisplayMetrics();
 wm.getDefaultDisplay().getMetrics(outMetrics);
 mScreenWdith = outMetrics.widthPixels;
 //把dp转换成px
 mMenuRightPidding = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics());
*/
 }

 /**
 * 当实现自定义属性时会执行三个参数的方法
 *
 * @param context
 * @param attrs
 * @param defStyleAttr
 */
 public SlidingMenu_qq(Context context, AttributeSet attrs, int defStyleAttr) {
 super(context, attrs, defStyleAttr);

 //获取自定义的属性

 TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.SlidingMenu_qq, defStyleAttr, 0);
 //自定义属性个数
 int n = a.getIndexCount();
 for (int i = 0; i < n; i++) {
 int attr = a.getIndex(i);
 switch (attr) {
 case R.styleable.SlidingMenu_qq_rightPadding:
 //设置默认值是50dp
 mMenuRightPidding = a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 50, context.getResources().getDisplayMetrics()));

 break;
 }

 }
 //释放一下
 a.recycle();

 //获取屏幕宽度(窗口管理器)
 WindowManager wm = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
 //展示度量
 DisplayMetrics outMetrics = new DisplayMetrics();
 wm.getDefaultDisplay().getMetrics(outMetrics);
 mScreenWdith = outMetrics.widthPixels;

 }

 /**
 * new 一个TextView时传一个上下文
 *
 * @param context
 */
 public SlidingMenu_qq(Context context) {
 //调用两个参数的构造方法
 super(context, null);
 }

 /**
 * 设置HorizontalScrollView子VIew的宽和高
 * 设置HorizontalScrollView自己的宽和高
 *
 * @param widthMeasureSpec
 * @param heightMeasureSpec
 */
 @Override
 protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
 //设置循环之调用一次
 if (!once) {
 //HorizontalScrollView 内部只能有一个元素 所以直接get(0)就行就是那个Linerlayout mWapper
 mWapper = (LinearLayout) getChildAt(0);
 //获取mWapper里的第一个元素menu
 mMenu = (ViewGroup) mWapper.getChildAt(0);
 //获取mWapper里的第二个元素content
 mContent = (ViewGroup) mWapper.getChildAt(1);
 //菜单和内容宽度
 mMenuWidth = mMenu.getLayoutParams().width = mScreenWdith - mMenuRightPidding;
 mContent.getLayoutParams().width = mScreenWdith;
 //由于子对象被设置了,mWapper就先不用了
 once = true;
 }
 super.onMeasure(widthMeasureSpec, heightMeasureSpec);
 }

 /**
 * 通过设置偏移量 将menu隐藏
 * @param changed
 * @param l
 * @param t
 * @param r
 * @param b
 */
 @Override
 protected void onLayout(boolean changed, int l, int t, int r, int b) {
 super.onLayout(changed, l, t, r, b);
 //限制多次调用
 if (changed) {
 //x为正滚动条向右 内容向左(移动mMenuWidth 正好将菜单隐藏)
 this.scrollTo(mMenuWidth, 0);
 }
 }

 /**
 * 判断将菜单滑出来多少了
 *
 * @param ev
 * @return
 */
 @Override
 public boolean onTouchEvent(MotionEvent ev) {
 int action = ev.getAction();
 switch (action) {
 case MotionEvent.ACTION_UP:
 //隐藏在左边的宽度
 int scrollX = getScrollX();
 if (scrollX >= mMenuWidth / 2) {
 //scrollTo也行但是动画效果不好 (隐藏)
 this.smoothScrollTo(mMenuWidth, 0);
 //代表菜单隐藏
 isOPen = false;
 } else {
 this.smoothScrollTo(0, 0);
 //表菜单打开
 isOPen = true;
 }
 return true;
 }
 return super.onTouchEvent(ev);
 }

 /**
 * 打开菜单
 */
 public void openMenu() {
 //已经打开
 if (isOPen) return;
 this.smoothScrollTo(0, 0);
 isOPen = true;
 }

 /**
 * 关闭菜单
 */
 public void closeMenu() {
 //正在打开
 if (!isOPen) return;
 this.smoothScrollTo(mMenuWidth, 0);
 isOPen = false;
 }

 /**
 * 切换菜单
 */
 public void toggle(){
 if (isOPen){
 closeMenu();
 }else {
 openMenu();
 }
 }
}

2.抽屉侧滑(添加此方法)

/**
 * 实现抽屉滑动
 * l隐藏在左边的宽度
 * 后边是变化梯度
 */

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
 super.onScrollChanged(l, t, oldl, oldt);
 float scale = l*1.0f/mMenuWidth;//1~0梯度的值
 //调用属性动画
 ViewHelper.setTranslationX(mMenu,mMenuWidth*scale);
 }


3.qq5.0侧滑,实现这个方法

 /**
 * 实现仿qq5.0
 * l等于隐藏在左边的宽度(越来越小)
 * 后边是变化梯度
 */

 @Override
 protected void onScrollChanged(int l, int t, int oldl, int oldt) {
 super.onScrollChanged(l, t, oldl, oldt);
 float scale = l * 1.0f / mMenuWidth;//1~0梯度的值

 //调用属性动画

 //菜单的缩放操作
 float leftScale = 1.0f-scale*0.3f;
 //透明度
 float leftAlpha = 0.6f + 0.4f*(1-scale);
 ViewHelper.setTranslationX(mMenu, mMenuWidth * scale*0.8f);
 ViewHelper.setScaleX(mMenu,leftScale);
 ViewHelper.setScaleY(mMenu,leftScale);
 ViewHelper.setAlpha(mMenu,leftAlpha);

 //内容区域不断缩小
 float rightScale = 0.7f+0.3f*scale;
 //横向纵向缩放(不更改缩放中心点就全隐藏了)
 ViewHelper.setPivotX(mContent,0);
 ViewHelper.setPivotY(mContent,mContent.getHeight()/2);
 ViewHelper.setScaleX(mContent,rightScale);
 ViewHelper.setScaleY(mContent,rightScale);

 }

更多学习内容,可以点击《Android侧滑效果汇总》学习。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


# Android仿qq侧滑  # Android抽屉侧滑  # Android侧滑效果  # Android解决viewpager嵌套滑动冲突并保留侧滑菜单功能  # Android仿微信联系人列表字母侧滑控件  # Android_UI 仿QQ侧滑菜单效果的实现  # Android 仿京东侧滑筛选实例代码  # android RecyclerView侧滑菜单  # 滑动删除  # 长按拖拽  # 下拉刷新上拉加载  # Android recyclerview实现拖拽排序和侧滑删除  # android的RecyclerView实现拖拽排序和侧滑删除示例  # Android侧滑导航栏的实例代码  # Android 侧滑关闭Activity的实例  # 自定义  # 第一个  # 下载地址  # 第二个  # 管理器  # 自己的  # 中心点  # 所需  # 就行  # 用了  # 三种  # 第三个  # 转换成  # 就先  # 也行  # 里了  # 大家多多  # 就全  # 都写  # 有一个 


相关文章: 非常酷的网站设计制作软件,酷培ai教育官方网站?  电商网站制作价格怎么算,网上拍卖流程以及规则?  大连网站制作公司哪家好一点,大连买房网站哪个好?  5种Android数据存储方式汇总  定制建站如何定义?其核心优势是什么?  如何使用Golang table-driven基准测试_多组数据测量函数效率  北京网站制作的公司有哪些,北京白云观官方网站?  建站之星好吗?新手能否轻松上手建站?  网站制作知乎推荐,想做自己的网站用什么工具比较好?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  一键网站制作软件,义乌购一件代发流程?  宁波自助建站系统如何快速打造专业企业网站?  如何快速查询域名建站关键信息?  活动邀请函制作网站有哪些,活动邀请函文案?  建站主机解析:虚拟主机配置与服务器选择指南  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  建站之星展会模版如何一键下载生成?  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  家庭服务器如何搭建个人网站?  建站之星微信建站一键生成小程序+多端营销系统  如何在建站宝盒中设置产品搜索功能?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  网站专业制作公司有哪些,做一个公司网站要多少钱?  建站之星Pro快速搭建教程:模板选择与功能配置指南  怎么用手机制作网站链接,dw怎么把手机适应页面变成网页?  手机怎么制作网站教程步骤,手机怎么做自己的网页链接?  如何快速查询网址的建站时间与历史轨迹?  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何用已有域名快速搭建网站?  如何自定义建站之星网站的导航菜单样式?  建站之星导航如何优化提升用户体验?  如何通过虚拟主机快速搭建个人网站?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  已有域名建站全流程解析:网站搭建步骤与建站工具选择  网页设计与网站制作内容,怎样注册网站?  电视网站制作tvbox接口,云海电视怎样自定义添加电视源?  招商网站制作流程,网站招商广告语?  建站中国官网:模板定制+SEO优化+建站流程一站式指南  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  如何在云主机上快速搭建多站点网站?  如何登录建站主机?访问步骤全解析  英语简历制作免费网站推荐,如何将简历翻译成英文?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  设计网站制作公司有哪些,制作网页教程?  如何通过二级域名建站提升品牌影响力?  长春网站建设制作公司,长春的网络公司怎么样主要是能做网站的?  营销式网站制作方案,销售哪个网站招聘效果最好?  中山网站制作网页,中山新生登记系统登记流程?  高防服务器:AI智能防御DDoS攻击与数据安全保障 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。