versiones pie oreo developer descargar android

oreo - android pie



¿Por qué no se llama a onDraw después de invalidar()? (4)

He encontrado muchas publicaciones en stackoverflow pero todavía no puedo resolver mi problema. Aquí está mi pieza de código:

public class MyView extends RelativeLayout { Button b1; Button b2; Context sContext; public static int i = 0; private int w = 400; private int h = 400; private int w2 = 100; private int h2 = 100; public MyView(Context context) { super(context); sContext = context; init(); } public MyView(Context context, AttributeSet attrs) { super(context, attrs); sContext = context; init(); } private void init() { b1 = new Button(sContext); addView(b1); b1.setBackgroundColor(Color.YELLOW); b1.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { if (w >= 600) { MyView.this.setBackgroundColor(Color.GREEN); //b1.setBackgroundColor(Color.RED); } else { MyView.this.setX(100); } MyView.this.invalidate(); w += 100; w2 += 20; } }); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //b1.setBackgroundColor(Color.RED); Toast.makeText(sContext, ""+i, Toast.LENGTH_SHORT).show(); ++i; } }

¿Podría explicar por qué onDraw no se llama las primeras tres veces que presiono b1? Porque llamé invalidar cada vez que presiono b1. ¡Muchas gracias!


De manera predeterminada, todas las subclases de ViewGroup no llaman a su método onDraw , debe habilitarlo llamando al setWillNotDraw(false)


Necesita llamar a setWillNotDraw(false); para que su método onDraw sea llamado:

private void init() { setWillNotDraw(false); ... }


Préstamo del enlace @

Diseño personalizado de Android - onDraw () nunca se llama

Prueba a continuación funciona

1.Si está extendiendo un ViewGroup (en su caso, un RelativeLayout ) debería anular dispatchDraw() lugar de onDraw() .

Discusión sobre el tema @

https://groups.google.com/forum/?fromgroups=#!topic/android-developers/oLccWfszuUo

protected void dispatchDraw (Canvas canvas)

Llamado por sorteo para dibujar las vistas del niño. Esto puede ser anulado por clases derivadas para obtener control justo antes de que se dibujen sus hijos (pero después de que se haya dibujado su propia vista) .

Parámetros

Lienzo el lienzo sobre el que dibujar la vista.

Ejemplo

public class Hello extends Activity { private MyView myView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); Log.e("hello", "hello"); this.myView = new MyView(this); setContentView(this.myView); } public class MyView extends RelativeLayout { private Paint myPaint = new Paint(); private int[] numbers; public MyView(Context paramContext) { super(paramContext); Log.e("MyView", "MyView"); setFocusable(true); setBackgroundResource(R.drawable.ic_launcher); } @Override protected void dispatchDraw(Canvas canvas){ super.dispatchDraw(canvas); Log.i("...............","drawing"); } } }

2. Si onDraw en la llamada al constructor setWillNotDraw(false) entonces debería funcionar.

http://developer.android.com/reference/android/view/View.html#setWillNotDraw(boolean)

public MyView(Context context) { super(context); sContext = context; init(); setWillNotDraw(false); }


Tenía OnDraw no llamado en C # usando 4.1 Jelly Bean API 16. Cambié de compilar con API 16 SDK a compilar con 7.1 Nougat SDK. Resolvió el problema completamente. Todavía tengo en el sdk mínimo de API 16 y se ejecuta bien en mi Jelly Beam avd.