左侧滑:
右侧滑:
在此之前,我使用网上朋友自定义的侧滑菜单。利用重写布局来控制和实现,但是到最后项目写80%的时候。突然发现跟我的功能产生了冲突。我去,这么凌乱的代码,我也搞不定。所以没办法,就在网上狂搜索,三天之后。搞定了,并成功嵌入到了我的项目中。其中的测试demo如上图!还是别带着好奇去使用那些自定义的侧滑菜单,当你项目马上要结项,你使用该侧滑菜单跟你 的项目功能产生了冲突,你又不能解决,这时候你才叫一个抓狂。
所以,经久的更耐用,人家都是用,当你项目出现问题,才能快熟解决;
好了,看一下怎么使用吧!
/** SlidingMenu 常用属性介绍: */
menu.setMode(SlidingMenu.LEFT);//设置左滑菜单 SlidingMenu.RIGHT SlidingMenu.LEFT_RIGHT 右侧滑/左右侧滑
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);//设置滑动的屏幕局限,该设置为全屏区域都可以滑动
menu.setShadowDrawable(R.drawable.shadow);//设置暗影
menu.setShadowWidthRes(R.dimen.shadow_width);//设置暗影的宽度
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//SlidingMenu划出时主页面显示的残剩宽度
menu.setBehindWidth(400);//设置SlidingMenu菜单的宽度
menu.setFadeDegree(0.35f);//SlidingMenu滑动时的渐变程度
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);//使SlidingMenu附加在Activity上
menu.setMenu(R.layout.menu_layout);//设置menu的布局文件
menu.toggle();//动态断定主动封闭或开启SlidingMenu
menu.showMenu();//显示SlidingMenu
menu.showContent();//显示内容
menu.setOnOpenListener(onOpenListener);//slidingmenu打开关于封闭menu有两个,简单的来说,对于menu close事务,一个是when,一个是after
menu.OnClosedListener(OnClosedListener);//slidingmenu封闭时事务
menu.OnClosedListener(OnClosedListener);//slidingmenu封闭后事务
简单设置左方向菜单侧滑的使用方法:
public class SlidingExample extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTitle(R.string.attach);
// set the content view
setContentView(R.layout.content);
// configure the SlidingMenu
SlidingMenu menu = new SlidingMenu(this);
menu.setMode(SlidingMenu.LEFT);
menu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
menu.setShadowWidthRes(R.dimen.shadow_width);
menu.setShadowDrawable(R.drawable.shadow);
menu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
menu.setFadeDegree(0.35f);
menu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
menu.setMenu(R.layout.menu);
}
}
如果你要设置左右菜单侧滑,看这里:
public class MainActivity extends FragmentActivity {
public SlidingMenu mSlidingMenu;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSlidingMenu = new SlidingMenu(this);
mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
mSlidingMenu.setMenu(R.layout.slidemenu_primary);//左侧滑
mSlidingMenu.setSecondaryMenu(R.layout.slidemenu_secondery);//右侧滑
getSupportFragmentManager().beginTransaction().
replace(R.id.aty_main_framLayout, new ViewPagerFragment()).commit();
getSupportFragmentManager().beginTransaction().
replace(R.id.framLayout_fragment, new TranslationAnimationFragment()).commit();
}
/** 重写返回键和menu键,控制菜单侧滑关闭 */
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
// TODO Auto-generated method stub
switch (keyCode) {
case KeyEvent.KEYCODE_BACK:
if(mSlidingMenu.isMenuShowing())
mSlidingMenu.showContent();
else finish();
return true;
case KeyEvent.KEYCODE_MENU:
mSlidingMenu.showSecondaryMenu();
return true;
}
return super.onKeyDown(keyCode, event);
}
}
下面看一下如何解决侧滑跟ViewPager左右滑动的冲突:《当然,我的源码上展示了怎么使用》
mSlidingMenu.addIgnoredView(viewPager);
在你的Viewpager内容显示之前,调用上面的方法,就Ok了、
SlidingMenu.setTouchModeAbove().其中一共包含三中手势模式:
TOUCHMODE_FULLSCREEN 全屏模式,在正文布局中通过手势也可以打开SlidingMenu
TOUCHMODE_MARGIN 边缘模式,在正文布局的边缘处通过手势可以找开SlidingMenu
TOUCHMODE_NONE 自然是不能通过手势打开SlidingMenu了
当你在设置暗影时,在res/drawable/shadow.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
<gradient
android:centerColor="#11000000"
android:endColor="#00000000"
android:startColor="#33000000" />
</shape>
续写:
其一:在导入工程之后,如果使用到了Actionbar,要把actionbarSherLockLibrary这个类库、SlideMenu类库以及所建立的工程,必须要使用同一个android-support-v4.jar包,(使用自己的工程中的,然后把其他的给替换掉);否则,会报错哦!
其二:当我们导入完成侧滑的效果之后,是不是发现我们所做的侧滑菜单的左右两侧划出来的距离是一样的?答案是必须的,因为源码就是这么做的,并没有给我们写出单独设置某边侧滑——左或者右的距离。那么,这样的话,就要我们自己来设置了。自己看了看源码以及在网上看了看小伙伴们对侧滑的自定义的理解,总结到了,只需要更改几个方法和属性就能完成该功能。让我们自己能够任意设置左右侧滑的宽度!
首先,在源码中的SlidingMenu.java中添加几个方法:
//*********************************自定义扩展侧滑宽度方法********************************************
// 设置右侧边栏菜单展开时距离左边界的偏移量
public void setRightMenuOffset(int offset) {
mViewBehind.setRightWidthOffset(offset);
}
// 设置右侧边栏菜单展开时距离左边界的偏移量
public void setRightMenuOffsetRes(int resId) {
int i = (int) getContext().getResources().getDimension(resId);
setRightMenuOffset(i);
}
// 设置右侧边栏的宽度
@SuppressWarnings("deprecation")
public void setRightBehindWidth(int i) {
int width;
Display display = ((WindowManager) getContext().getSystemService(
Context.WINDOW_SERVICE)).getDefaultDisplay();
try {
Class<?> cls = Display.class;
Class<?>[] parameterTypes = { Point.class };
Point parameter = new Point();
Method method = cls.getMethod("getSize", parameterTypes);
method.invoke(display, parameter);
width = parameter.x;
} catch (Exception e) {
width = display.getWidth();
}
setRightMenuOffset(width - i);
}
// 设置右侧边栏的宽度
public void setRightBehindWidthRes(int res) {
int i = (int) getContext().getResources().getDimension(res);
setRightBehindWidth(i);
}
然后,修改CustomViewBehind.java类
即:1.在源码CustomViewBehind.java类中加入必要的方法:
// ----------------------自定义扩展添加方法----------------------------------------
private int mRightWidthOffset; // 右边宽度偏移量
public void setRightWidthOffset(int i) {
mRightWidthOffset = i;
requestLayout();
}
private int getRightBehindWidth() {
return mSecondaryContent.getWidth();
}
2.修改方法:scrollBehindT( View content , int x , int y );
public void scrollBehindTo(View content, int x, int y) {
int vis = View.VISIBLE;
if (mMode == SlidingMenu.LEFT) {
if (x >= content.getLeft())
vis = View.INVISIBLE;
scrollTo((int) ((x + getBehindWidth()) * mScrollScale), y);
} else if (mMode == SlidingMenu.RIGHT) {
if (x <= content.getLeft())
vis = View.INVISIBLE;
scrollTo(
(int) (getRightBehindWidth() - getWidth() + (x - getRightBehindWidth())
* mScrollScale), y);
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
mContent.setVisibility(x >= content.getLeft() ? View.INVISIBLE
: View.VISIBLE);
mSecondaryContent
.setVisibility(x <= content.getLeft() ? View.INVISIBLE
: View.VISIBLE);
vis = x == 0 ? View.INVISIBLE : View.VISIBLE;
if (x <= content.getLeft()) {
scrollTo((int) ((x + getBehindWidth()) * mScrollScale), y);
} else {
scrollTo(
(int) (getRightBehindWidth() - getWidth() + (x - getRightBehindWidth())
* mScrollScale), y);
}
}
if (vis == View.INVISIBLE)
Log.v(TAG, "behind INVISIBLE");
setVisibility(vis);
}
3.修改方法:getMenuLeft( View content , int page );
public int getMenuLeft(View content, int page) {
if (mMode == SlidingMenu.LEFT) {
switch (page) {
case 0:
return content.getLeft() - getBehindWidth();
case 2:
return content.getLeft();
}
} else if (mMode == SlidingMenu.RIGHT) {
switch (page) {
case 0:
return content.getLeft();
case 2:
return content.getLeft() + getRightBehindWidth();
}
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
switch (page) {
case 0:
return content.getLeft() - getBehindWidth();
case 2:
return content.getLeft() + getRightBehindWidth();
}
}
return content.getLeft();
}
4.修改方法:getAbsRightBound( View content );
public int getAbsRightBound(View content) {
if (mMode == SlidingMenu.LEFT) {
return content.getLeft();
} else if (mMode == SlidingMenu.RIGHT
|| mMode == SlidingMenu.LEFT_RIGHT) {
return content.getLeft() + getRightBehindWidth();
}
return 0;
}
最后,使用 属性变量mRightWidthOffset 和方法 getRightBehindWidth();替换在源码CustomViewBehind.java类中的方法
onLayout(boolean changed, int l, int t, int r, int b);
onMeasure(int widthMeasureSpec, int heightMeasureSpec);
中的变量属性 mWidthOffset ;和中的方法
drawFade(View content, Canvas canvas, float openPercent)
中的 getBehindWidth();具体代码,如下所示:
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
final int width = r - l;
final int height = b - t;
mContent.layout(0, 0, width - mWidthOffset, height);
if (mSecondaryContent != null)
// 这里做了修改
// mSecondaryContent.layout(0, 0, width - mWidthOffset, height);
mSecondaryContent.layout(0, 0, width - mRightWidthOffset, height);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int width = getDefaultSize(0, widthMeasureSpec);
int height = getDefaultSize(0, heightMeasureSpec);
setMeasuredDimension(width, height);
// 这里做了修改
// final int contentWidth = getChildMeasureSpec(widthMeasureSpec, 0, width
// - mWidthOffset);
final int contentWidth = getChildMeasureSpec(widthMeasureSpec, 0, width
- mRightWidthOffset);
final int contentHeight = getChildMeasureSpec(heightMeasureSpec, 0,
height);
mContent.measure(contentWidth, contentHeight);
if (mSecondaryContent != null)
mSecondaryContent.measure(contentWidth, contentHeight);
}
public void drawFade(View content, Canvas canvas, float openPercent) {
if (!mFadeEnabled)
return;
final int alpha = (int) (mFadeDegree * 255 * Math.abs(1 - openPercent));
mFadePaint.setColor(Color.argb(alpha, 0, 0, 0));
int left = 0;
int right = 0;
if (mMode == SlidingMenu.LEFT) {
left = content.getLeft() - getBehindWidth();
right = content.getLeft();
} else if (mMode == SlidingMenu.RIGHT) {
left = content.getRight();
right = content.getRight() + getBehindWidth();
} else if (mMode == SlidingMenu.LEFT_RIGHT) {
left = content.getLeft() - getRightBehindWidth();//替换原先的getBehindWidth();
right = content.getLeft();
canvas.drawRect(left, 0, right, getHeight(), mFadePaint);
left = content.getRight();
right = content.getRight() + getRightBehindWidth();//替换原先的getBehindWidth();
}
canvas.drawRect(left, 0, right, getHeight(), mFadePaint);
}
最后的最后,在控制侧滑菜单的Activity类中添加几句代码就搞定了:
mSlidingMenu = new SlidingMenu(this);
mSlidingMenu.setMode(SlidingMenu.LEFT_RIGHT);
mSlidingMenu.setBehindOffsetRes(R.dimen.slidingmenu_offset);//左右侧滑距离
mSlidingMenu.setRightMenuOffsetRes(R.dimen.slidingmenu_right_offset);//重写右边侧滑的距离
mSlidingMenu.setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
mSlidingMenu.attachToActivity(this, SlidingMenu.SLIDING_CONTENT);
mSlidingMenu.setMenu(R.layout.slidemenu_primary);
mSlidingMenu.setSecondaryMenu(R.layout.slidemenu_secondery);
getSupportFragmentManager().beginTransaction().
replace(R.id.aty_main_framLayout, new ViewPagerFragment()).commit();
getSupportFragmentManager().beginTransaction().
replace(R.id.framLayout_fragment, new TranslationAnimationFragment()).commit();