![滑动事件实现侧边栏_第1页](http://file4.renrendoc.com/view/f69a24d06d53abe3697d229d97aa6aeb/f69a24d06d53abe3697d229d97aa6aeb1.gif)
![滑动事件实现侧边栏_第2页](http://file4.renrendoc.com/view/f69a24d06d53abe3697d229d97aa6aeb/f69a24d06d53abe3697d229d97aa6aeb2.gif)
![滑动事件实现侧边栏_第3页](http://file4.renrendoc.com/view/f69a24d06d53abe3697d229d97aa6aeb/f69a24d06d53abe3697d229d97aa6aeb3.gif)
![滑动事件实现侧边栏_第4页](http://file4.renrendoc.com/view/f69a24d06d53abe3697d229d97aa6aeb/f69a24d06d53abe3697d229d97aa6aeb4.gif)
![滑动事件实现侧边栏_第5页](http://file4.renrendoc.com/view/f69a24d06d53abe3697d229d97aa6aeb/f69a24d06d53abe3697d229d97aa6aeb5.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
滑动事件实现侧边栏一、实现方式一2效果图如下:一、实现方式一3<LinearLayoutxmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
tools:context=".MainActivity">
<LinearLayout
android:id="@+id/menu"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#abf">
</LinearLayout>
<LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:background="#bfa">
</LinearLayout>
</LinearLayout>页面布局代码:一、实现方式一4publicclassMainActivityextendsActivityimplementsView.OnTouchListener{
privateLinearLayoutmenuLayout;//菜单项
privateLinearLayoutcontentLayout;//内容项
privateLinearLayout.LayoutParamsmenuParams;//菜单项目的参数
privateLinearLayout.LayoutParamscontentParams;//内容项目的参数contentLayout的宽度值
privateintdisPlayWidth;//手机屏幕分辨率
privatefloatxDown;//手指点下去的横坐标
privatefloatxMove;//手指移动的横坐标
privatefloatxUp;//记录手指上抬后的横坐标
privateVelocityTrackermVelocityTracker;//用于计算手指滑动的速度。
floatvelocityX;//手指左右移动的速度
publicstaticfinalintSNAP_VELOCITY=400;//滚动显示和隐藏menu时,手指滑动需要达到的速度。
privatebooleanmenuIsShow=false;//初始化菜单项不可翙
privatestaticfinalintmenuPadding=80;//menu完成显示,留给content的宽度
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
initLayoutParams();
}后台控制代码-片段一一、实现方式一5/**
*初始化Layout并设置其相应的参数
*/
privatevoidinitLayoutParams()
{
//得到屏幕的大小
DisplayMetricsdm=newDisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
disPlayWidth=dm.widthPixels;
//获得控件
menuLayout=(LinearLayout)findViewById(R.id.menu);
contentLayout=(LinearLayout)findViewById(R.id.content);
findViewById(R.id.layout).setOnTouchListener(this);
//获得控件参数
menuParams=(LinearLayout.LayoutParams)menuLayout.getLayoutParams();
contentParams=(LinearLayout.LayoutParams)contentLayout.getLayoutParams();
//初始化菜单和内容的宽和边距
menuParams.width=disPlayWidth-menuPadding;
menuParams.leftMargin=0-menuParams.width;
contentParams.width=disPlayWidth;
contentParams.leftMargin=0;
//设置参数
menuLayout.setLayoutParams(menuParams);
contentLayout.setLayoutParams(contentParams);
}后台控制代码-片段二一、实现方式一6@Override
publicbooleanonTouch(Viewv,MotionEventevent)
{
acquireVelocityTracker(event);
switch(event.getAction())
{
caseMotionEvent.ACTION_DOWN:
xDown=event.getRawX();
break;
caseMotionEvent.ACTION_MOVE:
xMove=event.getRawX();
isScrollToShowMenu();
break;
caseMotionEvent.ACTION_UP:
xUp=event.getRawX();
isShowMenu();
releaseVelocityTracker();
break;
caseMotionEvent.ACTION_CANCEL:
releaseVelocityTracker();
break;
}
returntrue;
}后台控制代码-片段三一、实现方式一7/**
*根据手指按下的距离,判断是否滚动显示菜单
*/
privatevoidisScrollToShowMenu()
{
intdistanceX=(int)(xMove-xDown);
if(!menuIsShow){
scrollToShowMenu(distanceX);
}else{
scrollToHideMenu(distanceX);
}
}/**
*手指抬起之后判断是否要显示菜单
*/
privatevoidisShowMenu()
{
velocityX=getScrollVelocity();
if(wantToShowMenu()){
if(shouldShowMenu()){
showMenu();
}else{
hideMenu();
}
}
elseif(wantToHideMenu()){
if(shouldHideMenu()){
hideMenu();
}else{
showMenu();
}
}
}后台控制代码-片段四后台控制代码-片段五一、实现方式一8/**
*想要显示菜单,当向右移动距离大于0并且菜单不可见
*/
privatebooleanwantToShowMenu(){
return!menuIsShow&&xUp-xDown>0;
}
/**
*想要隐藏菜单,当向左移动距离大于0并且菜单可见
*/
privatebooleanwantToHideMenu(){
returnmenuIsShow&&xDown-xUp>0;
}
/**
*判断应该显示菜单,当向右移动的距离超过菜单的一半或者速度超过给定值
*/
privatebooleanshouldShowMenu(){
returnxUp-xDown>menuParams.width/2||velocityX>SNAP_VELOCITY;
}
/**
*判断应该隐藏菜单,当向左移动的距离超过菜单的一半或者速度超过给定值
*/
privatebooleanshouldHideMenu(){
returnxDown-xUp>menuParams.width/2||velocityX>SNAP_VELOCITY;
}后台控制代码-片段六一、实现方式一9/**
*显示菜单栏
*/
privatevoidshowMenu()
{
newshowMenuAsyncTask().execute(50);
menuIsShow=true;
}
/**
*隐藏菜单栏
*/
privatevoidhideMenu()
{
newshowMenuAsyncTask().execute(-50);
menuIsShow=false;
}
/**
*指针按着时,滚动将菜单慢慢显示出来
*@paramscrollX每次滚动移动的距离
*/
privatevoidscrollToShowMenu(intscrollX)
{
if(scrollX>0&&scrollX<=menuParams.width)
menuParams.leftMargin=-menuParams.width+scrollX;
menuLayout.setLayoutParams(menuParams);
}/**
*指针按着时,滚动将菜单慢慢隐藏出来
*@paramscrollX每次滚动移动的距离
*/
privatevoidscrollToHideMenu(intscrollX)
{
if(scrollX>=-menuParams.width&&scrollX<0)
menuParams.leftMargin=scrollX;
menuLayout.setLayoutParams(menuParams);
}
/**
*创建VelocityTracker对象,并将触摸content界面的滑动事件加入到VelocityTracker当中。
*@paramevent向VelocityTracker添加MotionEvent
*/
privatevoidacquireVelocityTracker(finalMotionEventevent){
if(null==mVelocityTracker){
mVelocityTracker=VelocityTracker.obtain();
}
mVelocityTracker.addMovement(event);
}后台控制代码-片段七后台控制代码-片段八一、实现方式一10/**
*获取手指在content界面滑动的速度。
*@return滑动速度,以每秒钟移动了多少像素值为单位。
*/
privateintgetScrollVelocity(){
mVelocityTputeCurrentVelocity(1000);
intvelocity=(int)mVelocityTracker.getXVelocity();
returnMath.abs(velocity);
}
/**
*释放VelocityTracker
*/
privatevoidreleaseVelocityTracker(){
if(null!=mVelocityTracker){
mVelocityTracker.clear();
mVelocityTracker.recycle();
mVelocityTracker=null;
}
}后台控制代码-片段九一、实现方式一11/**
*
*:模拟动画过程,让肉眼能看到滚动的效果
*
*/
classshowMenuAsyncTaskextendsAsyncTask<Integer,Integer,Integer>
{
@Override
protectedIntegerdoInBackground(Integer...params)
{
intleftMargin=menuParams.leftMargin;
while(true)
{//根据传入的速度来滚动界面,当滚动到达左边界或右边界时,跳出循环。
leftMargin+=params[0];
if(params[0]>0&&leftMargin>0)
{
leftMargin=0;
break;
}elseif(params[0]<0&&leftMargin<-menuParams.width)
{
leftMargin=-menuParams.width;
break;
}
publishProgress(leftMargin);
try
{
Thread.sleep(40);//休眠一下,肉眼才能看到滚动效果
}catch(Interru
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【正版授权】 IEC 62554:2011 EN-FR Sample preparation for measurement of mercury level in fluorescent lamps
- 【正版授权】 IEC 62541-11:2015 EN-FR OPC Unified Architecture - Part 11: Historical Access
- 加强医院的医疗安全管理措施三篇
- 城市道路绿化工程总包招标合同
- 新生儿科护士长全年工作计划三篇
- 乌鲁木齐太阳能发电站建设合同
- 营养与糖尿病科护理工作绩效总结
- 物联网技术投资合作协议
- 国内贸易融资合同
- 学而不止助推学生个人发展的秋季教学工作计划三篇
- 江苏省常州市教育学会2023-2024学年七年级下学期期末数学试题
- 国开机考答案-工程力学(本)(闭卷)
- 2024年湖北宜昌高新区专项招聘中小学及幼儿园教师68人历年高频考题难、易错点模拟试题(共500题)附带答案详解
- 2023版设备管理体系标准
- (完整)注册安全工程师考试题库及答案(通用版)
- 中英文版送货单
- 毛笔字描红字帖(共11页)
- 黑龙江省劳动合同
- 王庆丰奇门风水案例
- 班组汇报材料(ppt)
- [表格类模板]报验表格3903
评论
0/150
提交评论