Android高级UI面试题汇总(含详细解析二十九)

2025 最新!一线大厂 Android 自定义 View 面试真题 本文聚焦Android自定义View的Kotlin开发,精心整理了15道模拟一线大厂面试中可能出现的题目,内容涵盖事件传递机制、触摸事件处理、性能优化、测量与布局、动画实现等多方面知识,从基础到高级层层递进。每道题不仅给出详细解答,还附上难度评级,为准备Android开发面试的人员提供全面的知识梳理与应试指导,助力其在面试中充分展示技能和经验。 阅读详情

Android并发编程高级面试题汇总最全最细面试题讲解持续更新中👊👊
👀你想要的面试题这里都有👀
👇👇👇

如何优化自定义View

这道题想考察什么?

考察同学对自定义View的注意点是否熟悉。

考生应该如何回答

降低刷新频率

为了提高view的运行速度,减少来自于频繁调用的程序的不必要的代码。从onDraw()方法开始调用,这会给你带来最好的回报。特别地,在onDraw()方法中你应该减少冗余代码,冗余代码会带来使你view不连贯的垃圾回收。初始化的冗余对象,或者动画之间的,在动画运行时,永远都不会有所贡献。
加之为了使onDraw()方法更有依赖性,你应该尽可能的不要频繁的调用它。大部分时候调用 onDraw()方法就是调用invalidate()的结果,所以减少不必要的调用invalidate()方法。有可能的,调用四种参数不同类型的invalidate(),而不是调用无参的版本。无参变量需要刷新整个view,而四种参数类型的变量只需刷新指定部分的view。这种高效的调用更加接近需求,也能减少落在矩形屏幕外的不必 要刷新的页面。
另外一个十分耗时的操作是请求layout。任何时候执行requestLayout(),会使得Android UI系统去遍历整个View的层级来计算出每一个view的大小。如果找到有冲突的值,它会需要重新计算很多次。另外需要尽量保持View的层级是扁平化的,这样对提高效率很有帮助。 如果你有一个十分复杂的界面,你应该写一个自定义的ViewGroup类来表现它的布局。不同于内置的 view类,你的自定义view能关于尺寸和它子控件的形状做出应用特定的假想,同时避免通过它子类来 计算尺寸。这圆图例子显示怎样作为自定义view一部分来继承ViewGroup类,圆图有它子view类, 但是从来都不测量他们。相反地,它直接地通过自己自定义的布局算法来设定他们的尺寸大小。
如果你有一个复杂的UI,你应该思考写一个自定义的ViewGroup来执行他的layout操作。与内置的view不同,自定义的view可以使得程序仅仅测量这一部分,这避免了遍历整个view的层级结构来计算大小。这个PieChart 例子展示了如何继承ViewGroup作为自定义view的一部分。PieChart 有子views,但是它从来不测量它们。而是根据他自身的layout法则,直接设置它们的大小。

使用硬件加速

作为Android3.0,Android2D图表系统可以通过大部分新的Android装置自带GPU(图表处理单元)来增加,对于许多应用程序 来说,GPU硬件加速度能带来巨大的性能增加,但是对于每一个应用来讲,并不都是正确的选择。Android框架层更好地为你提供了控制应用程序部分硬件 是否增加的能力。
怎样在你的应用,活动,或者窗体级别中使用加速度类,请查阅Android开发者指南中的Hardware Acceleration类。注意到在开发者指南中的附加说明,你必须在你的AndroidManifest.xml 文件中的中将应用目标API设置为11或者更高的级别。
一旦你使用硬件加速度类,你可能没有看到性能的增长,手机GPUs非常擅长某些任务,例如测量,翻转,和平移位图类的图片。特别地,他们不擅长其他的任务,例如画直线和曲线。为了利用GPU加速度类,你应该增加GPU擅长的操作数量,和减少GPU不擅长的操作数量。

减少过度渲染

当UI之间有重叠的时候,虽然后面的UI用户看不到,但是还是会绘制,这部分的绘制就是过度渲染。
一般通过Canvas.clipXxx 方法来裁剪区域,让看不到的地放不绘制,从而达到减少过度渲染的目的。

初始化时创建对象

不要在onDraw方法内创建绘制对象,一般都在构造函数里面初始化对象;

@Override
protected void onDraw(Canvas canvas) {
    if (getDrawable() == null) {
        return;
    }
    setUpShader();
    canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
    if (mType == TYPE_ROUND) {
        canvas.drawRoundRect(mRoundRect, mBorderRadius, mBorderRadius, mBitmapPaint);
    } else {
        canvas.drawCircle(mRadius, mRadius, mRadius, mBitmapPaint);
    }
}
状态的存储与恢复

