Ondraw para una vista personalizada está en bucle infinitamente android

¡La función de OnDraw para mi opinión de encargo se está llamando infinito y está haciendo un lazo !! ¿Cuál podría ser la razón posible?

Esta es mi vista personalizada: –

public class Balls extends View{ private static final String TAG = "BallsView"; private int mMode = READY; public static final int PAUSE = 0; public static final int READY = 1; public static final int RUNNING = 2; public static final int LOSE = 3; private final Paint mPaint = new Paint(); private double mUx = 0.1; private double mUy = 2; private double mVy; private double mVx; private double mSx; private double mSy; private double mRange; private float mX1; private float mY1; private int mX2; private int mY2; private int mDx; private int mDy; Time t; float mAngle; private final double mGravity = -9.8; private long mLastTime; private double mT; private Canvas mCanvas = null; public Balls(Context context, AttributeSet attrs, int defStyle){ super(context, attrs, defStyle); setFocusable(true); setWillNotDraw(false); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(10); mPaint.setAntiAlias(true); mPaint.setStrokeCap(Cap.ROUND); //mPaint.setColor(0xff00ffff); mPaint.setARGB(255, 0, 255, 0); mLastTime = System.currentTimeMillis(); } public Balls(Context context, AttributeSet attrs) { super(context, attrs); setFocusable(true); setWillNotDraw(false); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setStrokeWidth(10); mPaint.setAntiAlias(true); mPaint.setStrokeCap(Cap.ROUND); mPaint.setColor(0xff00ffff); } @Override public void onDraw(Canvas canvas) { Log.w(this.getClass().getName(),"onDraw of Balls called"); super.onDraw(canvas); mCanvas = canvas; if(mCanvas!= null) Log.w(this.getClass().getName(),"Canvas is not null"); } 

Esta opinión se infla como sigue en otra actividad: –

 mBalls = (Balls) findViewById(R.id.balls); 

Esta vista se coloca en el archivo xml dentro de una vista relativa y la vista relativa es el elemento secundario de la vista de desplazamiento horizontal.

Aquí no hay un bucle infinito. Lo que está pasando es el sistema operativo está redibujando su actividad lo más rápido posible. Cuando su actividad se vuelve a dibujar, vuelve a dibujar todas las vistas de sus hijos. Como su código tiene muy poca computación, de lo que puedo ver aquí, se está ejecutando muy rápido y es probable que volver a dibujar a una velocidad> 30 FPS. Su mensaje de registro hace que aparezca como si hay un bucle infinito cuando no lo hay. De hecho, ni siquiera hay un bucle dentro de su método onDraw .

Para ilustrar lo que está pasando pruebe esto. Agregue un miembro protegido drawCount a su clase Balls y drawCount en 0:

 protect int drawCount = 0; 

A continuación, agregue drawCount al final de su mensaje de registro onDraw

  public void onDraw(Canvas canvas){ drawCount++; Log.w(this.getClass().getName(),"onDraw of Balls called. Total draws:" + Integer.toString(drawCount)); ... } 

Lo que debe ver es cada mensaje de registro mostrará un drawCount diferente.

Si desea obtener fantasía y calcular el framerate de su aplicación que podría medir el tiempo desde el primer sorteo y luego dividir el drawCount por cuánto tiempo ha pasado que le daría una estimación de su framerate actividades.

OnDraw () obtiene la llamada en invalidate. Invalidate () se llama cuando la vista o su padre sienten la necesidad de cambiar y tienen que cambiar su estado.

onDraw(Canvas) llamado demasiado a menudo como en un bucle infinito, no es normal. Normalmente se debe llamar 1 a 3 veces, si no hay siguiente invalidate o cambios de disposición. Razones para el bucle infinito quizás:
1, usted ha llamado invalidate o postInvalidate donde.
2, el diseño de los padres o hermanos está cambiando todo el tiempo.
3, View.LAYER_TYPE_SOFTWARE se utiliza, es. SetLayerType (View.LAYER_TYPE_SOFTWARE, null).
Es notable que LAYER_TYPE_SOFTWARE hará que onDraw() sea ​​llamado, como en un bucle.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.