在面试程序员岗位时,我们往往需要经历一个编程面试过程,雇主会借此考验面试者的技术实力。然而,这些技术问题有时候却和我们的实际工作并无太大关系,也由此可能给我们的编程面试准备阶段带来很大的压力。我也因此写出这篇文章,相信能给即将进入职场的程序员带来帮助。

//定义测试数据
mAbilityInfo = new String[]{“破坏力”, “速度”, “射程距离”, “持久力”, “精密度”, “成长性”};
mAbilityMark = new int[]{100, 100, 60, 100, 100, 100};
mMarkMapper = new String[]{“A”, “B”, “C”, “D”, “E”};

/**

  • 绘制文字
  • @param canvas 画布
    */
    private void drawInfoText(Canvas canvas) {
    float r2 = mRadius - 0.08f * mRadius;//下圆半径
    for (int i = 0; i < 6; i++) {
    canvas.save();
    canvas.rotate(60 * i + 180);
    mTextPaint.setTextSize(mRadius * 0.1f);
    canvas.drawText(mAbilityInfo[i], 0, r2 - 0.06f * mRadius, mTextPaint);
    mTextPaint.setTextSize(mRadius * 0.15f);
    canvas.drawText(abilityMark2Str(mAbilityMark[i]), 0, r2 - 0.18f * mRadius, mTextPaint);
    canvas.restore();
    }
    mTextPaint.setTextSize(mRadius * 0.07f);
    for (int k = 0; k < 5; k++) {
    canvas.drawText(mMarkMapper[k], mRadius * 0.06f, mInnerRadius / 6 * (k + 1) + mRadius * 0.02f - mInnerRadius, mTextPaint);
    }
    }

/**

  • 将分数映射成字符串
  • @param mark 分数100~0
  • @return
    */
    private String abilityMark2Str(int mark) {
    if (mark <= 100 && mark > 80) {
    return mMarkMapper[0];
    } else if (mark <= 80 && mark > 60) {
    return mMarkMapper[1];
    } else if (mark <= 60 && mark > 40) {
    return mMarkMapper[2];
    } else if (mark <= 40 && mark > 20) {
    return mMarkMapper[3];
    } else if (mark <= 20 && mark > 0) {
    return mMarkMapper[4];
    }
    return “∞”;
    }

4.最后一步:画内容

本以为就连个点的事,没想到…打了我半页草稿纸(手动表情–可怕)

