本文出自Cym的博客(http://blog.csdn.net/cym492224103

ResideMenu

github:https://github.com/SpecialCyCi/AndroidResideMenu

csdn:http://download.csdn.net/detail/cym492224103/7887801

先看看如何使用:

把项目源码下载下来导入工程,可以看到

ResideMenu为引用工程,再看看如何使用这个引用工程来构建出ResideMenu,

1.先new一个ResideMenu对象

[java] view plaincopyprint?
  1. resideMenu = new ResideMenu(this);

2.设置它的背景图片

[java] view plaincopyprint?
  1. resideMenu.setBackground(R.drawable.menu_background);

3.绑定当前Activity

[java] view plaincopyprint?
  1. resideMenu.attachToActivity(this);

4.设置监听

[java] view plaincopyprint?
  1. resideMenu.setMenuListener(menuListener);

可以监听菜单打开和关闭状态

[java] view plaincopyprint?
  1. private ResideMenu.OnMenuListener menuListener = new ResideMenu.OnMenuListener() {
  2. @Override
  3. public void openMenu() {
  4. Toast.makeText(mContext, "Menu is opened!", Toast.LENGTH_SHORT).show();
  5. }
  6. @Override
  7. public void closeMenu() {
  8. Toast.makeText(mContext, "Menu is closed!", Toast.LENGTH_SHORT).show();
  9. }
  10. };

5.设置内容缩放比例(0.1~1f)

[java] view plaincopyprint?
  1. //valid scale factor is between 0.0f and 1.0f. leftmenu'width is 150dip.
  2. resideMenu.setScaleValue(0.6f);

6.创建子菜单

[java] view plaincopyprint?
  1. // create menu items;
  2. itemHome     = new ResideMenuItem(this, R.drawable.icon_home,     "Home");
  3. itemProfile  = new ResideMenuItem(this, R.drawable.icon_profile,  "Profile");
  4. itemCalendar = new ResideMenuItem(this, R.drawable.icon_calendar, "Calendar");
  5. itemSettings = new ResideMenuItem(this, R.drawable.icon_settings, "Settings");

7.设置点击事件及将刚创建的子菜单添加到侧换菜单中(可以看到它是通过常量来控制子菜单的添加位置)

[java] view plaincopyprint?
  1. itemHome.setOnClickListener(this);
  2. itemProfile.setOnClickListener(this);
  3. itemCalendar.setOnClickListener(this);
  4. itemSettings.setOnClickListener(this);
  5. resideMenu.addMenuItem(itemHome, ResideMenu.DIRECTION_LEFT);
  6. resideMenu.addMenuItem(itemProfile, ResideMenu.DIRECTION_LEFT);
  7. resideMenu.addMenuItem(itemCalendar, ResideMenu.DIRECTION_RIGHT);
  8. resideMenu.addMenuItem(itemSettings, ResideMenu.DIRECTION_RIGHT);

8.设置title按钮的点击事件,设置左右菜单的开关

[java] view plaincopyprint?
  1. // You can disable a direction by setting ->
  2. // resideMenu.setSwipeDirectionDisable(ResideMenu.DIRECTION_RIGHT);
  3. findViewById(R.id.title_bar_left_menu).setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View view) {
  6. resideMenu.openMenu(ResideMenu.DIRECTION_LEFT);
  7. }
  8. });
  9. findViewById(R.id.title_bar_right_menu).setOnClickListener(new View.OnClickListener() {
  10. @Override
  11. public void onClick(View view) {
  12. resideMenu.openMenu(ResideMenu.DIRECTION_RIGHT);
  13. }
  14. });

9.还重写了dispatchTouchEvent

[java] view plaincopyprint?
  1. @Override
  2. public boolean dispatchTouchEvent(MotionEvent ev) {
  3. return resideMenu.dispatchTouchEvent(ev);
  4. }

10.菜单关闭方法

[java] view plaincopyprint?
  1. resideMenu.closeMenu();

11.屏蔽菜单方法

[java] view plaincopyprint?
  1. // You can disable a direction by setting ->
  2. // resideMenu.setSwipeDirectionDisable(ResideMenu.DIRECTION_RIGHT);

使用方法已经说完了,接下来,看看它的源码,先看看源码的项目结构。

