-
*/
-
private boolean bMenuShow;
-
private static int xOffset = 15;
-
private static int yOffset = -13;
-
/**
-
* 菜单的资源个数.
-
*/
-
private int[] menuResIds = {R.drawable.composer_camera,R.drawable.composer_music,
-
R.drawable.composer_sleep,R.drawable.composer_music,R.drawable.composer_place};
-
public PathMenuView(Context context){
-
super(context);
-
setupViews();
-
}
-
public PathMenuView(Context context, AttributeSet attrs) {
-
super(context, attrs);
-
TypedArray a = context.obtainStyledAttributes(attrs,
-
R.styleable.PathMenuView);
-
position = a.getInt(R.styleable.PathMenuView_position,3);
-
a.recycle();
-
setupViews();
-
}
-
private void setupViews(){
-
mContext = getContext();
-
mHEIGHT = mContext.getResources().getDisplayMetrics().heightPixels;
-
mWIDTH = mContext.getResources().getDisplayMetrics().widthPixels;
-
mDensity = mContext.getResources().getDisplayMetrics().density;
-
xOffset = (int) (10.667 * mDensity);
-
yOffset = (int) (8.667 * mDensity);
-
mHome = new ImageView(mContext);
-
mHome.setImageResource(R.drawable.composer_button);
-
mHome.setOnClickListener(listener);
-
addView(mHome);
-
LayoutParams mHomeparams = (FrameLayout.LayoutParams)mHome.getLayoutParams();
-
mHomeparams.width = LayoutParams.WRAP_CONTENT;
-
mHomeparams.height = LayoutParams.WRAP_CONTENT;
-
switch (position) {
-
case LEFT_TOP:
-
mHomeparams.gravity = Gravity.LEFT | Gravity.TOP;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setImageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.leftMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.topMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.LEFT | Gravity.TOP;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case RIGHT_TOP:
-
mHomeparams.gravity = Gravity.RIGHT | Gravity.TOP;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setImageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.rightMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.topMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.RIGHT | Gravity.TOP;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case RIGHT_BOTTOM:
-
mHomeparams.gravity = Gravity.RIGHT | Gravity.BOTTOM;
-
for (int i = 0; i < menuResIds.length; i++) {
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length - 1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setImageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams) imageView
-
.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.rightMargin = mWIDTH / 2
-
- ((menuResIds.length - i - 1) * width_padding);
-
params.bottomMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.RIGHT | Gravity.BOTTOM;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
case LEFT_BOTTOM:
-
mHomeparams.gravity = Gravity.LEFT | Gravity.BOTTOM;
-
for(int i = 0; i < menuResIds.length; i++){
-
int width_padding = mWIDTH / ((menuResIds.length - 1) * 2);
-
int height_padding = mHEIGHT / ((menuResIds.length -1) * 2);
-
ImageView imageView = new ImageView(mContext);
-
imageView.setImageResource(menuResIds[i]);
-
addView(imageView);
-
LayoutParams params = (FrameLayout.LayoutParams)imageView.getLayoutParams();
-
params.width = LayoutParams.WRAP_CONTENT;
-
params.height = LayoutParams.WRAP_CONTENT;
-
params.leftMargin = mWIDTH / 2 - ((menuResIds.length - i - 1) * width_padding);
-
params.bottomMargin = mHEIGHT / 2 - i * height_padding;
-
params.gravity = Gravity.LEFT | Gravity.BOTTOM;
-
imageView.setLayoutParams(params);
-
}
-
break;
-
default:
-
break;
-
}
-
mHome.setLayoutParams(mHomeparams);
-
}
-
private OnClickListener listener = new OnClickListener() {
-
public void onClick(View v) {
-
if (!bMenuShow) {
-
startAnimationIn(PathMenuView.this, 300);
-
} else {
-
startAnimationOut(PathMenuView.this, 300);
-
}
-
bMenuShow = !bMenuShow;
-
}
-
};
-
/**
-
* 菜单隐藏动画.
-
*
-
* @param group
-
* @param duration
-
*/
-
private void startAnimationIn(ViewGroup group, int duration) {
-
for (int i = 1; i < group.getChildCount(); i++) {
-
ImageView imageview = (ImageView) group.getChildAt(i);
-
imageview.setVisibility(0);
-
MarginLayoutParams mlp = (MarginLayoutParams) imageview
-
.getLayoutParams();
-
Animation animation = null;
-
switch (position) {
-
case LEFT_TOP:
-
animation = new TranslateAnimation(0F,-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset);
-
break;
-
case RIGHT_TOP:
-
animation = new TranslateAnimation(mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset,0F);
-
break;
-
case LEFT_BOTTOM:
-
animation = new TranslateAnimation(0F, -mlp.leftMargin+ xOffset, 0F, -yOffset + mlp.bottomMargin);
-
break;
-
case RIGHT_BOTTOM:
-
animation = new TranslateAnimation(mlp.rightMargin-xOffset,0F,-yOffset + mlp.bottomMargin, 0F);
-
break;
-
default:
-
break;
-
}
-
animation.setFillAfter(true);
-
animation.setDuration(duration);
-
animation.setStartOffset((i * 100) / (-1 + group.getChildCount()));
-
animation.setInterpolator(new OvershootInterpolator(2F));
-
imageview.startAnimation(animation);
-
}
-
}
-
/**
-
* 菜单显示动画.
-
*
-
* @param group
-
* @param duration
-
*/
-
private void startAnimationOut(ViewGroup group,int duration){
-
for (int i = 1; i < group.getChildCount(); i++) {
-
final ImageView imageview = (ImageView) group
-
.getChildAt(i);
-
MarginLayoutParams mlp = (MarginLayoutParams) imageview.getLayoutParams();
-
Animation animation = null;
-
switch (position) {
-
case LEFT_TOP:
-
animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F,-mlp.topMargin + yOffset,0F);
-
break;
-
case RIGHT_TOP:
-
animation = new TranslateAnimation(0F,mlp.rightMargin - xOffset,0F,-mlp.topMargin + yOffset);
-
break;
-
case LEFT_BOTTOM:
-
animation = new TranslateAnimation(-mlp.leftMargin+xOffset,0F, -yOffset + mlp.bottomMargin,0F);
-
break;
-
case RIGHT_BOTTOM:
-
animation = new TranslateAnimation(0F,mlp.rightMargin-xOffset, 0F,-yOffset + mlp.bottomMargin);
-
break;
-
default:
-
break;
-
}
-
animation.setFillAfter(true);animation.setDuration(duration);
-
animation.setStartOffset(((group.getChildCount()-i) * 100)
-
/ (-1 + group.getChildCount()));
-
animation.setInterpolator(new AnticipateInterpolator(2F));
-
imageview.startAnimation(animation);
-
}
-
}
-
}
第四步:PathTestActivity.java以及用到的布局文件main.xml代码如下:
PathTestActivity.java(基本没修改代码)代码如下:
[java] view plain copy
-
package com.tutor.path;
-
import android.app.Activity;
-
import android.os.Bundle;
-
public class PathTestActivity extends Activity {
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
上面分享的腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
【Android高级架构视频学习资源】
**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
21年的高频面试题**,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,上面只是以图片的形式给大家展示一部分。
【Android思维脑图(技能树)】
知识不体系?这里还有整理出来的Android进阶学习的思维脑图,给大家参考一个方向。
[外链图片转存中…(img-MLuQVFPj-1712134886774)]
【Android高级架构视频学习资源】
**Android部分精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水,赶快领取吧!