SurfaceView onMeasure () no estableció la dimensión medida llamando setMeasuredDimension ()
Tengo un SurfaceView. Acabo de dibujar en él manualmente de otro hilo.
Funciona muy bien. Pero después de 10-20 minutos de funcionamiento en promedio consigo esta excepción:
- Ajuste de una vista previa de la cámara a un SurfaceView más grande que la pantalla
- SurfaceView se retrasa si está en ScrollView
- Android VideoView.setAlpha no funciona (Xoom con 3.0)
- End SurfaceView y GameThread al salir de la aplicación
- Dibujar SurfaceView desde el diseño xml
01-14 08:51:25.000 3740-3740/com.myPackage E/AndroidRuntime﹕ FATAL EXCEPTION: main java.lang.IllegalStateException: onMeasure() did not set the measured dimension by calling setMeasuredDimension() at android.view.View.measure(View.java:15200) at android.widget.RelativeLayout.measureChild(RelativeLayout.java:602) at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:415) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1390) at android.widget.LinearLayout.measureVertical(LinearLayout.java:681) at android.widget.LinearLayout.onMeasure(LinearLayout.java:574) at android.view.View.measure(View.java:15195) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4823) at android.widget.FrameLayout.onMeasure(FrameLayout.java:310) at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2340) at android.view.View.measure(View.java:15195) at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1850) at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1102) at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1275) at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000) at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4216) at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725) at android.view.Choreographer.doCallbacks(Choreographer.java:555) at android.view.Choreographer.doFrame(Choreographer.java:525) at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:711) at android.os.Handler.handleCallback(Handler.java:615) at android.os.Handler.dispatchMessage(Handler.java:92) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:4813) at java.lang.reflect.Method.invokeNative(Native Method) at java.lang.reflect.Method.invoke(Method.java:511) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:792) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:559) at dalvik.system.NativeStart.main(Native Method)
Android Documention dice:
Mida la vista y su contenido para determinar el ancho medido y la altura medida. Este método es invocado por measure (int, int) y debe ser anulado por subclases para proporcionar una medición precisa y eficiente de su contenido.
Como creo que la implementación original de google es la siguiente:
@Override protected void More ...onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = getDefaultSize(mRequestedWidth, widthMeasureSpec); int height = getDefaultSize(mRequestedHeight, heightMeasureSpec); setMeasuredDimension(width, height); }
No sé qué otra cosa debo implementar aquí.
Creo que el tamaño de la vista de la superficie nunca cambia.
NOTA:
Mi SurfaceView está contenido en un RelativeLayout.
La excepción es llamada por un niño, pero es una vista (línea 3 en la excepción)
Por favor, ayúdame si sabes cómo podría resolver este insecto molesto.
EDITAR:
En la actividad onCreate establecí el tamaño de mi vista (que extendió SurfaceView) del código
Answear para comentar:
Así es como establezco algunos campos públicos para el tamaño requerido:
Parameters.initialize(getResources().getDisplayMetrics().widthPixels, getResources().getDisplayMetrics().heightPixels);
Los parámetros.inicializar:
public static void initialize(int screenWidth, int screenHeight){ FIELD_WIDTH = screenWidth; FIELD_HEIGHT = (int)(0.92f * screenHeight); }
MyView está escrito en el xml.
Entonces pongo algo en ella:
public class MyViewManager { protected MyView mMyView; public FieldPainterComp(MainActivity activity) { super(activity); initialize(); } private void initialize(){ mMyView= (MyView) activity.findViewById(R.id.vMyView); mMyView.getLayoutParams().height = Parameters.FIELD_HEIGHT; mMyView.getLayoutParams().width = Parameters.FIELD_WIDTH; } }
Todo este proceso sucede uno en el principio.
android:screenOrientation="landscape"
La pantalla nunca se oscurece. El juego se está ejecutando, y simplemente la excepción está llegando.
¿Debo llamar medida en alguna parte?
No entiendo por qué sucede después de mucho tiempo
Alguna otra excepción que debe estar conectada con esto:
01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnecting due to inactivity 01-19 11:53:39.812 29666-31881/com.mypackage V/GAV4﹕ Thread[disconnect check,5,main]: Disconnected from service 01-19 11:57:17.732 29666-29666/com.mypackage D/AndroidRuntime﹕ Shutting down VM 01-19 11:57:17.732 29666-29666/com.mypackage W/dalvikvm﹕ threadid=1: thread exiting with uncaught exception (group=0x420face0) 01-19 11:57:17.812 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Tracking Exception: IllegalStateException (@View:measure:16533) {main} 01-19 11:57:17.832 29666-29666/com.mypackage V/GAV4﹕ Thread[main,5,main]: Dispatch call queued. Dispatch will run once initialization is complete. 01-19 12:19:27.982 29666-29670/com.mypackage I/dalvikvm﹕ threadid=3: reacting to signal 3 01-19 12:19:28.262 29666-29670/com.mypackage I/dalvikvm﹕ Wrote stack traces to '/data/anr/traces.txt' 01-19 12:19:32.452 29666-29666/com.mypackage A/libc﹕ Fatal signal 6 (SIGABRT) at 0x0000025a (code=0), thread 29666 (ames.adaptation)
El GAV es el material de Google Analytics.
Lanzé otra pregunta sobre la ANR: ANR con 3 hilos – usando cerraduras
- Ocultar una vista de superficie que se superpone a otra
- Reinicio / Pausa del hilo en onResume / onPause
- Cómo hacer que una clase que extiende SurfaceView iniciar una actividad?
- Cómo crear y guardar una captura de pantalla desde una vista de superficie?
- Android SurfaceView no muestra onDraw
- Cómo tomar una captura de pantalla de SurfaceView con una vista previa de la cámara
- Cámara androide2 procesa cada fotograma y muestra su vista previa
- ¿Cómo mostrar la vista previa de la cámara en un SurfaceView?
setMeasuredDimension()
Debe ser llamado dentro de su método onMeasure (). Tuve un problema similar donde la lógica no estaba alcanzando setMeasuredDimension (). Resolví forzar la llamada de setMeasuredDimension () no importa lo que las declaraciones if / else lo precedieron.
Utiliza Fragmento y no escribe esta línea en la primera
super.onCreate(savedInstanceState);
- Cómo encuestar los motores TTS disponibles para los idiomas disponibles sin instanciar cada uno y wating para init
- Android Studio no pudo encontrar "libiconv.so"