Android Path菜单的简单实现(1),面试2024年

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip204888 (备注Android)
img

正文

  1. private static int  xOffset     = 15;

  2. private static int  yOffset     = -13;

  3. /**

  4. * 菜单的资源个数.

  5. */

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

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

  8. public PathMenuView(Context context){

  9. super(context);

  10. setupViews();

  11. }

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

  13. super(context, attrs);

  14. TypedArray a = context.obtainStyledAttributes(attrs,

  15. R.styleable.PathMenuView);

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

  17. a.recycle();

  18. setupViews();

  19. }

  20. private void setupViews(){

  21. mContext = getContext();

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

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

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

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

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

  27. mHome = new ImageView(mContext);

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

  29. mHome.setOnClickListener(listener);

  30. addView(mHome);

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

  32. mHomeparams.width = LayoutParams.WRAP_CONTENT;

  33. mHomeparams.height = LayoutParams.WRAP_CONTENT;

  34. switch (position) {

  35. case LEFT_TOP:

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

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

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

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

  40. ImageView imageView = new ImageView(mContext);

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

  42. addView(imageView);

  43. LayoutParams params = (FrameLayout.LayoutParams) imageView

  44. .getLayoutParams();

  45. params.width = LayoutParams.WRAP_CONTENT;

  46. params.height = LayoutParams.WRAP_CONTENT;

  47. params.leftMargin = mWIDTH / 2

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

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

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

  51. imageView.setLayoutParams(params);

  52. }

  53. break;

  54. case RIGHT_TOP:

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

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

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

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

  59. ImageView imageView = new ImageView(mContext);

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

  61. addView(imageView);

  62. LayoutParams params = (FrameLayout.LayoutParams) imageView

  63. .getLayoutParams();

  64. params.width = LayoutParams.WRAP_CONTENT;

  65. params.height = LayoutParams.WRAP_CONTENT;

  66. params.rightMargin = mWIDTH / 2

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

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

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

  70. imageView.setLayoutParams(params);

  71. }

  72. break;

  73. case RIGHT_BOTTOM:

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

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

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

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

  78. ImageView imageView = new ImageView(mContext);

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

  80. addView(imageView);

  81. LayoutParams params = (FrameLayout.LayoutParams) imageView

  82. .getLayoutParams();

  83. params.width = LayoutParams.WRAP_CONTENT;

  84. params.height = LayoutParams.WRAP_CONTENT;

  85. params.rightMargin = mWIDTH / 2

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

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

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

  89. imageView.setLayoutParams(params);

  90. }

  91. break;

  92. case LEFT_BOTTOM:

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

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

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

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

  97. ImageView imageView = new ImageView(mContext);

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

  99. addView(imageView);

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

  101. params.width = LayoutParams.WRAP_CONTENT;

  102. params.height = LayoutParams.WRAP_CONTENT;

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

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

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

  106. imageView.setLayoutParams(params);

  107. }

  108. break;

  109. default:

  110. break;

  111. }

  112. mHome.setLayoutParams(mHomeparams);

  113. }

  114. private OnClickListener listener = new OnClickListener() {

  115. public void onClick(View v) {

  116. if (!bMenuShow) {

  117. startAnimationIn(PathMenuView.this, 300);

  118. } else {

  119. startAnimationOut(PathMenuView.this, 300);

  120. }

  121. bMenuShow = !bMenuShow;

  122. }

  123. };

  124. /**

  125. * 菜单隐藏动画.

  126. *

  127. * @param group

  128. * @param duration

  129. */

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

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

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

  133. imageview.setVisibility(0);

  134. MarginLayoutParams mlp = (MarginLayoutParams) imageview

  135. .getLayoutParams();

  136. Animation animation = null;

  137. switch (position) {

  138. case LEFT_TOP:

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

  140. break;

  141. case RIGHT_TOP:

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

  143. break;

  144. case LEFT_BOTTOM:

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

  146. break;

  147. case RIGHT_BOTTOM:

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

  149. break;

  150. default:

  151. break;

  152. }

  153. animation.setFillAfter(true);

  154. animation.setDuration(duration);

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

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

  157. imageview.startAnimation(animation);

  158. }

  159. }

  160. /**

  161. * 菜单显示动画.

  162. *

  163. * @param group

  164. * @param duration

  165. */

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

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

  168. final ImageView imageview = (ImageView) group

  169. .getChildAt(i);

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

  171. Animation animation = null;

  172. switch (position) {

  173. case LEFT_TOP:

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

  175. break;

  176. case RIGHT_TOP:

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

  178. break;

  179. case LEFT_BOTTOM:

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

  181. break;

  182. case RIGHT_BOTTOM:

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

  184. break;

  185. default:

  186. break;

  187. }

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

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

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

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

  192. imageview.startAnimation(animation);

  193. }

  194. }

  195. }

如何成为Android高级架构师!

架构师必须具备抽象思维和分析的能力,这是你进行系统分析和系统分解的基本素质。只有具备这样的能力,架构师才能看清系统的整体,掌控全局,这也是架构师大局观的形成基础。 你如何具备这种能力呢?一是来自于经验,二是来自于学习。

架构师不仅要具备在问题领域上的经验,也需要具备在软件工程领域内的经验。也就是说,架构师必须能够准确得理解需求,然后用软件工程的思想,把需求转化和分解成可用计算机语言实现的程度。经验的积累是需要一个时间过程的,这个过程谁也帮不了你,是需要你去经历的。

但是,如果你有意识地去培养,不断吸取前人的经验的话,还是可以缩短这个周期的。这也是我整理架构师进阶此系列的始动力之一。


成为Android架构师必备知识技能

对应导图的学习笔记(由阿里P8大牛手写,我负责整理成PDF笔记)

部分内容展示

《设计思想解读开源框架》

  • 目录
  • 热修复设计
  • 插件化框架设计

    《360°全方面性能优化》
  • 设计思想与代码质量优化
  • 程序性能优化

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

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
img

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

图片转存中…(img-Cp1Fmqsv-1713618960376)]

  • 插件化框架设计
    [外链图片转存中…(img-nZOqS0FN-1713618960376)]
    《360°全方面性能优化》
    [外链图片转存中…(img-PBBzKaGl-1713618960376)]
  • 设计思想与代码质量优化
    [外链图片转存中…(img-sSd84DcB-1713618960377)]
  • 程序性能优化
    [外链图片转存中…(img-g5TTMHmP-1713618960377)]

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

需要这份系统化的资料的朋友,可以添加V获取:vip204888 (备注Android)
[外链图片转存中…(img-cnqTlbid-1713618960377)]

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值