8

Ho un gruppo di viste personalizzato. In quel gruppo di viste personalizzate ci sono un certo numero di viste personalizzate. Le viste personalizzate si sovrappongono l'un l'altra nel layout.L'invalidazione di una vista personalizzata causa l'annullamento di tutte le viste personalizzate in un gruppo di viste?

Le viste sovrapposte intendono creare "livelli". Quindi un livello può creare del contenuto statico, ma un'altra vista a più livelli crea diversi contenuti animati. Il problema arriva quando chiamo .postInvalidate da un altro thread su una vista che fondamentalmente è un'animazione che viene eseguita a 60FPS. Al di fuori delle viste sovrapposte, 60FPS è realizzabile per il dispositivo che sto utilizzando (Galaxy S3).

All'interno di questo gruppo di viste personalizzate, .invalidate fa sì che 1 delle 2 viste di rendering dell'hardware non siano valide e alcune delle viste del software lo invalidano.

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]  
+1

Avete qualche codice che può essere utilizzato per ricreare questo? –

risposta

1

L'invalida su una vista incanterà le chiamate invalide ai suoi genitori nella gerarchia di viste. Se questo è accelerato hardware, può semplicemente invalidare tutto a seconda di un flag nella classe HardwareRenderer. Questa è un'ottimizzazione. È possibile verificare l'implementazione invalida. Ecco un collegamento alla chiamata in questione - Invalidate() -check for hardware acceleration

Per essere sicuro, è possibile controllare il valore di HardwareRenderer.RENDER_DIRTY_REGIONS sul dispositivo in quella applicazione.

Problemi correlati