很多人初学者都曾纠结,看源码,如何从何看起,我个人建议从上面使用的顺序看起,并且在看的时候要带个问题去看去思考,这样更容易理解。

上面的第一步是,创建ResideMenu对象,我们就看看ResideMenu的构造。

[java] view plaincopyprint?
  1. public ResideMenu(Context context) {
  2. super(context);
  3. initViews(context);
  4. }

从上面代码,看到构造里面就一个初始化view,思考问题:如何初始化view及初始化了什么view。

[java] view plaincopyprint?
  1. private void initViews(Context context){
  2. LayoutInflater inflater = (LayoutInflater)
  3. context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  4. inflater.inflate(R.layout.residemenu, this);
  5. scrollViewLeftMenu = (ScrollView) findViewById(R.id.sv_left_menu);
  6. scrollViewRightMenu = (ScrollView) findViewById(R.id.sv_right_menu);
  7. imageViewShadow = (ImageView) findViewById(R.id.iv_shadow);
  8. layoutLeftMenu = (LinearLayout) findViewById(R.id.layout_left_menu);
  9. layoutRightMenu = (LinearLayout) findViewById(R.id.layout_right_menu);
  10. imageViewBackground = (ImageView) findViewById(R.id.iv_background);
  11. }

原理分析:从上面的代码可以看到,加载了一个residemenu的布局,先看布局

[java] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent">
  5. <ImageView
  6. android:id="@+id/iv_background"
  7. android:adjustViewBounds="true"
  8. android:scaleType="centerCrop"
  9. android:layout_width="match_parent"
  10. android:layout_height="match_parent"/>
  11. <ImageView
  12. android:id="@+id/iv_shadow"
  13. android:background="@drawable/shadow"
  14. android:layout_width="fill_parent"
  15. android:layout_height="fill_parent"
  16. android:scaleType="fitXY"/>
  17. <ScrollView
  18. android:id="@+id/sv_left_menu"
  19. android:scrollbars="none"
  20. android:paddingLeft="30dp"
  21. android:layout_width="150dp"
  22. android:layout_height="fill_parent">
  23. <LinearLayout
  24. android:id="@+id/layout_left_menu"
  25. android:orientation="vertical"
  26. android:layout_gravity="center_vertical"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content">
  29. </LinearLayout>
  30. </ScrollView>
  31. <ScrollView
  32. android:id="@+id/sv_right_menu"
  33. android:scrollbars="none"
  34. android:paddingRight="30dp"
  35. android:layout_width="150dp"
  36. android:layout_height="fill_parent"
  37. android:layout_gravity="right">
  38. <LinearLayout
  39. android:id="@+id/layout_right_menu"
  40. android:orientation="vertical"
  41. android:layout_gravity="center_vertical"
  42. android:layout_width="wrap_content"
  43. android:layout_height="wrap_content"
  44. android:gravity="right">
  45. </LinearLayout>
  46. </ScrollView>
  47. </FrameLayout>

布局显示效果


从布局文件,以及显示效果我们可以看到,它是一个帧布局,第一个ImageView是背景,第二个ImageView是.9的阴影效果的图片(看下面的图),

两个(ScrollView包裹着一个LinerLayout),可以从上面图看到结构分别是左菜单和右菜单

[java] view plaincopyprint?
  1. <img src="https://img-blog.csdn.net/20140910100807704?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3ltNDkyMjI0MTAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" style="font-family: Arial; background-color: rgb(255, 255, 255);" alt="" />

1.初始化布局以及布局文件分析完毕,2.接下来是设置背景图,初始化view的时候就已经拿到了背景控件,所以设置背景图也是非常好实现的事情了。

[java] view plaincopyprint?
  1. public void setBackground(int imageResrouce){
  2. imageViewBackground.setImageResource(imageResrouce);
  3. }

3.绑定activity,思考问题:它做了什么?

[java] view plaincopyprint?
  1. /**
  2. * use the method to set up the activity which residemenu need to show;
  3. *
  4. * @param activity
  5. */
  6. public void attachToActivity(Activity activity){
  7. initValue(activity);
  8. setShadowAdjustScaleXByOrientation();
  9. viewDecor.addView(this, 0);
  10. setViewPadding();
  11. }

原理分析:绑定activity做了4件事情,分别是:

