Android Path菜单的简单实现,掌握这6大技能体系

  1. </declare-styleable>

  2. </resources>

第三步:新建一个PathMenuView.java这个就是我们自定义的Path菜单控件,代码如下:

[java]  view plain copy

  1. package com.tutor.path;

  2. import android.content.Context;

  3. import android.content.res.TypedArray;

  4. import android.util.AttributeSet;

  5. import android.view.Gravity;

  6. import android.view.View;

  7. import android.view.ViewGroup;

  8. import android.view.animation.Animation;

  9. import android.view.animation.AnticipateInterpolator;

  10. import android.view.animation.OvershootInterpolator;

  11. import android.view.animation.TranslateAnimation;

  12. import android.widget.FrameLayout;

  13. import android.widget.ImageView;

  14. /**

  15. * @author frankiewei.

  16. * 超级仿path菜单

  17. * position定义菜单的位置,目前支持:左上;右上;右下;左下四个方向。

  18. * menuResIds定义出现的菜单的资源ID

  19. */

  20. public class PathMenuView extends FrameLayout {

  21. private static final int LEFT_TOP = 0;

  22. private static final int RIGHT_TOP = 1;

  23. private static final int RIGHT_BOTTOM = 2;

  24. private static final int LEFT_BOTTOM = 3;

  25. /**

  26. * 默认的位置是在右下角.

  27. */

  28. private int position = 3;

  29. /**

  30. * 那个圆形菜单.

  31. */

  32. private ImageView mHome;

  33. /**

  34. * 上下文.

  35. */

  36. private Context mContext;

  37. /**

  38. * 设备的宽度.

  39. */

  40. private int mWIDTH = 0;

  41. /**

  42. * 设备的高度.

  43. */

  44. private int mHEIGHT = 0;

  45. /**

  46. * 设备的density.

  47. */

  48. private float mDensity;

  49. /**

  50. * 菜单是否显示.

  51. */

  52. private boolean bMenuShow;

  53. private static int  xOffset     = 15;

  54. private static int  yOffset     = -13;

  55. /**

  56. * 菜单的资源个数.

  57. */

  58. private int[] menuResIds = {R.drawable.composer_camera,R.drawable.composer_music,

  59. R.drawable.composer_sleep,R.drawable.composer_music,R.drawable.composer_place};

  60. public PathMenuView(Context context){

  61. super(context);

  62. setupViews();

  63. }

  64. public PathMenuView(Context context, AttributeSet attrs) {

  65. super(context, attrs);

  66. TypedArray a = context.obtainStyledAttributes(attrs,

  67. R.styleable.PathMenuView);

  68. position = a.getInt(R.styleable.PathMenuView_position,3);

  69. a.recycle();

  70. setupViews();

  71. }

  72. private void setupViews(){

  73. mContext = getContext();

  74. mHEIGHT = mContext.getResources().getDisplayMetrics().heightPixels;

  75. mWIDTH = mContext.getResources().getDisplayMetrics().widthPixels;

  76. mDensity = mContext.getResources().getDisplayMetrics().density;

  77. xOffset = (int) (10.667 * mDensity);

  78. yOffset = (int) (8.667 * mDensity);

  79. mHome = new ImageView(mContext);

  80. mHome.setImageResource(R.drawable.composer_button);

  81. mHome.setOnClickListener(listener);

  82. addView(mHome);

  83. LayoutParams mHomeparams = (FrameLayout.LayoutParams)mHome.getLayoutParams();

  84. mHomeparams.width = LayoutParams.WRAP_CONTENT;

  85. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  86. switch (position) {

  87. case LEFT_TOP:

  88. mHomeparams.gravity = Gravity.LEFT | Gravit

《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》

【docs.qq.com/doc/DSkNLaERkbnFoS0ZF】 完整内容开源分享

y.TOP;

  1. for (int i = 0; i < menuResIds.length; i++) {

  2. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  3. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  4. ImageView imageView = new ImageView(mContext);

  5. imageView.setImageResource(menuResIds[i]);

  6. addView(imageView);

  7. LayoutParams params = (FrameLayout.LayoutParams) imageView

  8. .getLayoutParams();

  9. params.width = LayoutParams.WRAP_CONTENT;

  10. params.height = LayoutParams.WRAP_CONTENT;

  11. params.leftMargin = mWIDTH / 2

  12. - ((menuResIds.length - i - 1) * width_padding);

  13. params.topMargin = mHEIGHT / 2 - i * height_padding;

  14. params.gravity = Gravity.LEFT | Gravity.TOP;

  15. imageView.setLayoutParams(params);

  16. }

  17. break;

  18. case RIGHT_TOP:

  19. mHomeparams.gravity = Gravity.RIGHT | Gravity.TOP;

  20. for (int i = 0; i < menuResIds.length; i++) {

  21. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  22. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  23. ImageView imageView = new ImageView(mContext);

  24. imageView.setImageResource(menuResIds[i]);

  25. addView(imageView);

  26. LayoutParams params = (FrameLayout.LayoutParams) imageView

  27. .getLayoutParams();

  28. params.width = LayoutParams.WRAP_CONTENT;

  29. params.height = LayoutParams.WRAP_CONTENT;

  30. params.rightMargin = mWIDTH / 2

  31. - ((menuResIds.length - i - 1) * width_padding);

  32. params.topMargin = mHEIGHT / 2 - i * height_padding;

  33. params.gravity = Gravity.RIGHT | Gravity.TOP;

  34. imageView.setLayoutParams(params);

  35. }

  36. break;

  37. case RIGHT_BOTTOM:

  38. mHomeparams.gravity = Gravity.RIGHT | Gravity.BOTTOM;

  39. for (int i = 0; i < menuResIds.length; i++) {

  40. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  41. int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);

  42. ImageView imageView = new ImageView(mContext);

  43. imageView.setImageResource(menuResIds[i]);

  44. addView(imageView);

  45. LayoutParams params = (FrameLayout.LayoutParams) imageView

  46. .getLayoutParams();

  47. params.width = LayoutParams.WRAP_CONTENT;

  48. params.height = LayoutParams.WRAP_CONTENT;

  49. params.rightMargin = mWIDTH / 2

  50. - ((menuResIds.length - i - 1) * width_padding);

  51. params.bottomMargin = mHEIGHT / 2 - i * height_padding;

  52. params.gravity = Gravity.RIGHT | Gravity.BOTTOM;

  53. imageView.setLayoutParams(params);

  54. }

  55. break;

  56. case LEFT_BOTTOM:

  57. mHomeparams.gravity = Gravity.LEFT | Gravity.BOTTOM;

  58. for(int i = 0; i < menuResIds.length; i++){

  59. int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);

  60. int height_padding = mHEIGHT / ((menuResIds.length -1) * 2);

  61. ImageView imageView = new ImageView(mContext);

  62. imageView.setImageResource(menuResIds[i]);

  63. addView(imageView);

  64. LayoutParams params = (FrameLayout.LayoutParams)imageView.getLayoutParams();

  65. params.width = LayoutParams.WRAP_CONTENT;

  66. params.height = LayoutParams.WRAP_CONTENT;

  67. params.leftMargin = mWIDTH / 2 - ((menuResIds.length - i - 1) * width_padding);

  68. params.bottomMargin = mHEIGHT / 2 - i * height_padding;

  69. params.gravity = Gravity.LEFT | Gravity.BOTTOM;

  70. imageView.setLayoutParams(params);

  71. }

  72. break;

  73. default:

  74. break;

  75. }

  76. mHome.setLayoutParams(mHomeparams);

  77. }

  78. private OnClickListener listener = new OnClickListener() {

  79. public void onClick(View v) {

  80. if (!bMenuShow) {

  81. startAnimationIn(PathMenuView.this, 300);

  82. } else {

  83. startAnimationOut(PathMenuView.this, 300);

  84. }

  85. bMenuShow = !bMenuShow;

  86. }

  87. };

  88. /**

  89. * 菜单隐藏动画.

  90. *

  91. * @param group

  92. * @param duration

  93. */

  94. private void startAnimationIn(ViewGroup group, int duration) {

  95. for (int i = 1; i < group.getChildCount(); i++) {

  96. ImageView imageview = (ImageView) group.getChildAt(i);

  97. imageview.setVisibility(0);

  98. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值