android高级开发自定义View-canvas的save和restore方法的使用-大厂高频面试题

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

背景:

hi,粉丝朋友们:
大家好!上星期举办的framework模拟面试活动,许多粉丝也在积极探讨面试过程中的一些问题。比如今天要讲解的问题:
一般很多做应用同学简历都会写一个"熟练自定义view",这个技能基本上android高级应用开发都很多同学会写。面试官针对这个技能的面试比较容易考察的问题就是:
你是否知道canvas里面有一个save和restore方法,针对这个canvas的save和restore方法你可以说说对他的理解吗?

哈哈哈有没有很熟悉这个面试问题,先说一下为啥要考查这个问题呢?
其实很多高级ui,其实大部分时候都需要比较复杂的绘制,大部分时候都需要灵活掌握绘制相关方法,canvas属于最为频繁的一种,而且复杂ui经常需要涉及到旋转,平移,等操作,这时候就需要save和restore的出场。

Canvas的save和restore介绍

/**
 * Saves the current matrix and clip onto a private stack.
 * <p>
 * Subsequent calls to translate,scale,rotate,skew,concat or clipRect,
 * clipPath will all operate as usual, but when the balancing call to
 * restore() is made, those calls will be forgotten, and the settings that
 * existed before the save() will be reinstated.
 *
 * @return The value to pass to restoreToCount() to balance this save()
 */
public int save() {
    return nSave(mNativeCanvasWrapper, MATRIX_SAVE_FLAG | CLIP_SAVE_FLAG);
}

可以看到这里注释已经比较清楚,保存当前canvas的矩阵matrix和裁剪clip数据到一个stack中

再来看看restore方法:

/**
     * This call balances a previous call to save(), and is used to remove all
     * modifications to the matrix/clip state since the last save call. It is
     * an error to call restore() more times than save() was called.
     */
    public void restore() {
        if (!nRestore(mNativeCanvasWrapper)
                && (!sCompatibilityRestore || !isHardwareAccelerated())) {
            throw new IllegalStateException("Underflow in restore - more restores than saves");
        }
    }

这里的restore和save一般是对应的,前面save是保存canvas的matrix,clip到stack,这里restore就是从stack把顶部的matrix和clip取出应用。
如下图所示:
在这里插入图片描述
这里的save1,save2,save3其实本质可以认为是某一个时刻的matrix和clip的数据。restore时候就是获取这个save数据,然后应用到canvas上,当然肯定应用前canvas会被reset。

总结大白话理解:
canvas经常可能因为绘制需求,需要对canvas进行旋转平移等绘制,但是旋转平移后整个坐标系就变化了,下一部分还要绘制时候,可能想基于原始坐标来,但是已经被平移了旋转了,怎么回到原来呢?
难道还要挨个旋转回去和平移回去么?当然不是哈,这样做的话大家都感觉太傻了,所以就有了今天讲解的save和restore出现。在canvas平移旋转前save,然后想回到原来既可以调restore

代码具体应用理解:

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        //第一个基于原点坐标绘制的离左边距离10
        paint.setColor(Color.RED);
        canvas.drawRect(10,10,70,30,paint);
        
        //canvas已经平移了100
        canvas.translate(100,100);
        paint.setColor(Color.YELLOW);
        
        //这时候绘制的坐标是0,但是因为平移了,所以间隔原点其实是100
        canvas.drawRect(0,10,60,30,paint);

        paint.setColor(Color.BLACK);
        
        //这时候绘制的坐标是200,但是因为平移了,所以间隔原点其实是200+100
        canvas.drawRect(200,10,320,30,paint);


    }

在这里插入图片描述

但是第三个黑块如果不想跟随第二个黄绘制时候的平移影响怎么办??代码如下:

    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        Paint paint = new Paint();
        //第一个基于原点坐标绘制的离左边距离10
        paint.setColor(Color.RED);
        canvas.drawRect(10,10,70,30,paint);
        //平移前对canvas进行save
        canvas.save();
        
        //canvas已经平移了100
        canvas.translate(100,100);
        paint.setColor(Color.YELLOW);
        
        //这时候绘制的坐标是0,但是因为平移了,所以间隔原点其实是100
        canvas.drawRect(0,10,60,30,paint);
 				//第二个绘制完成后进行restore
        canvas.restore();
       
        paint.setColor(Color.BLACK);
        
        //这时候绘制的坐标是200,那么就是200
        canvas.drawRect(200,10,320,30,paint);


    }

执行结果如下:
在这里插入图片描述

黑色重新回到原始坐标系,没有受到第二个平移的影响。

更多精彩内容手把手视频或关注下面公众号“千里马学框架”:
https://www.bilibili.com/video/BV1TK4y1c7Ku/

