我的编程空间,编程开发者的网络收藏夹
学习永远不晚

探讨Android 的屏幕滚动操作不如 iPhone 流畅顺滑的原因

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

探讨Android 的屏幕滚动操作不如 iPhone 流畅顺滑的原因

其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解决其他一些兼容性问题已经耗费很多精力了,很少有开发者会花很多精力去做细致的性能优化,有的甚至连优化的方向都不知道。现在的官方微博客户端要我看在Overdraw方面还是很严重,然后在异步加载图片的时候帧率也不够稳定,算不上流畅。再则由于Android平台本身机能没有强大到优化烂的应用也能跑的非常流畅暴露了优化不够的事实,特别是手机厂商的定制ROM相比原生系统都一定程度牺牲了一些流畅性导致这个问题显露的更加明显,所以在Android上面作出流畅的应用要付出比iOS更多的精力。

其实Google这些年一直在系统层面作出努力提升系统的UI性能,从硬件加速到Project Butter到Reorder&Merge绘图操作等等,但是我感觉Google对于Android开发最佳实战宣传不够,国内有多少开发者上Youtube看过I/O大会上面的Android Session?几乎每年都有讲关于系统图形性能方面的Session。所以这里面也有国内开发者开发水平和眼界的问题。

综上所述:一是受限于Android平台本身性能不够强大做出相同流畅度的应用比iOS更加困难,二是国内开发者对于Android开发性能优化方面的最佳实践知之甚少。

update:

某些答案中说屏幕触摸反应速度是影响流畅度最大问题的回答并不靠谱。我本身是做Android应用程序开发的,我举一个例子就能质疑这个结论:为什么原生系统(比如运行Android4.4的Nexus5)上面自带的App能运行得丝般顺滑而第3方开发的应用(特别是国内应用)就普遍比较卡?他们的运行环境是一样的吧?屏幕也是一样的吧?为什么流畅度就硬是差一些呢?原因就是SystemApp是Google开发的,他们的开发人员了解如何做出性能优秀的应用,了解Andorid开发的最佳实践。而第3方的开发者水平参差不齐,优化经验不如Google开发人员,导致写出的应用运行效率也不如SystemApp,站在同一个系统和运行环境里面讲,这就是最主要的原因。

上面的一些测试,能反映的最多也只是当手指触摸到屏幕的那个瞬态反应的延迟,并不能完全说明Android不如iOS流畅的原因。我觉得流畅性主要表现再2个方面:一个是触摸反应延迟,一个是渲染的帧率,而且后一个的重要性更大。可以想象一下从手指开始触摸屏幕到UI开始滑动的那100ms的延迟给你造成的不流畅感觉大,还是在滑动过程中不稳定帧率造成的卡顿感觉大?其实Google这些年的Android版本更新也一直致力于改善屏幕触摸延迟(找了个4.4的更新介绍有兴趣的可以看看: Android - 4.4 KitKat ),虽然可能还是比不上iOS,但是我觉得在这方面的差距已经很微小,带来的感受上的差异也是很微妙不容察觉。

更多的不流畅性还是体现在优化烂的应用运行不稳定的帧率上面,比如在某个瞬态后台线程异步加载图片完成后在UI进程执行某个callback方法要显示,如果图片太大就需要根据ScaleType实时缩放到适合的尺寸显示到ImageView上面,这个时候如果图片太大缩放操作时间太长就有可能造成主线程阻塞较长时间,影响了系统UI进程在单位时间片内的渲染,导致掉帧。我再举一个例子也能反驳屏幕触摸反应速度是影响流畅度最大问题的观点:为什么在滑动显示单行文字的列表项一般不会觉得卡,而显示比较复杂布局的列表项(如微博)会比较卡?他们的屏幕和运行环境是一样的吧?触摸延迟都存在吧?为什么呢?这是由于列表项的布局过于复杂,UI控件在整个绘制的过程中(onMeasure()测量大小->onLayout()分配位置->onDraw()绘制)会花费更多的时间,比如各UI控件之间的相对位置和大小可能是互相影响的,这就导致在渲染每一帧的时候需要更多的时间来计算大小和确定位置,然后绘制阶段也需要多执行一些绘图操作来画完所有的UI控件。面对复杂的界面,有经验的开发者会尽量去避免界面的Overdraw(过渡绘制),减少UI层级,选用性能更好的ViewGroup(比如FrameLayout性能比LinearLayout好,LinearLayout性能比RelativeLayout性能好,但是布局能力最强大适应性最好的是RelativeLayout,在功能实现和性能优化中平衡达到最优需要经验),避免图片实时缩放,避免在调用频繁的关键的路径创建对象减少gc频率,合理的管理Bitmap大对象(LruCache)等等(当然还有其他一些优化技巧不在此一一列举了)。还有讲什么进程优先级问题的答案说的也不是最主要的原因,Android的UI渲染进程的优先级可能不是最高但也是比较高的,不会说他UI渲染优先级设置到比后台线程还低的情况,这点不用过度讨论,Google也没蠢到那种地步,不服自己去看Android SDK源代码。

我不否认屏幕触摸延迟也是造成Android滑动感觉不流畅的原因之一,但是站在一个开发者看到的角度来讲,我觉得在现有Android最新版本的系统优化下,他的影响远没有应用优化烂带来的影响大,优化好的Android应用跑在最新的Android版本上基本可以运行的跟iOS应用一样流畅。

您可能感兴趣的文章:Android 模仿iPhone列表数据View刷新动画详解Android ListView实现仿iPhone实现左滑删除按钮的简单实例Android编程实现仿iphone抖动效果的方法(附源码)js判断手机端(Android手机还是iPhone手机)android Gallery组件实现的iPhone图片滑动效果实例基于jQuery的判断iPad、iPhone、Android是横屏还是竖屏的代码Android之IphoneTreeView带组指示器的ExpandableListView效果javascript判断iphone/android手机横竖屏模式的函数Android中的jQuery:AQuery简介jquery判断iPhone、Android设备类型


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

探讨Android 的屏幕滚动操作不如 iPhone 流畅顺滑的原因

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

探讨Android 的屏幕滚动操作不如 iPhone 流畅顺滑的原因

其实我觉得最主要还是开发者对于应用的优化不够,太多的Overdraw和Layout方面的问题,Android开发者本身为了适配屏幕分辨率和解决其他一些兼容性问题已经耗费很多精力了,很少有开发者会花很多精力去做细致的性能优化,有的甚至连优化的
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录