最全Android 项目总结(一):弧形ViewPager 和弧形HeaderView,2024年最新嵌入式工程师面试题

总结

笔者之前工作是在金融公司可能并不是特别追求技术,而笔者又是喜欢追求技术的人,所以格格不入,只能把目标放在互联网大厂了。也希望大家都去敢于尝试和追逐自己的梦想!
BATJ大厂Android高频面试题

觉得有收获的记得点赞,关注+收藏哦!你们的点赞就是我的动力!

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

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

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

1, 静态的弧形header
2, 弧形ViewPager

思路:

怎么做出上面的两种效果呢?其实说是两种效果,其实只有一种效果,那就是静态弧形Header View ,搞定了这个,后面的ViewPager效果就简单了。

弧形ViewPager,我们可以把它拆成2部分:

1 . 弧形Header View 做为背景。
2 . 透明的普通ViewPager.

重点来了,这个弧形的Header View 怎么来做呢?我们通过自定义View 来做,我们再来仔细看一下这个View:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由两部分组成:矩形+弧形,上面的矩形绘制很简单,不多说。下面的弧形,可以通过二阶贝塞尔曲线来绘制。

三、自定义 ArcHeaderView

通过上面的分析,我们知道它就是一个 矩形 + 一条弧线,我们可以通过Path 来组合两种形状。最终绘制出我们所要的形状。

二阶贝塞尔曲线:

首先我们来看一下二阶贝塞尔曲线。补充一下二阶贝塞尔曲线的知识点:

二阶曲线由两个数据点(A 和 C),一个控制点(B)来描述曲线状态,大致如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

上图中红色曲线部分就是传说中的二阶贝塞尔曲线,那么这条红色曲线是如何生成的呢?接下来我们就以其中的一个状态分析一下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

连接AB BC,并在AB上取点D,BC上取点E,使其满足条件:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

连接DE,取点F,使得:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样获取到的点F就是贝塞尔曲线上的一个点,动态过程如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

绘制一段二阶贝塞尔曲线需要三个点:一个起始点,一个终点和一个控制点。控制点的位置不同,决定了曲线的弯曲程度不同。绘制二阶贝塞尔曲线的方法为:quadTo(float x1, float y1, float x2, float y2)

绘制代码如下:

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);

mWidth = w;
mHeight = h;

mPath.reset();
// 上半部分矩形
mPath.moveTo(0, 0);
mPath.addRect(0, 0, mWidth, mHeight - mArcHeight, Path.Direction.CCW);

// 起始点
mStartPoint.x = 0;
mStartPoint.y = mHeight - mArcHeight;
// 终点
mEndPoint.x = mWidth;
mEndPoint.y = mHeight - mArcHeight;
// 控制点
mControlPoint.x = mWidth / 2 - 50;
mControlPoint.y = mHeight + 100;

// 初始化shader
mLinearGradient = new LinearGradient(mWidth / 2, 0, mWidth / 2, mHeight, mStartColor, mEndColor, Shader.TileMode.MIRROR);

invalidate();

}

最后再onDraw 方法中,直接调用方法绘制就好。

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

mPaint.setShader(mLinearGradient);

mPath.moveTo(mStartPoint.x, mStartPoint.y);
// 添加贝塞尔曲线
mPath.quadTo(mControlPoint.x, mControlPoint.y, mEndPoint.x, mEndPoint.y);
// 绘制
canvas.drawPath(mPath, mPaint);
}

最终效果如下:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ArcHeaderView 的全部代码如下:

public class ArcHeaderView extends View {
private Paint mPaint;
private PointF mStartPoint, mEndPoint, mControlPoint;
private int mWidth;
private int mHeight;
private Path mPath = new Path();
private int mArcHeight = 100;// 圆弧高度
private int mStartColor;
private int mEndColor;
private LinearGradient mLinearGradient;

public ArcHeaderView(Context context) {
super(context);
init();
}

public ArcHeaderView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
init();
}

public ArcHeaderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public ArcHeaderView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
init();
}

private void init() {
mPaint = new Paint();
// mPaint.setColor(Color.parseColor(“#37B99F”));
mPaint.setAntiAlias(true);
mPaint.setStrokeWidth(10);
mPaint.setStyle(Paint.Style.FILL);

mStartPoint = new PointF(0, 0);
mEndPoint = new PointF(0, 0);
mControlPoint = new PointF(0, 0);

mStartColor = Color.parseColor(“#FF3A80”);
mEndColor = Color.parseColor(“#FF3745”);

}

/**
*

  • @param startColor
  • @param endColor
    */
    public void setColor(@ColorInt int startColor, @ColorInt int endColor) {
    mStartColor = startColor;
    mEndColor = endColor;
    mLinearGradient = new LinearGradient(mWidth / 2, 0, mWidth / 2, mHeight, mStartColor, mEndColor, Shader.TileMode.MIRROR);
    invalidate();
    }

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);

mWidth = w;
mHeight = h;

mPath.reset();

mPath.moveTo(0, 0);
mPath.addRect(0, 0, mWidth, mHeight - mArcHeight, Path.Direction.CCW);

mStartPoint.x = 0;
mStartPoint.y = mHeight - mArcHeight;

mEndPoint.x = mWidth;
mEndPoint.y = mHeight - mArcHeight;

mControlPoint.x = mWidth / 2 - 50;
mControlPoint.y = mHeight + 100;

// 初始化shader
mLinearGradient = new LinearGradient(mWidth / 2, 0, mWidth / 2, mHeight, mStartColor, mEndColor, Shader.TileMode.MIRROR);

///SweepGradient sweepGradient = new SweepGradient(mEndPoint.x / 2,mEndPoint.y / 2,mStartColor,mEndColor);
//mPaint.setShader(sweepGradient);

invalidate();

}

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);

mPaint.setShader(mLinearGradient);

mPath.moveTo(mStartPoint.x, mStartPoint.y);
mPath.quadTo(mControlPoint.x, mControlPoint.y, mEndPoint.x, mEndPoint.y);

canvas.drawPath(mPath, mPaint);
}
}

四、弧形ViewPager 效果

有了上面的自定义ArcHeaderView ,要做这个ViewPager 的效果比较简单。前面已经分析,这里不赘述。直接上代码:

布局文件如下:

<?xml version="1.0" encoding="utf-8"?>

最后

有任何问题,欢迎广大网友一起来交流,分享高阶Android学习视频资料和面试资料包~

偷偷说一句:群里高手如云,欢迎大家加群和大佬们一起交流讨论啊!

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

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

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

MWDmimr7-1715344265267)]

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

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

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

  • 17
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值