1.初始化参数:

[java] view plaincopyprint?
  1. private void initValue(Activity activity){
  2. this.activity   = activity;
  3. leftMenuItems   = new ArrayList<ResideMenuItem>();
  4. rightMenuItems  = new ArrayList<ResideMenuItem>();
  5. ignoredViews    = new ArrayList<View>();
  6. viewDecor = (ViewGroup) activity.getWindow().getDecorView();
  7. viewActivity = new TouchDisableView(this.activity);
  8. View mContent   = viewDecor.getChildAt(0);
  9. viewDecor.removeViewAt(0);
  10. viewActivity.setContent(mContent);
  11. addView(viewActivity);
  12. ViewGroup parent = (ViewGroup) scrollViewLeftMenu.getParent();
  13. parent.removeView(scrollViewLeftMenu);
  14. parent.removeView(scrollViewRightMenu);
  15. }

2.正对横竖屏缩放比例进行调整

[java] view plaincopyprint?
  1. private void setShadowAdjustScaleXByOrientation(){
  2. int orientation = getResources().getConfiguration().orientation;
  3. if (orientation == Configuration.ORIENTATION_LANDSCAPE) {
  4. shadowAdjustScaleX = 0.034f;
  5. shadowAdjustScaleY = 0.12f;
  6. } else if (orientation == Configuration.ORIENTATION_PORTRAIT) {
  7. shadowAdjustScaleX = 0.06f;
  8. shadowAdjustScaleY = 0.07f;
  9. }
  10. }

3.添加当前view

[java] view plaincopyprint?
  1. viewDecor.addView(this, 0);

4.设置view边距

[java] view plaincopyprint?
  1. /**
  2. * we need the call the method before the menu show, because the
  3. * padding of activity can't get at the moment of onCreateView();
  4. */
  5. private void setViewPadding(){
  6. this.setPadding(viewActivity.getPaddingLeft(),
  7. viewActivity.getPaddingTop(),
  8. viewActivity.getPaddingRight(),
  9. viewActivity.getPaddingBottom());
  10. }

4.设置监听,思考问题:它什么时候调用监听,原理分析:动画监听开始执行动画掉哦那个openMenu动画结束调用closeMenu,从此我们可以想到,但它调用openMenu( int  direction)和closeMenu()都会设置这个监听。

[java] view plaincopyprint?
  1. private Animator.AnimatorListener animationListener = new Animator.AnimatorListener() {
  2. @Override
  3. public void onAnimationStart(Animator animation) {
  4. if (isOpened()){
  5. showScrollViewMenu();
  6. if (menuListener != null)
  7. menuListener.openMenu();
  8. }
  9. }
  10. @Override
  11. public void onAnimationEnd(Animator animation) {
  12. // reset the view;
  13. if(isOpened()){
  14. viewActivity.setTouchDisable(true);
  15. viewActivity.setOnClickListener(viewActivityOnClickListener);
  16. }else{
  17. viewActivity.setTouchDisable(false);
  18. viewActivity.setOnClickListener(null);
  19. hideScrollViewMenu();
  20. if (menuListener != null)
  21. menuListener.closeMenu();
  22. }
  23. }
  24. @Override
  25. public void onAnimationCancel(Animator animation) {
  26. }
  27. @Override
  28. public void onAnimationRepeat(Animator animation) {
  29. }
  30. };

5. 设置内容缩放比例(0.1~1f),细心的同学会发现在当缩完成后还可以在往里面拉到更小,有种弹性的感觉,挺有趣的。但是有些人的需求不想要有这种弹性效果,我们可以通过修改源码修改这个弹性效果,找到getTargetScale这个方法,修改下面0.5这个数值。使用时设置了0.6的缩放比例,默认下面的弹性参数是0.5所以我们当缩完成后还可以在往里面拉0.1的比例。

[java] view plaincopyprint?
  1. private float getTargetScale(float currentRawX){
  2. float scaleFloatX = ((currentRawX - lastRawX) / getScreenWidth()) * 0.75f;
  3. scaleFloatX = scaleDirection == DIRECTION_RIGHT ? - scaleFloatX : scaleFloatX;
  4. float targetScale = ViewHelper.getScaleX(viewActivity) - scaleFloatX;
  5. targetScale = targetScale > 1.0f ? 1.0f : targetScale;
  6. targetScale = targetScale < 0.5f ? 0.5f : targetScale;
  7. return targetScale;
  8. }

