Android Path菜单的简单实现,不愧是Alibaba技术官

  1. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  2. switch (position) {

  3. case LEFT_TOP:

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

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

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

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

  8. ImageView imageView = new ImageView(mContext);

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

  10. addView(imageView);

  11. LayoutParams params = (FrameLayout.LayoutParams) imageView

  12. .getLayoutParams();

  13. params.width = LayoutParams.WRAP_CONTENT;

  14. params.height = LayoutParams.WRAP_CONTENT;

  15. params.leftMargin = mWIDTH / 2

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

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

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

  19. imageView.setLayoutParams(params);

  20. }

  21. break;

  22. case RIGHT_TOP:

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

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

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

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

  27. ImageView imageView = new ImageView(mContext);

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

  29. addView(imageView);

  30. LayoutParams params = (FrameLayout.LayoutParams) imageView

  31. .getLayoutParams();

  32. params.width = LayoutParams.WRAP_CONTENT;

  33. params.height = LayoutParams.WRAP_CONTENT;

  34. params.rightMargin = mWIDTH / 2

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

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

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

  38. imageView.setLayoutParams(params);

  39. }

  40. break;

  41. case RIGHT_BOTTOM:

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

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

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

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

  46. ImageView imageView = new ImageView(mContext);

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

  48. addView(imageView);

  49. LayoutParams params = (FrameLayout.LayoutParams) imageView

  50. .getLayoutParams();

  51. params.width = LayoutParams.WRAP_CONTENT;

  52. params.height = LayoutParams.WRAP_CONTENT;

  53. params.rightMargin = mWIDTH / 2

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

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

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

  57. imageView.setLayoutParams(params);

  58. }

  59. break;

  60. case LEFT_BOTTOM:

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

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

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

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

  65. ImageView imageView = new ImageView(mContext);

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

  67. addView(imageView);

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

  69. params.width = LayoutParams.WRAP_CONTENT;

  70. params.height = LayoutParams.WRAP_CONTENT;

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

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

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

  74. imageView.setLayoutParams(params);

  75. }

  76. break;

  77. default:

  78. break;

  79. }

  80. mHome.setLayoutParams(mHomeparams);

  81. }

  82. private OnClickListener listener = new OnClickListener() {

  83. public void onClick(View v) {

  84. if (!bMenuShow) {

  85. startAnimationIn(PathMenuView.this, 300);

  86. } else {

  87. startAnimationOut(PathMenuView.this, 300);

  88. }

  89. bMenuShow = !bMenuShow;

  90. }

  91. };

  92. /**

  93. * 菜单隐藏动画.

  94. *

  95. * @param group

  96. * @param duration

  97. */

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

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

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

  101. imageview.setVisibility(0);

  102. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  103. .getLayoutParams();

  104. Animation animation = null;

  105. switch (position) {

  106. case LEFT_TOP:

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

  108. break;

  109. case RIGHT_TOP:

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

  111. break;

  112. case LEFT_BOTTOM:

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

  114. break;

  115. case RIGHT_BOTTOM:

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

  117. break;

  118. default:

  119. break;

  120. }

  121. animation.setFillAfter(true);

  122. animation.setDuration(duration);

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

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

  125. imageview.startAnimation(animation);

  126. }

  127. }

  128. /**

  129. * 菜单显示动画.

  130. *

  131. * @param group

  132. * @param duration

  133. */

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

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

  136. final ImageView imageview = (ImageView) group

  137. .getChildAt(i);

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

  139. Animation animation = null;

  140. switch (position) {

  141. case LEFT_TOP:

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

  143. break;

  144. case RIGHT_TOP:

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

  146. break;

  147. case LEFT_BOTTOM:

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

  149. break;

  150. case RIGHT_BOTTOM:

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

  152. break;

  153. default:

  154. break;

  155. }

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

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

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

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

  160. imageview.startAnimation(animation);

  161. }

  162. }

  163. }

第四步:PathTestActivity.java以及用到的布局文件main.xml代码如下:

PathTestActivity.java(基本没修改代码)代码如下:

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

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

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

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

最后

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。可以点击GitHub免费获取

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer !如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。可以点击GitHub免费获取

[外链图片转存中…(img-Buo0eS0b-1711286390524)]

  • 29
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值