2024年Android最新Android Path菜单的简单实现,阿里巴巴android面试题及答案

学习交流

群内有许多来自一线的技术大牛,也有在小厂或外包公司奋斗的码农,我们致力打造一个平等,高质量的Android交流圈子,不一定能短期就让每个人的技术突飞猛进,但从长远来说,眼光,格局,长远发展的方向才是最重要的。

35岁中年危机大多是因为被短期的利益牵着走,过早压榨掉了价值,如果能一开始就树立一个正确的长远的职业规划。35岁后的你只会比周围的人更值钱。

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  1. private static final int LEFT_TOP = 0;

  2. private static final int RIGHT_TOP = 1;

  3. private static final int RIGHT_BOTTOM = 2;

  4. private static final int LEFT_BOTTOM = 3;

  5. /**

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

  7. */

  8. private int position = 3;

  9. /**

  10. * 那个圆形菜单.

  11. */

  12. private ImageView mHome;

  13. /**

  14. * 上下文.

  15. */

  16. private Context mContext;

  17. /**

  18. * 设备的宽度.

  19. */

  20. private int mWIDTH = 0;

  21. /**

  22. * 设备的高度.

  23. */

  24. private int mHEIGHT = 0;

  25. /**

  26. * 设备的density.

  27. */

  28. private float mDensity;

  29. /**

  30. * 菜单是否显示.

  31. */

  32. private boolean bMenuShow;

  33. private static int  xOffset     = 15;

  34. private static int  yOffset     = -13;

  35. /**

  36. * 菜单的资源个数.

  37. */

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

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

  40. public PathMenuView(Context context){

  41. super(context);

  42. setupViews();

  43. }

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

  45. super(context, attrs);

  46. TypedArray a = context.obtainStyledAttributes(attrs,

  47. R.styleable.PathMenuView);

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

  49. a.recycle();

  50. setupViews();

  51. }

  52. private void setupViews(){

  53. mContext = getContext();

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

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

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

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

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

  59. mHome = new ImageView(mContext);

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

  61. mHome.setOnClickListener(listener);

  62. addView(mHome);

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

  64. mHomeparams.width = LayoutParams.WRAP_CONTENT;

  65. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  66. switch (position) {

  67. case LEFT_TOP:

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

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

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

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

  72. ImageView imageView = new ImageView(mContext);

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

  74. addView(imageView);

  75. LayoutParams params = (FrameLayout.LayoutParams) imageView

  76. .getLayoutParams();

  77. params.width = LayoutParams.WRAP_CONTENT;

  78. params.height = LayoutParams.WRAP_CONTENT;

  79. params.leftMargin = mWIDTH / 2

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

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

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

  83. imageView.setLayoutParams(params);

  84. }

  85. break;

  86. case RIGHT_TOP:

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

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

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

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

  91. ImageView imageView = new ImageView(mContext);

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

  93. addView(imageView);

  94. LayoutParams params = (FrameLayout.LayoutParams) imageView

  95. .getLayoutParams();

  96. params.width = LayoutParams.WRAP_CONTENT;

  97. params.height = LayoutParams.WRAP_CONTENT;

  98. params.rightMargin = mWIDTH / 2

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

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

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

  102. imageView.setLayoutParams(params);

  103. }

  104. break;

  105. case RIGHT_BOTTOM:

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

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

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

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

  110. ImageView imageView = new ImageView(mContext);

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

  112. addView(imageView);

  113. LayoutParams params = (FrameLayout.LayoutParams) imageView

  114. .getLayoutParams();

  115. params.width = LayoutParams.WRAP_CONTENT;

  116. params.height = LayoutParams.WRAP_CONTENT;

  117. params.rightMargin = mWIDTH / 2

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

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

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

  121. imageView.setLayoutParams(params);

  122. }

  123. break;

  124. case LEFT_BOTTOM:

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

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

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

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

  129. ImageView imageView = new ImageView(mContext);

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

  131. addView(imageView);

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

  133. params.width = LayoutParams.WRAP_CONTENT;

  134. params.height = LayoutParams.WRAP_CONTENT;

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

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

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

  138. imageView.setLayoutParams(params);

  139. }

  140. break;

  141. default:

  142. break;

  143. }

  144. mHome.setLayoutParams(mHomeparams);

  145. }

  146. private OnClickListener listener = new OnClickListener() {

  147. public void onClick(View v) {

  148. if (!bMenuShow) {

  149. startAnimationIn(PathMenuView.this, 300);

  150. } else {

  151. startAnimationOut(PathMenuView.this, 300);

  152. }

  153. bMenuShow = !bMenuShow;

  154. }

  155. };

  156. /**

  157. * 菜单隐藏动画.

  158. *

  159. * @param group

  160. * @param duration

  161. */

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

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

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

  165. imageview.setVisibility(0);

  166. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  167. .getLayoutParams();

  168. Animation animation = null;

  169. switch (position) {

  170. case LEFT_TOP:

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

  172. break;

  173. case RIGHT_TOP:

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

  175. break;

  176. case LEFT_BOTTOM:

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

  178. break;

  179. case RIGHT_BOTTOM:

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

  181. break;

  182. default:

  183. break;

  184. }

  185. animation.setFillAfter(true);

  186. animation.setDuration(duration);

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

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

  189. imageview.startAnimation(animation);

  190. }

  191. }

实战系列

话不多说,Android实战系列集合都已经系统分类好,由于文章篇幅问题没法过多展示


网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

lator(2F));

  1. imageview.startAnimation(animation);

  2. }

  3. }

实战系列

话不多说,Android实战系列集合都已经系统分类好,由于文章篇幅问题没法过多展示

[外链图片转存中…(img-gaGT2lj1-1715643294577)]
[外链图片转存中…(img-x7UCGjc1-1715643294577)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值