如果内存不足,而正好我们的Activity置于后台,不幸被重启,或者用户旋转屏幕造成Activity重启,我们的View应该也能尽可能的去保存自己的属性。

@Override
protected Parcelable onSaveInstanceState() {
    Bundle bundle = new Bundle();
    bundle.putParcelable(STATE_INSTANCE, super.onSaveInstanceState());
    bundle.putInt(STATE_TYPE, mType);
    bundle.putInt(STATE_BORDER_RADIUS, mBorderRadius);
    return bundle;
}
 
@Override
protected void onRestoreInstanceState(Parcelable state) {
    if (state instanceof Bundle) {
        Bundle bundle = (Bundle) state;
        super.onRestoreInstanceState(((Bundle) state).getParcelable(STATE_INSTANCE));
        this.mType = bundle.getInt(STATE_TYPE);
        this.mBorderRadius = bundle.getInt(STATE_BORDER_RADIUS);
    } else {
        super.onRestoreInstanceState(state);
    }
}

由于面试题内容比较多,篇幅有限,资料已经被整理成了PDF文档,有需要2023年Android中高级最全面试真题答案 完整文档的可扫描下方卡片免费获取~

PS:(文末还有使用ChatGPT机器人小福利哦!!大家不要错过)

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机

img

(二十九)安卓开发中DataBinding 和 ViewBinding详解 是 Android Jetpack 提供的一项功能,旨在替代传统的方法。它通过为每个 XML 布局文件生成一个绑定类,使得开发者可以直接通过这个类访问布局中的视图,而无需手动查找视图 ID。这不仅提高了代码的可读性,还提供了类型安全和空安全的好处。是一个更强大的工具,不仅提供 ViewBinding 的视图访问功能,还允许在 XML 布局中直接绑定数据源。它可以让 UI 组件与数据对象建立绑定关系,当数据发生变化时,UI 会自动更新,反之亦然(双向绑定)。 阅读详情

相关推荐

Android进阶(二十九) 走近 IntentFilter

如果过滤器仅指定了一个scheme,所有该scheme的URIs都能够和这个过滤器相匹配;如果过滤器指定了一个scheme、主机名但没有路经部分,所有具有相同scheme和主机名的URIs都可以和这个过滤器相匹配,而不管它们的路经;如果过滤器指定了一个scheme、主机名和路经,只有具有相同scheme、主机名和路经的URIs才可以和这个过滤器相匹配。当然,一个过滤器中的路径规格可以包含通配符,这样只需要部分匹配即可。file: URI例如。

2401_84433807的博客 1142

2021年Android面试题---View

1.能简单说一下事件分发机制吗?

xingfuyisheng的专栏 907

Android自定义View最全面试题及参考答案

为了创建一个完全自定义的进度条,你可以创建一个新的View类并重写onDraw()方法。init();init();init();@Override// 重新绘制视图。

大模型大数据攻城狮的专栏 1204

5个Android自定义View相关的面试题

自定义View是Android开发中一个核心的概念,它允许开发者根据应用的特定需求来创建新的视图组件。自定义View的重要性在于它提供了高度的灵活性和创新性,使得开发者可以创建出独特的用户界面和交互体验。自定义View通常涉及继承View或其子类,并重写onMeasureonLayout和onDraw等方法来定义视图的行为和外观。自定义View的绘制流程主要涉及以下几个步骤:首先,通过onMeasure方法确定View的大小;接着,在onLayout方法中确定View及其子View的位置;最后,在。

AntDream的程序世界 701

自定义View相关面试题

一.说一说你对RecycleView的认识。 1.RecycleView的概述。RecycleView是一个滚动控件,可以看作的ListView的升级版,不仅可以轻松的完成ListView的效果,还可以实现其他效果,例如横向滑动、瀑布流等。而且还封装优化了ListView的缺点,例如:ViewHolder的复用。 2. ...

龚礼鹏的博客 4889

EasyClick 原生UI教程

EasyClick 原生UI教程总纲 这篇主要列出本人创作的EasyClick 原生UI连载系列所有文章。

Mr、老鬼的博客 1万+

Android高级UI详解汇总

Android高级UI开发(一)RecyclerView控件的基本使用 Android高级UI开发(二)RecyclerView控件使用----列表项的单击事件、添加(删除)列表项 Android高级UI开发 ( 三 )RecyclerView控件---高级进阶之自己绘制列表分隔线 ...

gaoxiaoweiandy的专栏 4438

【雷达图】R语言绘制雷达图(ggradar),NBA季后赛数据为例

一起用R语言给nba球星画球技雷达图吧!

池塘春草梦的博客 6252