默认缩放比例:

[java] view plaincopyprint?
  1. //valid scale factor is between 0.0f and 1.0f.
  2. private float mScaleValue = 0.5f;
[java] view plaincopyprint?
  1. AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue);
[java] view plaincopyprint?
  1. /**
  2. * a helper method to build scale down animation;
  3. *
  4. * @param target
  5. * @param targetScaleX
  6. * @param targetScaleY
  7. * @return
  8. */
  9. private AnimatorSet buildScaleDownAnimation(View target,float targetScaleX,float targetScaleY){
  10. AnimatorSet scaleDown = new AnimatorSet();
  11. scaleDown.playTogether(
  12. ObjectAnimator.ofFloat(target, "scaleX", targetScaleX),
  13. ObjectAnimator.ofFloat(target, "scaleY", targetScaleY)
  14. );
  15. scaleDown.setInterpolator(AnimationUtils.loadInterpolator(activity,
  16. android.R.anim.decelerate_interpolator));
  17. scaleDown.setDuration(250);
  18. return scaleDown;
  19. }

6.创建子菜单,看下子菜单的构造,我们通过上面的学习,原理分析:我们可以猜测到,无非就是加载布局设置内容

[java] view plaincopyprint?
  1. public ResideMenuItem(Context context, int icon, String title) {
  2. super(context);
  3. initViews(context);
  4. iv_icon.setImageResource(icon);
  5. tv_title.setText(title);
  6. }
  7. private void initViews(Context context){
  8. LayoutInflater inflater=(LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
  9. inflater.inflate(R.layout.residemenu_item, this);
  10. iv_icon = (ImageView) findViewById(R.id.iv_icon);
  11. tv_title = (TextView) findViewById(R.id.tv_title);
  12. }

布局文件:

[html] view plaincopyprint?
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="horizontal"
  4. android:layout_width="match_parent"
  5. android:layout_height="wrap_content"
  6. android:gravity="center_vertical"
  7. android:paddingTop="30dp">
  8. <ImageView
  9. android:layout_width="30dp"
  10. android:layout_height="30dp"
  11. android:scaleType="centerCrop"
  12. android:id="@+id/iv_icon"/>
  13. <TextView
  14. android:layout_width="match_parent"
  15. android:layout_height="wrap_content"
  16. android:textColor="@android:color/white"
  17. android:textSize="18sp"
  18. android:layout_marginLeft="10dp"
  19. android:id="@+id/tv_title"/>
  20. </LinearLayout>

显示效果图:

7.子菜单添加到侧换菜单中(可以看到它是通过常量来控制子菜单的添加位置)原理分析:根据不同的常量来区分添加不同菜单的子菜单

[java] view plaincopyprint?
  1. /**
  2. * add a single items;
  3. *
  4. * @param menuItem
  5. * @param direction
  6. */
  7. public void addMenuItem(ResideMenuItem menuItem, int direction){
  8. if (direction == DIRECTION_LEFT){
  9. this.leftMenuItems.add(menuItem);
  10. layoutLeftMenu.addView(menuItem);
  11. }else{
  12. this.rightMenuItems.add(menuItem);
  13. layoutRightMenu.addView(menuItem);
  14. }
  15. }

8.设置title按钮的点击事件,设置左右菜单的开关,原理分析:先设置了缩放方向然后在设置动画,正如我们上面想的一样还设置了动画监听。

[java] view plaincopyprint?
  1. /**
  2. * show the reside menu;
  3. */
  4. public void openMenu(int direction){
  5. setScaleDirection(direction);
  6. isOpened = true;
  7. AnimatorSet scaleDown_activity = buildScaleDownAnimation(viewActivity, mScaleValue, mScaleValue);
  8. AnimatorSet scaleDown_shadow = buildScaleDownAnimation(imageViewShadow,
  9. mScaleValue + shadowAdjustScaleX, mScaleValue + shadowAdjustScaleY);
  10. AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 1.0f);
  11. scaleDown_shadow.addListener(animationListener);
  12. scaleDown_activity.playTogether(scaleDown_shadow);
  13. scaleDown_activity.playTogether(alpha_menu);
  14. scaleDown_activity.start();
  15. }

