最后
在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。
附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
//指示器样式二 选中未选中都是方形
public static final int STYLE_RECT_RECT = 1;
//指示器样式三 选中方形,未选中圆点
public static final int STYLE_CIRCLR_RECT = 2;
//横向排列
public static final int HORIZONTAL = 0;
//纵向排列
public static final int VERTICAL = 1;
private Context mContext;
//指示器之间的间距
private int spacing;
//指示器排列方向
private int orientation = HORIZONTAL;
//选中与为选中的颜色
private ColorStateList selectedColor, normalColor;
//指示器样式,默认都是圆点
private int mStyle = STYLE_CIRCLR_CIRCLE;
//样式一 圆点半径大小
private int circleCircleRadius = 0;
//样式二 方形大小及圆角
private int rectRectItemWidth = 0, rectRectItemHeight = 0, rectRectCorner = 0;
//样式三 选中的方形大小及圆角
private int circleRectItemWidth = 0, circleRectItemHeight = 0, circleRectCorner = 0;
//样式三 未选中的圆点半径
private int circleRectRadius = 0;
//画笔
private Paint normalPaint, selectedPaint;
//指示器item的区域
private RectF mRectF;
//指示器大小
private int width, height;
//指示器item个数
private int itemCount = 0;
//当前选中的位置
private int selection = 0;
private ViewPager viewPager;
public UIndicator(Context context) {
this(context, null);
}
public UIndicator(Context context, @Nullable AttributeSet attrs) {
this(context, attrs, 0);
}
public UIndicator(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
init(attrs);
intPaint();
checkItemCount();
}
/**
- 加载自定义属性
*/
private void init(AttributeSet attrs) {
// 加载自定义属性集合
TypedArray ta = mContext.obtainStyledAttributes(attrs, R.styleable.Indicator);
// 第二个参数是默认设置颜色
selectedColor = ta.getColorStateList(R.styleable.Indicator_selected_color);
normalColor = ta.getColorStateList(R.styleable.Indicator_normal_color);
spacing = ta.getDimensionPixelSize(R.styleable.Indicator_spacing, dip2px(6));//6
orientation = ta.getInt(R.styleable.Indicator_orientation, HORIZONTAL);
mStyle = ta.getInt(R.styleable.Indicator_style, STYLE_CIRCLR_CIRCLE);
circleCircleRadius = ta.getDimensionPixelSize(R.styleable.Indicator_circle_circle_radius, dip2px(3));
rectRectCorner = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_corner, 0);
rectRectItemHeight = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_itemHeight, dip2px(3));
rectRectItemWidth = ta.getDimensionPixelSize(R.styleable.Indicator_rect_rect_itemWidth, dip2px(15));
circleRectCorner = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_corner, 0);
circleRectRadius = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_radius, dip2px(3));//3
circleRectItemHeight = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_itemHeight, dip2px(3));
circleRectItemWidth = ta.getDimensionPixelSize(R.styleable.Indicator_circle_rect_itemWidth, dip2px(15));
// 解析后释放资源
ta.recycle();
}
private void intPaint() {
normalPaint = new Paint();
normalPaint.setStyle(Paint.Style.FILL);
normalPaint.setAntiAlias(true);
normalPaint.setColor(normalColor == null ? Color.GRAY : normalColor.getDefaultColor());
selectedPaint = new Paint();
selectedPaint.setStyle(Paint.Style.FILL);
selectedPaint.setAntiAlias(true);
selectedPaint.setColor(selectedColor == null ? Color.RED : selectedColor.getDefaultColor());
mRectF = new RectF();
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
if (orientation == HORIZONTAL){
width = 2 * circleCircleRadius * itemCount + (itemCount - 1) * spacing;
height = Math.max(heightSize, 2 * circleCircleRadius);
} else {
height = 2 * circleCircleRadius * itemCount + (itemCount - 1) * spacing;
width = Math.max(widthSize, 2 * circleCircleRadius);
}
break;
case STYLE_RECT_RECT:
if (orientation == HORIZONTAL){
width = rectRectItemWidth * itemCount + (itemCount - 1) * spacing;
height = Math.max(heightSize, rectRectItemHeight);
} else {
height = rectRectItemHeight * itemCount + (itemCount - 1) * spacing;
width = Math.max(widthSize, rectRectItemWidth);
}
break;
case STYLE_CIRCLR_RECT:
if (orientation == HORIZONTAL){
int normalItemWidth = circleRectRadius * 2;
width = (itemCount - 1) * normalItemWidth + circleRectItemWidth + (itemCount - 1) * spacing;
int tempHeight = Math.max(circleRectItemHeight, circleRectRadius * 2);
height = Math.max(heightSize, tempHeight);
} else {
int normalItemHeight = circleRectRadius * 2;
height = (itemCount - 1) * normalItemHeight + circleRectItemHeight + (itemCount - 1) * spacing;
int tempWidth = Math.max(circleRectItemWidth, circleRectRadius * 2);
width = Math.max(widthSize, tempWidth);
}
break;
}
setMeasuredDimension(width, height);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (orientation == HORIZONTAL) {
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
float cy = height / 2;
for (int i = 0; i < itemCount; i++) {
int cx = (i + 1) * circleCircleRadius + i * spacing;
//全部绘制圆点,画笔的区别
canvas.drawCircle(cx, cy, circleCircleRadius, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_RECT_RECT:
for (int i = 0; i < itemCount; i++) {
int left = i * rectRectItemWidth + i * spacing;
mRectF.set(left, 0, left + rectRectItemWidth, rectRectItemHeight);
//全部绘制圆角矩形,画笔的区别
canvas.drawRoundRect(mRectF, rectRectCorner, rectRectCorner, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_CIRCLR_RECT:
for (int i = 0; i < itemCount; i++) {
int left = selection * (circleRectRadius * 2 + spacing);
int top;
if (selection == i) {
//选中的绘制圆角矩形
top = (height - circleRectItemHeight) / 2;
mRectF.set(left, top, left + circleRectItemWidth, circleRectItemHeight + top);
canvas.drawRoundRect(mRectF, circleRectCorner, circleRectCorner, selectedPaint);
} else {
//未选中的绘制圆点,距离需要判断position在选中的左边或者右边,从而确定cx
top = (height - circleRectRadius * 2) / 2;
int cx = 0;
float cy1 = circleRectRadius + top;
if (selection < i) {
cx = (i - 1) * circleRectRadius * 2 + i * spacing + circleRectItemWidth + circleRectRadius;
} else {
cx = i * (circleRectRadius * 2) + i * spacing + circleRectRadius;
}
canvas.drawCircle(cx, cy1, circleRectRadius, normalPaint);
}
}
break;
}
} else {
switch (mStyle) {
case STYLE_CIRCLR_CIRCLE:
float cx = width / 2;
for (int i = 0; i < itemCount; i++) {
int cy = i * (circleCircleRadius * 2 + spacing)+ circleCircleRadius;
//全部绘制圆点,画笔的区别
canvas.drawCircle(cx, cy, circleCircleRadius, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_RECT_RECT:
for (int i = 0; i < itemCount; i++) {
int top = i * rectRectItemHeight + i * spacing;
int left = (width - rectRectItemWidth) / 2;
mRectF.set(left, top, left + rectRectItemWidth, top + rectRectItemHeight);
//全部绘制圆角矩形,画笔的区别
canvas.drawRoundRect(mRectF, rectRectCorner, rectRectCorner, i == selection ? selectedPaint : normalPaint);
}
break;
case STYLE_CIRCLR_RECT:
for (int i = 0; i < itemCount; i++) {
if (selection == i) {
int left = (width - circleRectItemWidth) / 2;
//选中的绘制圆角矩形
int top = selection * (circleRectRadius * 2 + spacing);
mRectF.set(left, top, left + circleRectItemWidth, top + circleRectItemHeight);
canvas.drawRoundRect(mRectF, circleRectCorner, circleRectCorner, selectedPaint);
} else {
//未选中的绘制圆点,距离需要判断position在选中的左边或者右边,从而确定cx
int cx1 = (width - 2 * circleRectRadius) / 2 + circleRectRadius;
float cy1 = 0;
if (selection < i) {
cy1 = (i - 1) * circleRectRadius * 2 + i * spacing + circleRectItemHeight + circleRectRadius;
} else {
cy1 = i * (circleRectRadius * 2) + i * spacing + circleRectRadius;
}
canvas.drawCircle(cx1, cy1, circleRectRadius, normalPaint);
}
}
break;
}
}
}
总结
最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上相关的我搜集整理的Android开发中高级必知必会核心笔记,共计2968页PDF、58w字,囊括Android开发648个知识点,我把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包知识脉络 + 诸多细节。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-kBn8o8uq-1715729685332)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
2021年虽然路途坎坷,都在说Android要没落,但是,不要慌,做自己的计划,学自己的习,竞争无处不在,每个行业都是如此。相信自己,没有做不到的,只有想不到的。
虽然面试失败了,但我也不会放弃入职字节跳动的决心的!建议大家面试之前都要有充分的准备,顺顺利利的拿到自己心仪的offer。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!