Warum wird in einem View-Klasse onDraw Methode trotz invalidate() nicht aufgerufen

  • Antworten:3
  • OffenNicht stickyBentwortet
  • Forum-Beiträge: 57

05.05.2016, 18:48:02 via Website

Hallo Community,

ich habe eine View-Klasse und möchte in regelmäßigen Abständen die onDraw Methode aufrufen.
Leider funktioniert es nicht, obwohl ich die invalidate() aufrufe.

public class FliesenderText_View extends View implements Runnable{
private Handler handler = new Handler();
private Paint paint = new Paint();
private Rect bounds = new Rect();

// Konstruktoren
public FliesenderText_View(Context context) {
    super(context);
    //setWillNotDraw(false);
    run();
}
public FliesenderText_View(Context context, AttributeSet attrs) {super(context, attrs);}

@Override
protected void onDraw(Canvas canvas) {// onDraw wird nur einmal aufgerufen
    super.onDraw(canvas);
    if (Variables.schalter == Variables.SCHALTER_AN){// Erstberechnungen sollen nur einmal aufgerufen werden.
        canvas.setDrawFilter(new PaintFlagsDrawFilter(1, Paint.ANTI_ALIAS_FLAG));
        super.dispatchDraw(canvas);

        paint.setTextSize(Variables.int_textGrosse);
        paint.setColor(Color.WHITE);
        paint.getTextBounds(Variables.text, 0, Variables.text.length(), bounds);

        Variables.leinwand_breite = canvas.getWidth();
        Variables.text_breite = bounds.width();

        if (Variables.horizontal_center) Variables.anfangsX = (Variables.leinwand_breite - Variables.text_breite) / 2;
        else Variables.anfangsX = 3;

        Variables.anfangsY = (int) ((canvas.getHeight() / 2) - ((paint.descent() + paint.ascent()) / 2)) ;
        Variables.schalter = Variables.SCHALTER_AUS;
    }

    canvas.drawText(Variables.text, Variables.anfangsX, Variables.anfangsY, paint);
    Can.L("onDraw");
}// onDraw - ENDE

@Override
public void run() {
    text_fliessen_lassen();
    this.invalidate();
    handler.postDelayed(this, 10);
}// run - ENDE

private void text_fliessen_lassen(){
    Variables.anfangsX++;
}// text_fliessen_lassen - ENDE

}// Klasse - ENDE

Die run() wird regelmäßig aufgerufen.

Die XML sieht so aus:

        <com.cans.counters.FliesenderText_View
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/view_fur_fliesenderText"
        android:layout_weight="1"
        android:layout_gravity="center" />

In onCreate wird die View-Klasse nicht aufgerufen, da das automatisch passiert.

Hat jemand ein Idee?

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.164

05.05.2016, 18:57:38 via App

der 2. Konstruktor mit den Attributen ruft kein Run() auf sondern nur die Superclass.
Wenn du Views nicht per Code sondern per XML erstellst wird der 2. Construktor benutzt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Can Erdener Yazar

Antworten
  • Forum-Beiträge: 57

05.05.2016, 20:48:42 via Website

Hallo Pascal,

vielen Dank, das war wirklich das Problem.
Ich habe noch eine Frage: Wann sollte man statt invalidate(), postInvalidate() Methode aufrufen?
Und herzlichen Glückwunsch zum Männertag.

— geändert am 05.05.2016, 21:09:27

Antworten

Empfohlene Artikel