设置缩放方向及计算x,y轴位置。

[java] view plaincopyprint?
  1. private void setScaleDirection(int direction){
  2. int screenWidth = getScreenWidth();
  3. float pivotX;
  4. float pivotY = getScreenHeight() * 0.5f;
  5. if (direction == DIRECTION_LEFT){
  6. scrollViewMenu = scrollViewLeftMenu;
  7. pivotX  = screenWidth * 1.5f;
  8. }else{
  9. scrollViewMenu = scrollViewRightMenu;
  10. pivotX  = screenWidth * -0.5f;
  11. }
  12. ViewHelper.setPivotX(viewActivity, pivotX);
  13. ViewHelper.setPivotY(viewActivity, pivotY);
  14. ViewHelper.setPivotX(imageViewShadow, pivotX);
  15. ViewHelper.setPivotY(imageViewShadow, pivotY);
  16. scaleDirection = direction;
  17. }

9.重写 dispatchTouchEvent,问题思考:如何到根据手指滑动自动缩放

如果还不了解,dispatchTouchEvent这个函数如何调用?什么时候调用?请先看看http://blog.csdn.net/cym492224103/article/details/39179311

[java] view plaincopyprint?
  1. @Override
  2. public boolean dispatchTouchEvent(MotionEvent ev) {
  3. float currentActivityScaleX = ViewHelper.getScaleX(viewActivity);
  4. if (currentActivityScaleX == 1.0f)
  5. setScaleDirectionByRawX(ev.getRawX());
  6. switch (ev.getAction()){
  7. case MotionEvent.ACTION_DOWN:
  8. lastActionDownX = ev.getX();
  9. lastActionDownY = ev.getY();
  10. isInIgnoredView = isInIgnoredView(ev) && !isOpened();
  11. pressedState    = PRESSED_DOWN;
  12. break;
  13. case MotionEvent.ACTION_MOVE:
  14. if (isInIgnoredView || isInDisableDirection(scaleDirection))
  15. break;
  16. if(pressedState != PRESSED_DOWN &&
  17. pressedState != PRESSED_MOVE_HORIZANTAL)
  18. break;
  19. int xOffset = (int) (ev.getX() - lastActionDownX);
  20. int yOffset = (int) (ev.getY() - lastActionDownY);
  21. if(pressedState == PRESSED_DOWN) {
  22. if(yOffset > 25 || yOffset < -25) {
  23. pressedState = PRESSED_MOVE_VERTICAL;
  24. break;
  25. }
  26. if(xOffset < -50 || xOffset > 50) {
  27. pressedState = PRESSED_MOVE_HORIZANTAL;
  28. ev.setAction(MotionEvent.ACTION_CANCEL);
  29. }
  30. } else if(pressedState == PRESSED_MOVE_HORIZANTAL) {
  31. if (currentActivityScaleX < 0.95)
  32. showScrollViewMenu();
  33. float targetScale = getTargetScale(ev.getRawX());
  34. ViewHelper.setScaleX(viewActivity, targetScale);
  35. ViewHelper.setScaleY(viewActivity, targetScale);
  36. ViewHelper.setScaleX(imageViewShadow, targetScale + shadowAdjustScaleX);
  37. ViewHelper.setScaleY(imageViewShadow, targetScale + shadowAdjustScaleY);
  38. ViewHelper.setAlpha(scrollViewMenu, (1 - targetScale) * 2.0f);
  39. lastRawX = ev.getRawX();
  40. return true;
  41. }
  42. break;
  43. case MotionEvent.ACTION_UP:
  44. if (isInIgnoredView) break;
  45. if (pressedState != PRESSED_MOVE_HORIZANTAL) break;
  46. pressedState = PRESSED_DONE;
  47. if (isOpened()){
  48. if (currentActivityScaleX > 0.56f)
  49. closeMenu();
  50. else
  51. openMenu(scaleDirection);
  52. }else{
  53. if (currentActivityScaleX < 0.94f){
  54. openMenu(scaleDirection);
  55. }else{
  56. closeMenu();
  57. }
  58. }
  59. break;
  60. }
  61. lastRawX = ev.getRawX();
  62. return super.dispatchTouchEvent(ev);
  63. }

