草庐IT

Android View 动画和硬件层

coder 2023-11-18 原文

我目前正在研究如何正确使用 hardware layers动画 View 时。

我正在实现一个允许用户拖动 subview 的 ViewGroup,然后我将其动画化到他们释放时的某个位置(就像 ViewPager 将如何停留在页面上)。 This文章指出您应该只在动画期间启用硬件层。

我遇到的问题是,在启用硬件层后,Android 必须创建层,这在 Galaxy Nexus 上需要 70-100 毫秒。这意味着我不能在开始动画之前立即执行此操作,因为拖动和动画之间的延迟会非常明显。出于同样的原因,我在开始拖动时也无法启用它。

现在,这种延迟仅在第一次创建硬件层时出现,因此理想情况下,我希望在将 View 添加到布局后立即创建它们。我被指向了 View.buildLayer() ,但我不确定如何处理这个问题。

  • 实现这一目标的正确方法是什么?
  • 我的 ViewGroup 中是否有任何方法可以覆盖并在 subview 上调用 buildLayer()?
  • 硬件层能否以某种方式失效,从而导致另一个 70-100 毫秒的延迟?我该如何处理?

最佳答案

当缓存中没有层时会发生延迟,您不应该在后续调用 setLayerType(NONE)/setLayerType(HARDWARE) 时看到此延迟。您可以从 onSizeChanged() 调用 buildLayer() 以强制构建层,然后放入缓存(调用 setLayerType(NONE) 将层移动到缓存。)

请注意,您看到的延迟在很大程度上取决于您运行的设备。

您不应该启用图层的原因是每次 View 更新时绘图工作量都会加倍。例如,如果将 ListView 移动到图层中,然后滚动列表,则滚动动画期间的每一帧更新都会导致:(a) 列表重新绘制到图层中 (b) 在屏幕上绘制图层。这是非常浪费的,并且可能会导致性能问题,具体取决于您的 UI 的复杂性。

关于Android View 动画和硬件层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12272094/

有关Android View 动画和硬件层的更多相关文章

  1. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  2. LVGL V8动画 - 2

    动画/*INITIALIZEANANIMATION 初始化一个动画*-----------------------*/lv_anim_ta;lv_anim_init(&a);/*MANDATORYSETTINGS 必选设置*------------------*//*Setthe"animator"function 设置“动画”功能*/lv_anim_set_exec_cb(&a,(lv_anim_exec_xcb_t)lv_obj_set_x);/*Setthe"animator"function*/lv_anim_set_var(&a,obj);/*Lengthoftheanim

  3. ruby - Carrierwave + MiniMagick - 如何将动画 GIF 压缩到第一帧? - 2

    有人知道如何使用Carrierwave+MiniMagick将动画GIF压缩到第一帧吗? 最佳答案 我认为MiniMagick有一些变化,因为我只花了三个小时试图找出为什么Andrey的代码对我不起作用。我收到以下错误:ActiveRecord::RecordInvalid(Validationfailed:ImageFailedtomanipulatewithMiniMagick,maybeitisnotanimage?OriginalError:Command("mogrify-scene/var/folders/0o/0oqN

  4. ruby - 硬件不可能? : "Create a rock paper scissors program in ruby WITHOUT using conditionals" - 2

    我正在上介绍性软件开发课,我的作业是创建一个带有两个参数的剪刀石头布程序(石头,纸)等,并返回获胜的arg。现在,如果我可以使用条件语句,我会快速解决这个问题,但作业说我们需要知道的一切都在前三个ruby教科书的章节,这些章节不包括条件!没有它们是否可以创建这个程序?或者他只是希望我们足智多谋并使用条件句?这是一个非常简单的条件分配......我在想我可能在这里遗漏了一些东西。编辑:我正在考虑那个chmod数字系统,并认为通过该加法系统可能有解决方案...... 最佳答案 这是一个只使用哈希的方法:RULES={:rock=>{:r

  5. ruby-on-rails - 如何在 Ajax 请求处理期间显示动画图标 - Rails 3 - 2

    我正在尝试为每个ajax请求显示一个加载指示器,我在Rails3应用程序中工作。HTML:"loading-indicator",:style=>"display:none")%>CSS:#loading-indicator{position:absolute;left:10px;top:10px;}loading.js:我放在assest/javascripts/$(document).ready(function(){$(document).ajaxSend(function(event,request,settings){$('#loading-indicator').show(

  6. Baumer工业相机VCX系列相机硬件触发流程和设置 - 2

    项目场景Baumer工业相机堡盟相机是一种高性能、高质量的工业相机,可用于各种应用场景,如物体检测、计数和识别、运动分析和图像处理。 Baumer的万兆网相机拥有出色的图像处理性能,可以实时传输高分辨率图像。此外,该相机还具有快速数据传输、低功耗、易于集成以及高度可扩展性等特点。 Baumer堡盟VCX相机为堡盟全系列相机中的主流常用相机,性能强大、坚固可靠,易于集成,常用与一般行业的检测定位识别使用。问题描述工业相机的触发有多种方式:1.硬件触发:使用外部硬件设备来触发相机,如传感器或开关。2.软件触发:使用软件来触发相机,可以是手动的也可以是自动的。3.同步触发:使相机的触发与其他设备或系

  7. javascript - 在 Fabric js 中的两个对象之间添加动画 - 2

    我有一个非常基本的应用程序,可让您创建形状并用一条线将它们连接起来。为此,您需要执行以下操作。Example1.Clicknewanimation2.addrectangle3.addchild4.addcircle您可以移动形状、拖动和调整大小。我想知道是否可以在两个对象之间添加动画。因此,例如,一个小圆球会在两个物体之间的线上移动。我已经查看了fabricjs动画页面上的演示,但不确定是否可以从对象b执行。这是FIDDLE. 最佳答案 我不知道你是否可以在fabric中使用内置的动画功能,因为正如你所说,这些对象可能会自己移动。

  8. javascript - 有没有可行的方法使用JS触发CSS关键帧动画? - 2

    当然,我们可以使用关键帧创建CSS动画,并从那里控制它。但是,理想情况下,我想通过单击按钮来触发此动画-因此单击按钮将是一个事件...@keyframesfade-in{0%{opacity:0;}100%{opacity:1;}}现在,点击时,我想触发这个动画;而不是在CSS动画属性中。 最佳答案 看这里jsfiddle如果您希望每次按下按钮时动画都起作用,请使用此代码:$('button').click(function(){$(".fademe").addClass('animated');setTimeout(functio

  9. javascript - 如何动画绘制一系列线段 - 2

    我想画一个点,大约1秒后我想画下一个点。这是否可能:我已经试过了:functionsimulate(i){setTimeout(function(){drawPoint(vis,i,i);},1000);}for(vari=1;i不幸的是,这是行不通的。它只是立即绘制整条线。 最佳答案 这是行不通的,因为for循环将立即运行到结束,setTimeouts将被同时调度,所有函数将同时触发。取而代之的是,这样做:vari=1;(functionloop(){if(i++>200)return;setTimeout(function(){

  10. javascript - 在 React Native 中动态添加组件时如何启用流畅的动画? - 2

    在我的ReactNative应用程序中,我有一张带有条件的卡片按下按钮时呈现并在触发相同按钮时删除的组件。这是我的代码的样子:this.setState({triggered:!this.state.triggered})}title="ClicktoExpand"/>Loremipsumdolorsitamet,consecteturadipiscingelit,seddoeiusmodtemporincididuntutlaboreetdoloremagnaaliqua.Utenimadminimveniam,quisnostrudexercitationullamcolabori

随机推荐