跨平台应用开发进阶(二十九) :uni-app 实现Android原生APP-云打包集成神策详细教程_uniapp转安卓原生

【Android 详细知识点思维脑图(技能树)】我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2301_82243493的博客 1502

delphi android发送与接收广播

在发送广播时,使用`SendBroadcast`函数,并传入广播的Action。在接收广播时,创建一个继承自`TAndroidBroadcastReceiver`的类,并在`onReceive`方法中处理接收到的广播。然后,使用`RegisterBroadcastReceiver`函数注册广播接收器,并在`UnregisterBroadcastReceiver`函数中取消注册。请注意替换示例代码中的`YOUR_ACTION`为实际的广播Action。// 处理接收到的广播。

GuoGuoABC 1207

MATLAB打开.m文件乱码解决办法

Matlab打开.m文件出现中文乱码问题,是因为Matlab存在两种编码格式:GBK和UTF-8,而不同版本的Matlab编码格式可能不统一,因此在不同版本的Matlab打开文件,由于编码格式的改变,会导致注释乱码。 1.查看你的Matlab的文件编码方式,在Matlab的命令行窗口输入feature('locale') ,如下图,可以看到默认编码为GBK,那问题就变成了将Matlab的文件编码方式GBK修改成UTF-8; 2.找到你的Matlab安装目录bin文件夹下的lcdata_utf.

zhugby的博客 4万+

android用户界面之WebView教程实例汇总

android用户界面之WebView教程实例汇总 用户界面是android开发中最基础的功能,也是与用户交互最直接的方式。 通过学习安卓开发这段时间,很容易找到关于android的各种UI常见元素的教程与实例。比如说:WebView,Edittext,Button,ListView,TextView,checkbox,layout,surfacevi...

weixin_33772645的博客 127

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

安卓开发笔记(二十九):顶部标题栏

安卓开发笔记(二十九):顶部标题栏 首先上图: 实现这个标题栏,我们还需要一个返回的按钮,这里也贴出来。笔者直接将这个简单的标题栏制作成了一个依赖库,放在到github上,方便下次进行调用。 返回按钮如下: 在使用这个按钮的时候需要注意其尺寸的大小一定要小于我们的标题栏。 view_top.xml <?xml version...

极歌科技 1583

微信PC端Multi文件夹数据库解析:语音消息导出与转换实战指南

本文提供了一份详细的微信PC端语音消息导出与转换实战指南。通过解析Multi文件夹中的MediaMSG数据库,指导用户定位、解密数据库,并利用Python脚本精准提取SILK格式语音,最终转换为通用的WAV或MP3格式,实现个人语音数据的本地备份与处理。

garlic的博客 583

海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程

本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。

weixin_29034963的博客 338

Android入门笔记汇总

不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累! Android入门笔记汇总 Android学习体系结构图 Android学习笔记一之Android基础 Android学习笔记二之Android基础 Android学习笔记三之Android基础 Android学习笔记四之Activity Android学习笔记五之Service

u012426327的专栏 872

ML307A模组连接ONENET平台(AT指令步骤教程)

ML307A 是一款集成度高、体积小的物联网通信模组,支持多种无线通信协议,如 LoRa、NB-IoT 等。它具有低功耗、远程通信等特点,适用于多种物联网场景。支持 LoRa 和 NB-IoT 等多种无线通信标准。提供丰富的 GPIO 接口。内置多种传感器支持。UART 接口:用于与微控制器或其他设备通信。GPIO 接口:可以连接外部传感器或执行器。电源接口:用于供电。OneNET 是中国移动推出的一款物联网开放平台,它提供了从数据采集、存储到分析的一站式解决方案。

xiewengeng的博客 5481

Android 天气APP(二十九)壁纸设置、图片查看、图片保存

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

egrhef的博客 895

STM32 W5500 Freemodbus Modbus TCP协议功能实现

STM32F103VCT6 W5500(SPI1),实现Modbus-TCP协议的功能

坚韧与专注 2万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Android知识点归纳总结

文章目录 一、Android四大组件 二、Fragment相关 三、动画相关 四、布局相关 五、数据存储 六、线程、进程 七、网络 八、WebView 九、图片 十、Camera相关 十一、音视频相关 十二、ViewPager相关 十三、RecyclerView相关 十四、Canvas相关 十五、传感器相关 十六、性能优化 十七、UI适配 十八、Android中的Context 十九、序列化与反序列化 二十、JSON解析 .

QY'UniverseSpace的博客 2314

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

上一篇: Android高级UI面试题汇总(含详细解析二十八)
下一篇: Framework内核解析面试题汇总(一)
网络安全-XG
博客等级 码龄5年 1万+粉丝 2752原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值