展现在你眼前的就是个for循环而已,实际上都是通过一点点分析,测试与发现规律算出来的
有什么技巧?草稿纸拿出来画图,计算+分析…,只靠眼睛是不行的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-68O0LVhY-1649752173271)(https://user-gold-cdn.xitu.io/2018/12/28/167f37247dd07fac?imageView2/0/w/1280/h/960/ignore-error/1)]

//我不喜欢弄脏画笔,再准备一支吧
mAbilityPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
mAbilityPaint.setColor(0x8897C5FE);
mAbilityPath = new Path();

/**

  • 绘制能力面
  • @param canvas
    /
    private void drawAbility(Canvas canvas) {
    float step = mInnerRadius / 6;//每小段的长度
    mAbilityPath.moveTo(0, -mAbilityMark[0] / 20.f * step);//起点
    for (int i = 1; i < 6; i++) {
    float mark = mAbilityMark[i] / 20.f;
    mAbilityPath.lineTo(
    (float) (mark * step * Math.cos(Math.PI/180
    (-30+60*(i-1)))),
    (float) (mark * step * Math.sin(Math.PI/180*(-30+60*(i-1)))));
    }
    mAbilityPath.close();
    canvas.drawPath(mAbilityPath, mAbilityPaint);
    }

这样就完成了,你以为这样就结束了?这才刚开始呢!


二、数据的提取与封装

刚才用的是测试数据,都写死在View中,这肯定是不行的

现在将数据封装一下,再暴露接口方法,打开View和外界的通路


1.View的尺寸限定

使用宽度作为直径,无视高度,尺寸为圆形区域

如下所示:可看出所有的尺寸都是和按照mRadius来确定的,所以缩放时也会等比

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eBohn1La-1649752173272)(https://user-gold-cdn.xitu.io/2018/12/28/167f37247ce6d2c6?imageView2/0/w/1280/h/960/ignore-error/1)]

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mRadius = MeasureSpec.getSize(widthMeasureSpec) / 2;
mInnerRadius = 0.6f * mRadius;
setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(widthMeasureSpec));
}


2.数据处理

为了方便查看数据间关系,使用Map将能力与数值装一下

private HashMap<String, Integer> mData;//核心数据

//数据的刚才的对接
mData = new HashMap<>();
mData.put(“破坏力”, 100);
mData.put(“速度”, 100);
mData.put(“射程距离”, 60);
mData.put(“持久力”, 100);
mData.put(“精密度”, 100);
mData.put(“成长性”, 100);

mAbilityInfo = mData.keySet().toArray(new String[mData.size()]);
mAbilityMark = mData.values().toArray(new Integer[mData.size()]);


3.数据与字符的映射关系:DataMapper

也就是100~80之间的代表字符串可以自定义,比如"1" 、 “I” 、"☆"随你便

这也是我刚悟到的一种解耦方式,应该算是策略设计模式吧(只能分五个等级)
如果自定义分类情况重写abilityMark2Str方法就行了

/**

  • 作者:张风捷特烈
  • 时间:2018/12/28 0028:12:21
  • 邮箱:1981462002@qq.com
  • 说明:数据映射抽象类
    */
    public class DataMapper {
    protected String[] mapper;

public DataMapper(String[] mapper) {
if (mapper.length != 5) {
throw new IllegalArgumentException(“the length of mapper must be 5”);
}
this.mapper = mapper;
}

public String[] getMapper() {
return mapper;
}

/**

  • 数值与字符串的映射关系
  • @param mark 数值
  • @return 字符串
    */
    public String abilityMark2Str(int mark) {
    if (mark <= 100 && mark > 80) {
    return mapper[0];
    } else if (mark <= 80 && mark > 60) {
    return mapper[1];

} else if (mark <= 60 && mark > 40) {
return mapper[2];

} else if (mark <= 40 && mark > 20) {
return mapper[3];

} else if (mark <= 20 && mark > 0) {
return mapper[4];
}
return “∞”;
}
}

给一个默认的映射类:WordMapper

也就是刚才在View里写的那个方法

/**

  • 作者:张风捷特烈
  • 时间:2018/12/28 0028:12:24
  • 邮箱:1981462002@qq.com
  • 说明:单词映射
    */
    public class WordMapper extends DataMapper {

public WordMapper() {
super(new String[]{“A”, “B”, “C”, “D”, “E”});
}

View里如何修改呢?

//定义成员变量
private DataMapper mDataMapper;//数据与字符串映射规则

//init里
mDataMapper = new WordMapper();//初始化DataMapper–默认WordMapper

//绘制文字的时候由mDataMapper提供数据
private void drawInfoText(Canvas canvas) {
float r2 = mRadius - 0.08f * mRadius;//下圆半径
for (int i = 0; i < 6; i++) {
canvas.save();
canvas.rotate(60 * i + 180);
mTextPaint.setTextSize(mRadius * 0.1f);
canvas.drawText(mAbilityInfo[i], 0, r2 - 0.06f * mRadius, mTextPaint);
mTextPaint.setTextSize(mRadius * 0.15f);
canvas.drawText(
mDataMapper.abilityMark2Str(mAbilityMark[i]), 0, r2 - 0.18f * mRadius, mTextPaint);
canvas.restore();
}
mTextPaint.setTextSize(mRadius * 0.07f);
for (int k = 0; k < 5; k++) {
canvas.drawText(mDataMapper.getMapper()[k], mRadius * 0.06f, mInnerRadius / 6 * (k + 1) + mRadius * 0.02f - mInnerRadius, mTextPaint);
}
}

//暴漏get、set方法—提供外界设置
public DataMapper getDataMapper() {
return mDataMapper;
}

public void setDataMapper(DataMapper dataMapper) {
mDataMapper = dataMapper;
}

//暴漏设置数据方法给外部
public HashMap<String, Integer> getData() {
return mData;
}

public void setData(HashMap<String, Integer> data) {
mData = data;
mAbilityInfo = mData.keySet().toArray(new String[mData.size()]);
mAbilityMark = mData.values().toArray(new Integer[mData.size()]);
invalidate();
}


4.使用方法:

使用DataMapper将字符串抽离出来,并且还可以根据数值来主要以返回字符串

AbilityView abilityView = findViewById(R.id.id_ability_view);
mData = new HashMap<>();
mData.put(“Java”, 100);
mData.put(“Kotlin”, 70);
mData.put(“JavaScript”, 100);
mData.put(“Python”, 60);
mData.put(“Dart”, 50);
mData.put(“C++”, 60);
abilityView.setDataMapper(new DataMapper(new String[]{“神”, “高”, “普”, “新”, “入”}));
abilityView.setData(mData);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TnmQFo1m-1649752173272)(https://user-gold-cdn.xitu.io/2018/12/28/167f3724b07c786f?imageView2/0/w/1280/h/960/ignore-error/1)]

ok,搞定,你以为完了?No,精彩继续


三、n条属性任你比

搞了个6个,不得了了吗?可见其中还有一个死的东西,那就是数据条数

这个就麻烦了,如果刚才是0->1的创造,填充数据是1->2的积累,那接下来就是2->n的生命
好吧,我又打了半张草稿纸,终于算完了!View一共不到200行代码,感觉很优雅了
有兴趣的自己研究(画画图,打打草稿),没兴趣的直接拿去用,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0AvY0U9L-1649752173273)(https://user-gold-cdn.xitu.io/2018/12/28/167f393ec85da9dd?imageView2/0/w/1280/h/960/ignore-error/1)]

/**

  • 作者:张风捷特烈
  • 时间:2018/12/28 0028:7:40
  • 邮箱:1981462002@qq.com
  • 说明:能力对比图
    */
    public class AbilityView extends View {
    private static final String TAG = “AbilityView”;
    private float mRadius = dp(100);//外圆半径
    private float mLineWidth = dp(1);//线宽
    private Paint mLinePaint;//线画笔
    private Paint mFillPaint;//填充画笔
    private Path mPath;
    private HashMap<String, Integer> mData;//核心数据
    private Paint mTextPaint;
    String[] mAbilityInfo;
    Integer[] mAbilityMark;
    private float mInnerRadius;
    private Path mAbilityPath;
    private Paint mAbilityPaint;
    private DataMapper mDataMapper;//数据与字符串映射规则

public AbilityView(Context context) {
this(context, null);
}

如何做好面试突击,规划学习方向?

面试题集可以帮助你查漏补缺,有方向有针对性的学习,为之后进大厂做准备。但是如果你仅仅是看一遍,而不去学习和深究。那么这份面试题对你的帮助会很有限。最终还是要靠资深技术水平说话。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。建议先制定学习计划,根据学习计划把知识点关联起来,形成一个系统化的知识体系。

学习方向很容易规划,但是如果只通过碎片化的学习,对自己的提升是很慢的。

我搜集整理过这几年字节跳动,以及腾讯,阿里,华为,小米等公司的面试题,把面试的要求和技术点梳理成一份大而全的“ Android架构师”面试 Xmind(实际上比预期多花了不少精力),包含知识脉络 + 分支细节

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

I5?x-oss-process=image/format,png)

在搭建这些技术框架的时候,还整理了系统的高级进阶教程,会比自己碎片化学习效果强太多。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

Android开发不会这些?如何面试拿高薪!

Android自定义控件(高手级)--JOJO同款能力分析图,这份字节跳动历年校招Android面试真题解析相关推荐

  1. kotlin发音!这份字节跳动历年校招Android面试真题解析,附架构师必备技术详解

    前言 从2010年开始Android市场开始需要大量的Android开发人员,招聘市场上也开始大量招Android开发人员,大量java开发者开始学习Android开发,招聘市场面试要求上只要有一定j ...

  2. android巴士!这份字节跳动历年校招Android面试真题解析,面试必问

    想要成为一名优秀的Android开发,你需要一份完备的知识体系,在这里,让我们一起成长为自己所想的那样. 本文参考了目前大部分 Android 应用启动优化的方案,将大家的方案做一个汇总,如果你有这方 ...

  3. Android开发经验谈:这份字节跳动历年校招Android面试真题解析,薪资翻倍

    前言 职场的"金三银四"跳槽季过去了,但是紧接着,眼下"金九银十"又来了. 不同的是今年比往年「冷」一些,形式更加严峻一些,大家多多少少可能都听到或看到一些信息 ...

  4. 字节跳动历年校招Android面试真题解析,实战解析

    前言 笔者是某211非计算机相关专业2018届本科生,在校期间有半年多的互联网小公司实习经历. 毕业之后投递360 ,入职了360企业安全成为专门的前端开发工程师,有幸进入一个很赞的团队,遇到很棒的导 ...

  5. 字节跳动历年校招Android面试真题解析,大厂直通车!

    进大厂本来就很难了,不过做足了准备,你会发现很多问题都迎刃而解了,当然有时候运气也占了一部分,除了运气以外,当然与我自身的努力也是分不开的.运气也是实力的一部分,毕竟天助自助者~ 每次到年底做总结的时 ...

  6. 安卓实例开发录音应用!Android架构组件Room功能详解,面试真题解析

    越来越多的人在提"移动端的下半场"."Android 开发的焦虑"之类的,也有人在喊"技术天天在变,学也学不完","昨天 Kotl ...

  7. android广告页白屏_年度整理!2056页《大厂安卓岗面试真题解析合集》火爆全网...

    前言 2020年还有最后一个月就结束了,时间一眨眼就过去了.今年面试有没有被面试官虐呢,明年跳槽想跳去哪个大厂呢,这是个问题.说实话,今年我面试也被虐了,为了明年能找到一份心怡的工作,特地的从朋友那里 ...

  8. android手机模拟器!手持4个大厂offer的我,面试真题解析

    前言 说起IT行业,大多数人脑海里反应出的第一个标签一定是"高薪",而说起程序员,大家更多想到的可能是: 秃顶.木讷.格子衫: 加班多.能赚钱.不花钱: 没对象-- 这难道就是传说 ...

  9. 996页阿里Android面试真题解析火爆全网,分享面经!

    导语 学历永远是横在我们进人大厂的一道门槛,好像无论怎么努力,总能被那些985,211 按在地上摩擦! 不仅要被"他们"看不起,在HR挑选简历,学历这块就直接被刷下去了,连证明自己 ...

  10. Android大厂面试真题解析大全,安卓未来路在何方

    前言 经常会有人问:"现在学习Android开发还有前景?"我的看法是现在只是市场趋于平稳了,对开发人员的要求越来越好了,这并不代表没有前景了. 移动开发不等于App开发,所有新的 ...

最新文章

  1. R语言ggplot2可视化:绘制堆叠的密度图(Stacked Area Chart)
  2. 浅谈对主成分分析(PCA)算法的理解
  3. Linux界面自动化测试框架不完全汇总
  4. DCOS实践分享(4):如何基于DC/OS整合SMACK(Spark, Mesos, Akka, Cassandra, Kafka)
  5. sql修改表字段数据类型
  6. 添加 XmlDocument 元素 和 属性
  7. (JAVA版)冒泡排序
  8. python数据包之利器scapy用法!
  9. 天天唠叨的MySQL优化,到底该怎么玩?
  10. 知云文献翻译选中翻译出现乱码的解决方式
  11. Android 完美高仿的微信源码
  12. virtualbox安装Windows 7 64位旗舰版 (包含镜像文件)
  13. 高数 | 利用定积分定义求极限
  14. 技校学高铁还是计算机,华蓥高铁动车司学那个专业好,高铁职业技术学校面试...
  15. Android Studio 开关控件Switch使用
  16. Java编程练习:100以内的质数的输出
  17. 127.0.0.1 192.168 localhost 之间的区别
  18. Convex Clustering(凸聚类)
  19. mysql中文日期转换_mysql 日期转换
  20. 状态压缩DP UVa10817-Headmaster's Headache

热门文章

  1. ubuntu搭建PHP网站完整实例教程
  2. obs噪音抑制调多少合适_(3)阿里国际站OBS申请设置使用教程,OBS音频没有声音怎么办?国际站直播回放如何下载?...
  3. 论码流、码率、采样率、比特率、帧速率、分辨率、高清视频的概念
  4. python读取grib2文件
  5. 求一元多项式 P(x) = a0 + a1x + a2x^2 + ... + anx^n 的值P(x0)。
  6. Spring初窥门径
  7. 炼数成金Tensorflow学习笔记之6.2_卷积神经网络
  8. puppeteer-recorder
  9. golang 环境搭建-windows
  10. SEO优化的四个建议