上面代码量有点多,看上去有点晕,接下来我们来分别从按下、移动、放开、来原理分析:

MotionEvent.ACTION_DOWN:

记录了X,Y轴的坐标点,判断是否打开,设置了按下的状态为PRESSED_DOWN

MotionEvent.ACTION_MOVE:

拿到当前X,Y减去DOWN下记录下来的X,Y,这样得到了移动的X,Y,

然后判断如果如果移动的X,Y大于25或者小于-25就改变按下状态为PRESSED_MOVE_VERTICAL

如果移动的X,Y大于50或者小于-50就改变状态为PRESSED_MOVE_HORIZANTAL

状态为PRESSED_MOVE_HORIZANTAL就改变菜单主视图内容以及阴影图片大小,在改变的同时还设置了当前菜单的透明度。

MotionEvent.ACTION_UP:

判断是否菜单是否打开状态,在获取当前缩放的X比例,

判断比例小于0.56f,则关闭菜单,反正开启菜单。

看完后,我们在回去看看代码,就会发现其实也不过如此~!

10.菜单关闭方法,同样也设置了动画监听之前的想法也是成立的。

[java] view plaincopyprint?
  1. /**
  2. * close the reslide menu;
  3. */
  4. public void closeMenu(){
  5. isOpened = false;
  6. AnimatorSet scaleUp_activity = buildScaleUpAnimation(viewActivity, 1.0f, 1.0f);
  7. AnimatorSet scaleUp_shadow = buildScaleUpAnimation(imageViewShadow, 1.0f, 1.0f);
  8. AnimatorSet alpha_menu = buildMenuAnimation(scrollViewMenu, 0.0f);
  9. scaleUp_activity.addListener(animationListener);
  10. scaleUp_activity.playTogether(scaleUp_shadow);
  11. scaleUp_activity.playTogether(alpha_menu);
  12. scaleUp_activity.start();
  13. }

11.屏蔽菜单方法

[java] view plaincopyprint?
  1. public void setSwipeDirectionDisable(int direction){
  2. disabledSwipeDirection.add(direction);
  3. }
[java] view plaincopyprint?
  1. private boolean isInDisableDirection(int direction){
  2. return disabledSwipeDirection.contains(direction);
  3. }

原理分析:在重写 dispatchTouchEvent的时候,细心的同学应该会看到, ACTION_MOVE下面有个判断

[java] view plaincopyprint?
  1. if (isInIgnoredView || isInDisableDirection(scaleDirection))

如果这个方向的菜单被屏蔽了,就滑不出来了。

最后我们会发现我们一直都没说到TouchDisableView,其实initValue的时候就初始化了,它就是viewActivity,是我们的内容视图。

我们来看看它做了什么?

[java] view plaincopyprint?
  1. @Override
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  3. int width = getDefaultSize(0, widthMeasureSpec);
  4. int height = getDefaultSize(0, heightMeasureSpec);
  5. setMeasuredDimension(width, height);
  6. final int contentWidth = getChildMeasureSpec(widthMeasureSpec, 0, width);
  7. final int contentHeight = getChildMeasureSpec(heightMeasureSpec, 0, height);
  8. mContent.measure(contentWidth, contentHeight);
  9. }
  10. @Override
  11. protected void onLayout(boolean changed, int l, int t, int r, int b) {
  12. final int width = r - l;
  13. final int height = b - t;
  14. mContent.layout(0, 0, width, height);
  15. }
  16. @Override
  17. public boolean onInterceptTouchEvent(MotionEvent ev) {
  18. return mTouchDisabled;
  19. }
  20. void setTouchDisable(boolean disableTouch) {
  21. mTouchDisabled = disableTouch;
  22. }
  23. boolean isTouchDisabled() {
  24. return mTouchDisabled;
  25. }

动态设置宽高,设置事件是否传递下去的flag。

