滑动事件实现侧边栏_第1页
滑动事件实现侧边栏_第2页
滑动事件实现侧边栏_第3页
滑动事件实现侧边栏_第4页
滑动事件实现侧边栏_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

滑动事件实现侧边栏一、实现方式一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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论