【问题标题】:Invalidating 1 Custom View Causes All Custom Views In A View Group To Be Invalidated?使1个自定义视图失效会导致视图组中的所有自定义视图失效?
【发布时间】:2014-04-14 13:08:20
【问题描述】:

我有一个自定义视图组。在该自定义视图组中有许多自定义视图。自定义视图在布局中都相互重叠。

重叠视图旨在创建“层”。所以一个层可能会创建一些静态内容,但另一个分层视图会创建不同的动画内容。 当我在一个视图上从另一个线程调用 .postInvalidate 时出现问题,该视图基本上是以 60FPS 运行的动画。在分层视图之外,我使用的设备(Galaxy S3)可以达到 60FPS。

在此自定义视图组中,.invalidate 导致 2 个硬件渲染视图中的 1 个无效,并且一些软件视图也随之无效。

MyCustomViewThatShouldNotInvalidate(AbstractDialLayer).onDraw(Canvas) line: 68    
MyCustomViewThatShouldNotInvalidate.onDraw(Canvas) line: 79    
MyCustomViewThatShouldNotInvalidate(View).draw(Canvas) line: 13650    
MyCustomViewThatShouldNotInvalidate(View).draw(Canvas, ViewGroup, long) line: 13534    
MyCustomViewGroup(ViewGroup).drawChild(Canvas, View, long) line: 2938    
MyCustomViewGroup(ViewGroup).dispatchDraw(Canvas) line: 2808    
MyCustomViewGroup(View).buildDrawingCache(boolean) line: 12909    
MyCustomViewGroup(View).getDisplayList(DisplayList, boolean) line: 12580    
MyCustomViewGroup(View).getDisplayList() line: 12645
RelativeLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
RelativeLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
RelativeLayout(View).getDisplayList() line: 12645    
RelativeLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
RelativeLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
RelativeLayout(View).getDisplayList() line: 12645    
NoSaveStateFrameLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
NoSaveStateFrameLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
NoSaveStateFrameLayout(View).getDisplayList() line: 12645    
ViewPager(ViewGroup).dispatchGetDisplayList() line: 2920    
ViewPager(View).getDisplayList(DisplayList, boolean) line: 12537    
ViewPager(View).getDisplayList() line: 12645    
LinearLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
LinearLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
LinearLayout(View).getDisplayList() line: 12645    
RelativeLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
RelativeLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
RelativeLayout(View).getDisplayList() line: 12645    
NoSaveStateFrameLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
NoSaveStateFrameLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
NoSaveStateFrameLayout(View).getDisplayList() line: 12645    
LinearLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
LinearLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
LinearLayout(View).getDisplayList() line: 12645    
LongPressGestureDetectingFrameLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
LongPressGestureDetectingFrameLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
LongPressGestureDetectingFrameLayout(View).getDisplayList() line: 12645    
FrameLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
FrameLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
FrameLayout(View).getDisplayList() line: 12645    
LinearLayout(ViewGroup).dispatchGetDisplayList() line: 2920    
LinearLayout(View).getDisplayList(DisplayList, boolean) line: 12537    
LinearLayout(View).getDisplayList() line: 12645    
CustomViewAbove(ViewGroup).dispatchGetDisplayList() line: 2920    
CustomViewAbove(View).getDisplayList(DisplayList, boolean) line: 12537    
CustomViewAbove(View).getDisplayList() line: 12645    
SlidingMenu(ViewGroup).dispatchGetDisplayList() line: 2920    
SlidingMenu(View).getDisplayList(DisplayList, boolean) line: 12537    
SlidingMenu(View).getDisplayList() line: 12645    
PhoneWindow$DecorView(ViewGroup).dispatchGetDisplayList() line: 2920    
PhoneWindow$DecorView(View).getDisplayList(DisplayList, boolean) line: 12537    
PhoneWindow$DecorView(View).getDisplayList() line: 12645    
HardwareRenderer$Gl20Renderer(HardwareRenderer$GlRenderer).draw(View, View$AttachInfo,         HardwareRenderer$HardwareDrawCallbacks, Rect) line: 1170    
ViewRootImpl.draw(boolean) line: 2275    
ViewRootImpl.performDraw() line: 2147    
ViewRootImpl.performTraversals() line: 1958    
ViewRootImpl.doTraversal() line: 1112    
ViewRootImpl$TraversalRunnable.run() line: 4474    
Choreographer$CallbackRecord.run(long) line: 725    
Choreographer.doCallbacks(int, long) line: 555    
Choreographer.doFrame(long, int) line: 525    
Choreographer$FrameDisplayEventReceiver.run() line: 711    
Handler.handleCallback(Message) line: 615    
Choreographer$FrameHandler(Handler).dispatchMessage(Message) line: 92    
Looper.loop() line: 137    
ActivityThread.main(String[]) line: 4918    
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not         available [native method]    
Method.invoke(Object, Object...) line: 511    
ZygoteInit$MethodAndArgsCaller.run() line: 1004    
ZygoteInit.main(String[]) line: 771    
NativeStart.main(String[]) line: not available [native method]    

【问题讨论】:

  • 你有任何代码可以用来重新创建这个吗?

标签: android android-layout android-canvas android-custom-view


【解决方案1】:

视图上的 Invalidate 会将 invalidate 调用链接到视图层次结构中的父级。如果这是硬件加速的,它可能只是根据 HardwareRenderer 类中的标志使所有内容无效。这是一个优化。您可以检查无效实现。这是相关电话的链接 - Invalidate() -check for hardware acceleration

可以肯定的是,您可以在该应用程序中检查您设备上的 HardwareRenderer.RENDER_DIRTY_REGIONS 的值。

【讨论】:

    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多