您的位置:首页 > 移动开发 > Android开发

侧滑菜单的一点小小的总结

2016-07-24 09:51 459 查看
1.首先在看了别人的一些博客之后,想自己总结一下自己对于Android侧滑菜单的学习

2.试着发表自己的第一篇博客,下面就开始对于侧滑菜单我的学习总结吧:

1.首先我觉得应该着重理解两个方法的含义和使用;

第一个方法:View的getScrollX()方法,对于该方法我在看了许多博客之后的理解是:返回调用该方法的组件的显示部分的最左边的X坐标减去该组件最左边的X坐标;也就是该组件左边没有显示部分的长度;也可以理解成当前组件显示部分的左边到整个组件的左边的距离;

第二个方法:View的smoothScrollTo(int X, int Y)方法:这个方法其实和View中的ScrollTo(int X, int Y)方法是一样的,只不过前者是平稳的滑动,而后者是快速的滑动到指定的位置,两者都是哪个组件调用ScrollTo(x,y)方法就表示将该组件的x,y坐标位置放在显示区域的原点,也可以理解为就将屏幕坐标体系移动x,y处,即从组件x,y处开始显示该组件;

2.理解了这两个方法之后就基本大功告成了,接下来就直接看源码吧:

1)定义一个布局,布局代码如下:其中最外层是自己要自定义的一个SlidingMenu 它继承了HorizontalScrollView,

接下来里面嵌套了一个LinearLayout,LinearLayout中先放置了一个侧滑菜单的布局,再放了一个主内容的布局:里面只是放了一张图片和一个按钮用来切换菜单的显示和隐藏

<com.ecjtu.slidingMenu.SlidingMenu
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:ecjtu="http://schemas.android.com/apk/res/com.ecjtu.slidingMenu"
tools:context="com.ecjtu.slidingMenu.MainActivity"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:scrollbars="none"
android:id="@+id/slidingMenu"
ecjtu:menuRightPadding="150dp">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="horizontal">
<include layout="@layout/test_menu"/>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="@drawable/skin_preview_red_1">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="toggleMenu"
android:text="切换菜单"/>
</LinearLayout>
</LinearLayout>
</com.ecjtu.slidingMenu.SlidingMenu>


2)接下来就来自定义SlidingMenu这个类,里面有获取自定义的属性,也就是自定义了侧滑菜单显示时离屏幕右边的宽度,自定义属性文件也在下面,这里就不多介绍了,里面都有注释,直接看源码:

public class SlidingMenu extends HorizontalScrollView{
//屏幕宽度
private int mScreenWidth;
//菜单显示时离屏幕右边的距离,单位为dp
private int mMenuRightPadding;
//菜单的宽度
private int mMenuWidth;
//菜单的一半宽,等下用来判断是否显示菜单
private int mHalfMenuWidth;
//是否是第一次执行onMeasure()方法
private boolean once=false;
//菜单是否已经显示
private boolean isOpen=false;

public SlidingMenu(Context context, AttributeSet attrs) {
super(context, attrs);
//获取屏幕的宽度
WindowManager wManager=(WindowManager)context
.getSystemService(Context.WINDOW_SERVICE);
DisplayMetrics metrics=new DisplayMetrics();
wManager.getDefaultDisplay().getMetrics(metrics);
mScreenWidth=metrics.widthPixels;
//拿到自定义属性文件中属性组
TypedArray tArray=context.obtainStyledAttributes(attrs, R.styleable.MySlidingMenuAttrs);
//从用户自定义的属性中拿到菜单显示时离屏幕右边的距离,单位为dp,
//但得到的值已经是将dp自动转换为px了,默认为100dp,并且将100dp转换为100px
mMenuRightPadding=tArray.getDimensionPixelSize(
R.styleable.MySlidingMenuAttrs_menuRightPadding,
(int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
100, getResources().getDisplayMetrics()));
//回收资源
tArray.recycle();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
//设置菜单显示的宽度
if (!once) {
LinearLayout layout=(LinearLayout)getChildAt(0);
//获取菜单布局和内容布局
ViewGroup menu=(ViewGroup)layout.getChildAt(0);
ViewGroup content=(ViewGroup)layout.getChildAt(1);
//菜单的宽度=屏幕宽度-菜单显示时离屏幕的右边距
mMenuWidth=mScreenWidth-mMenuRightPadding;
mHalfMenuWidth=mMenuWidth/2;
//将菜单的宽赋给菜单,屏幕的宽赋给屏幕显示的内容
menu.getLayoutParams().width=mMenuWidth;
content.getLayoutParams().width=mScreenWidth;
once=true;
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
//布局发生改变时将菜单隐藏
if (changed) {
//默认将菜单隐藏
this.scrollTo(mMenuWidth, 0);
once=true;
}
}
@Override
public boolean onTouchEvent(MotionEvent ev) {
int action=ev.getAction();
switch (action) {
case MotionEvent.ACTION_UP:
//获取当前组件显示部分的左边到整个组件的左边的距离,如果该距离大于
//菜单宽度的一半就隐藏菜单,小于则显示菜单
int scrollX=getScrollX();
if (scrollX>mHalfMenuWidth) {
//将滚动条向右移动,隐藏菜单,哪个组件调用ScrollTo(x,y)方法就
//表示将该组件的x,y坐标位置放在显示区域的原点,
//也可以理解为就将屏幕坐标体系移动x,y处,即从组件x,y处开始显示该组件
this.smoothScrollTo(mMenuWidth, 0);
isOpen=false;
}else if(scrollX<mHalfMenuWidth){
//将滚动条向左移动,显示菜单
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) {
this.smoothScrollTo(mMenuWidth, 0);
isOpen=false;
}
}
//切换菜单的状态
public void toggle(){
if (isOpen) {
closeMenu();
}else {
openMenu();
}
}
}


自定义的属性资源文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
<declare-styleable name="MySlidingMenuAttrs">
<attr name="menuRightPadding" format="dimension" />
</declare-styleable>
</resources>


3)接下来就可以直接在Activity中使用自定义的SlidingMenu了,代码如下:

public class MainActivity extends Activity {
private SlidingMenu slidingMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
slidingMenu=(SlidingMenu)findViewById(R.id.slidingMenu);
}
//切换菜单的状态
public void toggleMenu(View view){
slidingMenu.toggle();
}
}


4)到此为止,侧滑菜单最简单的实现也就实现完了,之前看过用PopupWindow弹出款的方式来实现ListView中的Item滑动删除的效果,这种方式应该也可以用来实现吧,具体还没去实现,下次实现了再总结吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 侧滑菜单