Perché non viene chiamato onDraw dopo invalidate ()?

Ho trovato molti post su stackoverflow ma non riesco ancora a risolvere il mio problema. Ecco il mio codice:

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; } } 

Vuoi per favore spiegare perché l'onDraw non è chiamato le prime tre volte che premo b1? Perché ho chiamato invalidate each volta che premo b1. Grazie mille!

  • Imansible avviare questo animatore in una vista indipendente! rivelano l'effetto
  • Argomenti GCM o messaggistica a valle
  • Android Studio: "Esecuzione non rioutput per l'attività": app: mergeDebugResources '"se il progetto viene creato nell'unità C:
  • Come interfacersi con i BadgeProvider sui telefoni Samsung per aggiungere un count all'icona dell'app?
  • Carattere urdu in textview
  • Creazione di una window di dialogo personalizzata in Android
  • 3 Solutions collect form web for “Perché non viene chiamato onDraw dopo invalidate ()?”

    Per impostazione predefinita, tutte le sotto-classi di ViewGroup non chiamano il metodo onDraw , è necessario triggersrlo chiamando il setWillNotDraw(false)

    Prendendo il prestito dal link @

    Layout personalizzato di Android – onDraw () non viene mai chiamato

    Prova il seguente funziona

    1. Se stai estendendo un ViewGroup (nel tuo caso un RelativeLayout ) devi ignorare dispatchDraw() anziché onDraw() .

    Discussione sul tema @

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

    protected void dispatchDraw (Canvas canvas)

    Chiamato dal sorteggio per disegnare le viste del bambino. Questo può essere ignorato dalle classi derivate per get il controllo appena prima che i suoi figli siano disegnati (ma dopo che la propria visione è stata disegnata) .

    parametri

    tele la canvas su cui tracciare la vista

    Esempio

     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. Se si sovrascrive onDraw nella chiamata constructor setWillNotDraw(false) , dovrebbe funzionare.

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

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

    Devi call setWillNotDraw(false); in modo che il metodo onDraw venga chiamato:

     private void init() { setWillNotDraw(false); ... } 
    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.