安卓面试题之---自定义View ##一,自定义View的分类 -1.继承View或者ViewGroup类,重写onDraw方法,调用invalidate方法重新绘制View(譬如说计数器) - -2.自定义组合控件,即将几种控件组合起来形成一个新的控件,这个新的组合控件就会整合了原来每一个控件的功能(譬如说新浪微博中ListView第一行上面的状态栏),(继承组合控件布局的跟布局) - -3.自定义扩展控件,也就... 阅读详情

相关推荐

Android 自定义 View 最少必要知识,最新精心整理Android面试题

自定义属性的声明与获取//1.1 在 xml 中自定义 View 属性CircleView//1.2 在 View 构造函数中获取自定义 View 属性重写测量阶段相关方法(onMeasure())@Override//2.1 根据 View 特点或业务需求计算出 View 的尺寸//2.2 通过 resolveSize() 方法修正结果。

2401_84152126的博客 1116

2021年Android面试题---View

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

xingfuyisheng的专栏 907

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

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

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

Android Canvas - save() & restore()

这有什么用呢? 当调用 save 保存了画布的状态之后,就可以对画布为所欲为了(调用 Canvas 的平移、放缩、旋转、错切、裁剪等操作),反正可以调用 restore 恢复状态不是吗? save 和 restore 一般配套使用。......

teletian的专栏 1515

自定义View相关面试题

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

龚礼鹏的博客 4889

【数学基础】基于欧拉角表达的旋转顺序

欧拉角旋转顺序

FalschxMico 1384

2023小满春招Android笔试复盘:系统机制与代码能力全解析

在Android开发岗位的春招笔试中,系统机制理解与工程编码能力往往决定着候选人的竞争力。Binder作为跨进程通信的核心,其mmap内存映射机制保障了一次拷贝的高效传输;Handler的消息循环与同步屏障则直接关系到UI渲染的流畅度。自定义View的测量、布局、绘制流程,展现了Android框架对开发者基本功的深度要求。同时,LRU缓存、Kotlin协程、性能优化等高频考点,也反映出大厂对实际排障经验与架构设计思维的重视。本文基于2023年度小满春招Android研发岗第二批笔试的真实现场回忆,逐题拆解选

weixin_30455023的博客 365

使用mmdetection快速复现计算机视觉顶会论文

使用mmdetection中支持的算法运行自定义数据集

m0_56896669的博客 2422

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

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

AntDream的程序世界 701

SpringBoot项目整合达梦数据库(MYSQL 转换 达梦数据库)

注意:当迁移过程中出现下面问题时,如有触发器或者外键,需要先关掉触发器和外键,然后进行迁移,不然会导致迁移失败。(2)dm.ini修改【#compatibility】的【COMPATIBLE_MODE】=4。3、添加用户:如果导入的DM数据库需要和MYSQL的用户一样,添加ROOT用户。方法一:服务器配置:设置系统兼容性(DM控制台工具),兼容MySQL。服务器配置又该有两种方式:①DM控制台工具修改;MYSQL的数据表转换成DM的数据表时,点击转换按钮。在这里操作:MYSQL数据库迁移至DM数据库。

m0_74824635的博客 2013

Frida实战:如何逆向分析某电商App的doCommandNative函数(附完整Hook脚本)

本文详细介绍了如何使用Frida逆向分析电商App中的doCommandNative函数,涵盖动态注册识别、SO加固对抗及高级Hook脚本编写等实战技巧。通过完整Hook脚本示例,帮助安全研究人员深入理解JNICLibrary的关键函数逆向分析方法,提升移动应用安全研究能力。

weixin_29327977的博客 615

Android自定义View面试总结

自定义view,是在Android中非常重要的知识点,也是面试官喜欢考察的面试题。 很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试关于自定义view都会问哪些问题,再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨淡收场。 那么面试官关于自定义View通常都喜欢问那些问题呢?下述是我整理的Android View知识点以及常见面试题汇总: 自定义View基础 View的分类 View类简介 AttributeSet与自定义属性 V.

Android23333的博客 3626

7、初级视觉皮层(V1)的研究综述

本文综述了初级视觉皮层(V1)的基本功能特性、计算理解、细胞相互作用及理论模型。V1不仅执行方向和空间频率的选择性滤波,还通过相位选择性和上下文调制参与高级视觉处理。研究从信息编码角度解释了V1感受野的形成,并介绍了基于自然图像统计的建模方法。横向与反馈连接揭示了V1在全局视觉整合中的作用,尤其是上下文对细胞响应的快速调节。李的动态模型提出V1可生成视觉显著性图,支持前注意分割和注意力引导。未来研究聚焦于V1在注意力、意识和硬件实现中的潜在应用,推动视觉神经科学与人工智能的交叉发展。

7z8x2c4v6b9的博客 146

2024跳槽大厂,最常问的9个自定义View面试题!【建议收藏】

