最新Android Path菜单的简单实现,2024年最新字节跳动面试怎么写代码

写在最后

今天关于面试的分享就到这里,还是那句话,有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。

最后在这里小编分享一份自己收录整理上述技术体系图相关的几十套腾讯、头条、阿里、美团等公司的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

还有 高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料 帮助大家学习提升进阶,也节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

【Android核心高级技术PDF文档,BAT大厂面试真题解析】

【算法合集】

【延伸Android必备知识点】

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

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

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

  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

  99. .getLayoutParams();

  100. Animation animation = null;

  101. switch (position) {

  102. case LEFT_TOP:

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

  104. break;

  105. case RIGHT_TOP:

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

  107. break;

  108. case LEFT_BOTTOM:

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

  110. break;

  111. case RIGHT_BOTTOM:

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

  113. break;

  114. default:

  115. break;

  116. }

  117. animation.setFillAfter(true);

  118. animation.setDuration(duration);

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

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

  121. imageview.startAnimation(animation);

  122. }

  123. }

  124. /**

  125. * 菜单显示动画.

  126. *

  127. * @param group

  128. * @param duration

  129. */

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

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

  132. final ImageView imageview = (ImageView) group

  133. .getChildAt(i);

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

  135. Animation animation = null;

  136. switch (position) {

  137. case LEFT_TOP:

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

  139. break;

  140. case RIGHT_TOP:

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

  142. break;

  143. case LEFT_BOTTOM:

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

  145. break;

  146. case RIGHT_BOTTOM:

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

  148. break;

  149. default:

  150. break;

  151. }

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

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

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

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

  156. imageview.startAnimation(animation);

  157. }

  158. }

  159. }

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

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

[java]  view plain copy

  1. package com.tutor.path;

  2. import android.app.Activity;

  3. import android.os.Bundle;

  4. public class PathTestActivity extends Activity {

  5. @Override

  6. public void onCreate(Bundle savedInstanceState) {

  7. super.onCreate(savedInstanceState);

  8. setContentView(R.layout.main);

  9. }

  10. }

main.xml代码如下:

[java]  view plain copy

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

  3. xmlns:tutor=“http://schemas.android.com/apk/res/com.tutor.path”

  4. android:layout_width=“fill_parent”

  5. android:layout_height=“fill_parent”

  6. android:orientation=“vertical” >

  7. <com.tutor.path.PathMenuView

  8. android:id=“@+id/text”

  9. android:layout_width=“fill_parent”

  10. android:layout_height=“fill_parent”

  11. tutor:position=“right_bottom”

  12. />

  13.   

运行点击效果如下:

     

图1:默认是在右下方这里menuResIds定义了五个菜单                图2:点击红色菜单,菜单收回.

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

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

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

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

如下:

[外链图片转存中…(img-PZNnXp5i-1715360734591)]     [外链图片转存中…(img-MzVb3Bgu-1715360734591)]

图1:默认是在右下方这里menuResIds定义了五个菜单                图2:点击红色菜单,菜单收回.

总结

本文讲解了我对Android开发现状的一些看法,也许有些人会觉得我的观点不对,但我认为没有绝对的对与错,一切交给时间去证明吧!愿与各位坚守的同胞们互相学习,共同进步!

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

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

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值