Android Path菜单的简单实现,看这篇文章就行了

本文介绍了如何在Android应用中使用FrameLayout动态创建并布局菜单项,包括左右上下的位置调整,以及菜单的显示和隐藏动画的实现。作者提供了一个完整的示例,旨在帮助Android初级工程师提升技能和理解布局与动画的相关知识。
摘要由CSDN通过智能技术生成
  1. addView(mHome);

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

  3. mHomeparams.width = LayoutParams.WRAP_CONTENT;

  4. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  5. switch (position) {

  6. case LEFT_TOP:

  7. mHomeparams.gravity = Gravity.LEFT | Gravity.TOP;

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

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

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

  11. ImageView imageView = new ImageView(mContext);

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

  13. addView(imageView);

  14. LayoutParams params = (FrameLayout.LayoutParams) imageView

  15. .getLayoutParams();

  16. params.width = LayoutParams.WRAP_CONTENT;

  17. params.height = LayoutParams.WRAP_CONTENT;

  18. params.leftMargin = mWIDTH / 2

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

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

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

  22. imageView.setLayoutParams(params);

  23. }

  24. break;

  25. case RIGHT_TOP:

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

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

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

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

  30. ImageView imageView = new ImageView(mContext);

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

  32. addView(imageView);

  33. LayoutParams params = (FrameLayout.LayoutParams) imageView

  34. .getLayoutParams();

  35. params.width = LayoutParams.WRAP_CONTENT;

  36. params.height = LayoutParams.WRAP_CONTENT;

  37. params.rightMargin = mWIDTH / 2

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

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

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

  41. imageView.setLayoutParams(params);

  42. }

  43. break;

  44. case RIGHT_BOTTOM:

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

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

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

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

  49. ImageView imageView = new ImageView(mContext);

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

  51. addView(imageView);

  52. LayoutParams params = (FrameLayout.LayoutParams) imageView

  53. .getLayoutParams();

  54. params.width = LayoutParams.WRAP_CONTENT;

  55. params.height = LayoutParams.WRAP_CONTENT;

  56. params.rightMargin = mWIDTH / 2

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

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

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

  60. imageView.setLayoutParams(params);

  61. }

  62. break;

  63. case LEFT_BOTTOM:

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

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

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

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

  68. ImageView imageView = new ImageView(mContext);

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

  70. addView(imageView);

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

  72. params.width = LayoutParams.WRAP_CONTENT;

  73. params.height = LayoutParams.WRAP_CONTENT;

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

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

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

  77. imageView.setLayoutParams(params);

  78. }

  79. break;

  80. default:

  81. break;

  82. }

  83. mHome.setLayoutParams(mHomeparams);

  84. }

  85. private OnClickListener listener = new OnClickListener() {

  86. public void onClick(View v) {

  87. if (!bMenuShow) {

  88. startAnimationIn(PathMenuView.this, 300);

  89. } else {

  90. startAnimationOut(PathMenuView.this, 300);

  91. }

  92. bMenuShow = !bMenuShow;

  93. }

  94. };

  95. /**

  96. * 菜单隐藏动画.

  97. *

  98. * @param group

  99. * @param duration

  100. */

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

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

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

  104. imageview.setVisibility(0);

  105. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  106. .getLayoutParams();

  107. Animation animation = null;

  108. switch (position) {

  109. case LEFT_TOP:

  110. animation = new TranslateAnimation(0F,-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset);

  111. break;

  112. case RIGHT_TOP:

  113. animation = new TranslateAnimation(mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset,0F);

  114. break;

  115. case LEFT_BOTTOM:

  116. animation = new TranslateAnimation(0F, -mlp.leftMargin+ xOffset, 0F, -yOffset + mlp.bottomMargin);

  117. break;

  118. case RIGHT_BOTTOM:

  119. animation = new TranslateAnimation(mlp.rightMargin-xOffset,0F,-yOffset + mlp.bottomMargin, 0F);

  120. break;

  121. default:

  122. break;

  123. }

  124. animation.setFillAfter(true);

  125. animation.setDuration(duration);

  126. animation.setStartOffset((i * 100) / (-1 + group.getChildCount()));

  127. animation.setInterpolator(new OvershootInterpolator(2F));

  128. imageview.startAnimation(animation);

  129. }

  130. }

  131. /**

  132. * 菜单显示动画.

  133. *

  134. * @param group

  135. * @param duration

  136. */

  137. private void startAnimationOut(ViewGroup group,int duration){

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

  139. final ImageView imageview = (ImageView) group

  140. .getChildAt(i);

  141. MarginLayoutParams mlp = (MarginLayoutParams) imageview.getLayoutParams();

  142. Animation animation = null;

  143. switch (position) {

  144. case LEFT_TOP:

  145. animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset,0F);

  146. break;

  147. case RIGHT_TOP:

  148. animation = new TranslateAnimation(0F,mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset);

  149. break;

  150. case LEFT_BOTTOM:

  151. animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F, -yOffset + mlp.bottomMargin,0F);

  152. break;

  153. case RIGHT_BOTTOM:

  154. animation = new TranslateAnimation(0F,mlp.rightMargin-xOffset, 0F,-yOffset + mlp.bottomMargin);

  155. break;

  156. default:

  157. break;

  158. }

  159. animation.setFillAfter(true);animation.setDuration(duration);

  160. animation.setStartOffset(((group.getChildCount()-i) * 100)

  161. / (-1 + group.getChildCount()));

  162. animation.setInterpolator(new AnticipateInterpolator(2F));

  163. imageview.startAnimation(animation);

  164. }

  165. }

  166. }

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-lGbJRhlZ-1710913760767)]
[外链图片转存中…(img-JRVUbC7t-1710913760767)]
[外链图片转存中…(img-5P5r9CXD-1710913760768)]
[外链图片转存中…(img-BveQApna-1710913760768)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-wpwLksyd-1710913760768)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值