2016-11-29 17 views
0

мой код здесьМожно ли добавить курсор на drawtext на холсте?

textPaint.setStyle(Paint.Style.FILL); 
textPaint.setTextAlign(Paint.Align.CENTER); 
canvas.drawText(substring, textX, y, this.textPaint); 

Я хочу добавить здесь также курсор как EditText

+0

почему бы вам не использовать стилизованную 'EditText'? –

+0

@DimaRostopira, потому что я хочу добавить текст в нажатом положении, и я должен использовать холст для другого элемента рисования вместе, может работать – hugerde

ответ

0

Нет, насколько я знаю, что это невозможно, потому что текст является частью растрового изображения и не интерпретируется как текст с помощью интерфейса textmarker.

Я хотел бы предложить другое решение:

  1. Используйте инкапсулированный макет-структуру, как, что (! Раскладка только simplyfied)

    <FrameLayout> 
        <Canvas /> 
        <TextView /> 
        <!-- More textviews --> 
    </FrameLayout> 
    
  2. Вы можете расположить TextView внутри framelayout, вызвав функция комплектX или комплектY. Текстовое изображение будет всегда рисоваться поверх холста, пока текстовое представление будет определено после холста. Кроме того, вы можете сделать его видимым/невидимым кодом с помощью вызова функции setVisibility

  3. В дополнение к этому, вы можете добавить больше TextViews к framelayout динамически с помощью кода вместо определения TextView статически в макете XML

0

вы можете нарисовать мигающий курсор так:

private long lastCursorChangeState = -1; 
private boolean cursorVisible = true; 
private Rect textBounds = new Rect(); 

@Override 
protected void onDraw(Canvas canvas) { 
    if(isWriting){ 
     if(System.currentTimeMillis() - lastCursorChangeState > 500) { 
      cursorVisible = !cursorVisible; 
      lastCursorChangeState = System.currentTimeMillis(); 
     } 

     if(cursorVisible){ 
      paint.getTextBounds(textToDraw, 0, textToDraw.length(), textBounds); 
      canvas.drawLine(textX+textBounds.right, textY-textSize, textX+textBounds.right, textY, paint); 
     } 

     postInvalidateDelayed(500); 
    } 
}