希望大家能有一个好心态,想进什么样的公司要想清楚,并不一定是大公司,我选的也不是特大厂。当然如果你不知道选或是没有规划,那就选大公司!希望我们能先选好想去的公司再投或内推,而不是有一个公司要我我就去!还有就是不要害怕,也不要有压力,平常心对待就行,但准备要充足。最后希望大家都能拿到一份满意的 offer!如果目前有一份工作也请好好珍惜好好努力,找工作其实挺累挺辛苦的。这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。

2401_84103100的博客 841

军品研制过程-转阶段

介绍军品转阶段评审

Abel的博客 2万+

立体仓库WCS控制系统-AGV通信代码

string str = "任务下发,WCS->NT8000(q-Message),ikey:" + p.ikey.ToString() + "fromStation:" + p.fromStation.ToString() + "toStation:" + p.toStation.ToString();if (nt8000.Connect(_ServerAddr, _ServerPort)) QueueSpeech.AddQueue(string.Format("与NT8000重连成功"));

xdpcxq的专栏 2203

android自定义View——仿九宫格解锁,android高级开发面试题以及答案

float d = (float) twoPointDistace(lastPoint.x, lastPoint.y, curPoint.x, curPoint.y); float cos_a = (curPoint.x - lastPoint.x) * 1.0f / d; float sin_a = (curPoint.y - lastPoint.y) * 1.0f / d; canvas.drawLine(lastPoint.x + inCircleR * cos_a, lastPoint.y + in

m0_64319298的博客 228

五、MT8168 音频驱动之SPEAKER

本章主要讲解MT8168平台的内部SPEAKER驱动配置。分为HP接法和LINE OUT接法。2.1.3 audio_custom_exp.h设置。2.1.4 mixer_paths.xml设置。2.2.3 mixer_paths.xml设置。2.1.2 ProjectConfig 设置。2.2.2 ProjectConfig 设置。2.2.1 deconfig设置。2.1.1 DTS设置。......

Joon2020的博客 1664

Android画布的保存,Android canvas用法介绍之save()和restore()

一. 首先讲一下canvas的save 和 restore功能. 这是canvas很有魅力的一个部分.onDraw方法会传入一个Canvas对象,它是你用来绘制控件视觉界面的画布。在onDraw方法里,我们经常会看到调用save和restore方法,它们到底是干什么用的呢?❑ save:用来保存Canvas的状态。save之后,可以调用Canvas的平移、放缩、旋转、错切、裁剪等操作。❑ rest...

weixin_39633455的博客 1663

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Canvas与图层(三)恢复画布

恢复画布有两个函数:restore()与rest无论哪种* 恢复画布有两个函数:restore()与restongoCount() restore()就是把回退栈中的最上层画布状态出栈,恢复画布状态,具体使用 restoreToCount(int count) public int save(); public int save(int saveFlags) public int saveLa...

DLUT_WJX的博客 771

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android面试题自定义View之Window、ViewRootImpl和View的三大流程

(1)在通过继承View的方式自定义View时,需要特别处理wrap_content的情况,因为View中默认相当于没处理(和match_parent效果一样)(2)在Activity中获取View的宽高需要用特殊的方式:onWindowFocusChanged、view.post(runnable)、ViewTreeObserver的OnGlobalLayoutListener(3)我们的View的显示离不来Window,无论是Activity、Dialog还是Toast,都对应着一个Window。

AntDream的程序世界 1499

Android如何正确使用 Canvas 的 save() 和 restore() 方法

在Android的绘图API中,Canvas类提供了一系列强大的功能来绘制自定义视图。为了更高效地管理绘图状态和变换,Canvas类提供了save()和restore()方法。正确使用这些方法是高效绘图和避免常见错误的关键。

loveseal518的博客 1615

史上最全的Android View面试知识点集锦

前言 很多人面试之前,可能没有在互联网公司工作过或者说工作过但年头较短,不知道互联网公司技术面试都会问哪些问题? 再加上可能自己准备也不充分,去面试没几个回合就被面试官几个问题打蒙了,最后以惨败收场。 下述是我整理的Android面试题汇总,由于篇幅原因,在这只把View部分的题目列举出来,后续还会更新其余面试题内容,大家可以关注一下我,及时知晓我更新的知识点,同时这份面试集锦的整理也花费了我很多...

weixin_45258969的博客 507

canvas状态的保存(save)和恢复(restore)

canvas的状态如何保存和恢复 save():保存当前的绘图状态。 restore():恢复之前保存的绘图状态。 调用save方法将当前绘图状态保存到绘图堆栈中,每次调用restore方法从栈顶取出保存的状态。 由于出栈的次数不能多于入栈的次数,故程序中restore方法调用的次数不应该比save方法多。 save都可以保存什么? 当前的坐标变换信息(比如旋转rotate()或平移setTransform()) 当前剪贴区域 图形上下文对象(CanvasRenderingContext2D)的当前属

qq_33721778的博客 1万+

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

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

Misdirection_XG的博客 178
上一篇: 写给2023年andriod程序员的一封信
下一篇: systrace/perfetto抓取方式分享
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值