Custom TextView auf Canvas zeichnen

  • Antworten:3
Gelöschter Account
  • Forum-Beiträge: 2.492

13.09.2015, 12:54:13 via Website

Hallo,

ich habe ein kleines Problem. Und zwar habe ich mir ein Custom TextView erstellt:

public class LetterCubeObject extends TextView {

@SuppressWarnings("deprecation")
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
public LetterCubeObject(Context context, char letter, int _x, int _y) {
    super(context);
    mContext = context;
    mLetter = letter;
    background = ContextCompat.getDrawable(getContext(), R.drawable.letter_cube);
    x = _x;
    y = _y;
    this.setText("" + letter);
    if(android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.JELLY_BEAN)
        this.setBackgroundDrawable(background);
    else
        this.setBackground(background);
}

public void drawCube(Canvas canvas){
    mSize = canvas.getWidth()/10;
    background.setBounds(x - (mSize / 2), y - (mSize / 2), x + (mSize / 2), y + (mSize / 2));
    background.draw(canvas);
}

}

Das Ergebnis soll ein Quadrat (der Hintergrund) mit dem Buchstaben darauf sein.
Zum Zeichnen auf dem Canvas rufe ich in einem WorkerThread die drawCube Methode auf.
So wie es da ist wird dann aber nur der Hintergrund und nicht der Buchstabe gezeichnet.
Ich habe es schon mit invalidate() oder canvas.drawText() veruscht, oder mit folgender Methode:
http://stackoverflow.com/questions/5242757/how-to-draw-textview-on-canvas-in-android
aber nie ist der Buchstabe mittig oder wird überhaupt angezeigt.

Hat jemand eine Idee wie ich das lösen kann?

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

18.09.2015, 14:13:49 via Website

Hallo Lars,

ketzerische Frage: Musst Du TextView erben?
Bei meinem Sudoku zeichne ich ja auch diverse Buchstaben zentriert in Kästchen - aber das ist alles keine TextView(s).

VG

— geändert am 18.09.2015, 14:14:07

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

18.09.2015, 17:59:40 via App

Nein es muss kein TextView sein denke ich. Was würdest du denn vorschlagen? wenn ich nur von view Erbe ist es ja fast das gleiche.

Antworten
Gelöschter Account
  • Forum-Beiträge: 438

19.09.2015, 07:00:01 via Website

Als Beispiel mal ein - zusammengestrichenes - Beispiel aus meinen Sourcen; Klasse erbt direkt von View:
Diese Methode wird gerufen, nachdem das Sudoku-Raster mit all seinen Einfärbungen, Linien, Hervorhebungen usw. bereits auf der Canvas gemalt wurde.

private void drawCellContent(final Canvas canvas, final SudokuBoard sudokuBoard, final float[] columnLefts, final float[] rowTops) {
    [...]
    int value = sudokuBoard.getValue(mTmpCoordinates);
    [...]
    canvas.drawText(Integer.toString(value),
        columnLefts[mTmpCoordinates.getCol()] + mDimensions.mCellSize / 2f,
        rowTops[mTmpCoordinates.getRow()] + mDimensions.mNumberTop,
        mCellValuePaint);
    [...]
}

Bei der Initialisierung der Klasse wurde mCellValuePaint.setTextAlign(Paint.Align.CENTER); gerufen, das sorgt für die horizontale Zentrierung, so dass ich einfach für die x-Koordinate die Mitte meiner Zelle (also linker Rand + halbe Breite) setzen kann.

Für die vertikale Ausrichtung vermesse ich eine Zeichenkette mit den von mir benötigten Zeichen 1-9. Dazu rufe ich die Methode Paint.getTextBounds(...).

Das funktioniert.

Noch eine banale Frage: Hast Du Paint.setTextSizegerufen? Ist jetzt mal wild geraten, was der Initialwert sein könnte, wenn man das vergisst - aber wenn das 0 sein sollte, würde das erklären, warum Du nichts siehst.
Bei mir initialisiere ich die Texthöhe wie folgt:

float cellTextSize = mCellSize * 0.75f;
cellValuePaint.setTextSize(cellTextSize);

HTH

P.S. Die Formatierung von Inline-Code schein momentan zu spinnen - in der Vorschau sieht es gut aus, aber in der abgespeicherten Version wird nur der erste Buchstabe richtig gesetzt.

— geändert am 19.09.2015, 07:03:35

Aktuelles Entwicklungsprojekt: (thinking) Sudoku Dojo Free (lightbulb)
Ich freue mich über Tester/innen.

Antworten