Android仿QQ5.0侧滑菜单ResideMenu的使用和源码分析相关推荐

  1. Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39257409,本文出自[张鸿洋的博客] 上一篇博客带大家实现了:Android ...

  2. 仿QQ5.0侧滑菜单

    一.概述 侧滑菜单现在已经非常流行了,目前大概有这么几种:最普通的侧滑,抽屉侧滑,QQ侧滑 注:本文来自慕课网 二.最普通的侧滑 先上图 代码如下: 1 public class MainActivi ...

  3. Android RxJava(一) create操作符的用法和源码分析

    RxJava(一) create操作符的用法和源码分析 转载于:https://www.cnblogs.com/zhujiabin/p/7291901.html

  4. 打造华丽QQ5.0侧滑效果

    已经好久没写过Android开发的技术博客,只因最近项目比较急.耽误了.今天带来的QQ5.0侧滑效果.我们都对QQ5.0侧滑效果很熟悉了,就不多做介绍,就一个字"炫".正好这次在项 ...

  5. 使用DrawerLayout实现QQ5.0侧拉菜单效果

    在上一篇文章中,我们介绍了怎么使用DrawerLayout来实现一个简单的侧拉菜单(使用DrawerLayout实现侧拉菜单),也就是我们常说的抽屉效果,GitHub上类似效果的实现方式非常多,实现出 ...

  6. 仿QQ6 0侧滑之ViewDragHelper的使用(一)

    title : 仿QQ6.0侧滑之ViewDragHelper的使用(一) 相信大家也都是用QQ,自从QQ更新至6.0后,侧滑由原先的划出后主面板缩小变成了左右平滑,个人觉得这样还是听美观的(个人观点 ...

  7. Android 打造完美的侧滑菜单/侧滑View控件

    概述 Android 打造完美的侧滑菜单/侧滑View控件,完全自定义实现,支持左右两个方向弹出,代码高度简洁流畅,兼容性高,控件实用方便. 详细 代码下载:http://www.demodashi. ...

  8. 仿QQ6.0侧滑之ViewDragHelper的使用(一)

    相信大家也都是用QQ,自从QQ更新至6.0后,侧滑由原先的划出后主面板缩小变成了左右平滑,个人觉得这样还是听美观的(个人观点),于是自己就尝试着看看自己能不能理解一下里面的各种逻辑,于是乎,自己就找了 ...

  9. Flutter | 超简单仿微信QQ侧滑菜单组件(改)

    文章目录 一.明确需求 二.实现需求 1. 滑动菜单实现使用`SingleChildScrollView`: 2. 列表滑动不够距离则菜单再次隐藏,距离足够则完全展示菜单. 3. 菜单支持事件处理. ...

最新文章

  1. android studio annotations,AndroidAnnotations在Android Studio中的配置
  2. 单个APP接入多个微信支付宝支付的一种解决方案
  3. 不只是用于研究:使用Nvivo获取各种定性数据
  4. Docker相关概念与安装(Docker-CE)
  5. Java Package getPackage()方法与示例
  6. 【模块化开发】之 模块化概述
  7. (3~4):C实现数组选择排序
  8. CF1041E Tree Reconstruction
  9. idea远程调试debug
  10. 2022最新短视频去水印解析API接口分享
  11. 在 COMSOL 中模拟地震波的传播
  12. 土方工程量计算表格excel_土方方格网计算表格excel.xls
  13. Craps 赌博游戏
  14. 关于电气人奋斗的故事
  15. SOLIDWORKS 2018 怎样画出一条垂直的直线?
  16. 计算机实验室之树莓派
  17. Java小游戏项目:推箱子游戏
  18. Other | PPTV电视安装第三方应用教程
  19. 网络层——IP协议(IP协议报头IP报文的分片与组装)
  20. 有一个数组,内放10个整数,要求找出最小的数和它的下标,然后把它和数组中最前面的元素对换。

热门文章

  1. 编程学习笔记(第一篇)面向对象技术高级课程:绪论-软件开发方法的演化与最新趋势(1)...
  2. iOS 远程通知(Remote Notification)和本地通知(Local Notification)
  3. 区分Activity的四种加载模式(转)
  4. MOSS2007 无法上传超过30M或者50M的大文件解决办法 (转)
  5. Android Fragments 详细使用
  6. android4.3 Bluetooth(le)分析之startLeScan分析
  7. 学习,编译ffmpeg tutorial
  8. 数据库存带微信表情的昵称
  9. 基于ArcSDE、Oralce空间数据库冷备份与恢复
  10. 2017-2018-1 20155320第十周课下作业-IPC