Cómo actualizar el texto de dibujo de lienzo en lugar de volver a dibujar el lienzo

Soy capaz de dibujar un texto sobre lienzo en la vista de movimiento ahora el problema es que cuando dibujo texto y vaya para el próximo sorteo en el mismo lienzo mi texto de dibujo se está haciendo desaparecer, quiero decir pantalla se está volviendo a dibujar a causa de invalidar quiero mantener mi anterior dibujar y hacer nuevo dibujo en el mismo lienzo ¿cómo voy a hacer eso?

@Override protected void onDraw(Canvas canvas) { Paint hint = new Paint(); path = new Path(); mTextPaths = new ArrayList<Path>(); Log.v("getting mtextpaths", mTextPaths.toString()); int m; if (strgettile != null) { for (m = 0; m < strgettile.length(); m++) { System.out.println(strgettile.charAt(m)); char convertst = strgettile.charAt(m); characterToString = Character.toString(convertst); // canvas.drawText(characterToString, x, y, hint); // canvas.drawText(characterToString, m // * width + x, m * height + y, foreground); //its working in // cross // canvas.drawText(characterToString, x, m * height + y, // foreground); //its working for vertical // canvas.drawText(characterToString, m // * width + x, y, foreground); //its working in horizontal // setSelectedTile(tile); if (getorientation.equalsIgnoreCase("Horizontal")) { canvas.drawText(characterToString, m * width + positionX, positionY, foreground); // for motion event hint.setColor(Color.BLACK); hint.setTextSize(45); foreground.getTextPath(characterToString, 0, characterToString.length(), positionX * 2 / 3, positionY - 4, path); } else { canvas.drawText(characterToString, positionX, m * height + positionY, foreground); hint.setColor(Color.BLACK); hint.setTextSize(45); foreground.getTextPath(characterToString, 0, characterToString.length(), positionX * 2 / 3, positionY - 4, path); } } } public void setSelectedTile(String tile, String strorientations) { // TODO Auto-generated method stub Log.v("getting string in puzzle view ", tile); strgettile = tile; getorientation = strorientations; mTextPaths.add(path); invalidate(); } 

  1. Canvas está creando cada vez que llama al método invalidate (). Así que estoy manteniendo todo el texto y las posiciones en arraylist y dibujar el lienzo cada vez que haga clic en el lienzo.
  2. Es una forma de resolver su problema. Un lienzo es sólo un mapa de bits. Lo que usted dibuja en él es permanente. Hay maneras de manejarlo, pero de nuevo la mayoría de las implementaciones sólo vuelven a dibujar el lienzo entero en cada paso.

    A continuación se muestra el recorte de código:

     public class PuzzleView extends View { private static final String TAG = "Sudoku"; private float width; // width of one tile private float height; // height of one tile private int selX; // X index of selection private int selY; // Y index of selection private final Rect selRect = new Rect(); private final Game game; float positionX = 5; float positionY = 15; ArrayList<Kirti> data = new ArrayList<Kirti>(); String strgettile = null; Paint foreground = new Paint(Paint.ANTI_ALIAS_FLAG); String getorientation; String characterToString; Path path; List<Path> mTextPaths = new ArrayList<Path>(); public PuzzleView(Context context) { super(context); this.game = (Game) context; setFocusable(true); setFocusableInTouchMode(true); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { width = w / 9f; height = h / 9f; // getRect(selX, selY, selRect); Log.d(TAG, "onSizeChanged: width " + width + ", height " + height); super.onSizeChanged(w, h, oldw, oldh); } @Override protected void onDraw(Canvas canvas) { // super.onDraw(canvas); // canvas.save(); // canvas.restore(); // Draw the background... Paint background = new Paint(); background.setColor(getResources().getColor(R.color.puzzle_background)); canvas.drawRect(0, 0, getWidth(), getHeight(), background); // Draw the board... // Define colors for the grid lines Paint dark = new Paint(); dark.setColor(getResources().getColor(R.color.puzzle_dark)); Paint hilite = new Paint(); hilite.setColor(getResources().getColor(R.color.puzzle_hilite)); Paint light = new Paint(); light.setColor(getResources().getColor(R.color.puzzle_light)); // Draw the minor grid lines for (int i = 0; i < 9; i++) { canvas.drawLine(0, i * height, getWidth(), i * height, light); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), light); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } // Draw the major grid lines for (int i = 0; i < 9; i++) { if (i % 3 != 0) continue; canvas.drawLine(0, i * height, getWidth(), i * height, dark); canvas.drawLine(0, i * height + 1, getWidth(), i * height + 1, hilite); canvas.drawLine(i * width, 0, i * width, getHeight(), dark); canvas.drawLine(i * width + 1, 0, i * width + 1, getHeight(), hilite); } Paint hint = new Paint(); path = new Path(); int m; for (int i = 0; i < data.size(); i++) { String strgettile = data.get(i).getSt(); if (strgettile != null) { for (m = 0; m < strgettile.length(); m++) { System.out.println(strgettile.charAt(m)); char convertst = strgettile.charAt(m); characterToString = Character.toString(convertst); if (data.get(i).getorientation .equalsIgnoreCase("Horizontal")) { canvas.drawText(characterToString, m * data.get(i).getWidth() + data.get(i).getXposition(), data.get(i) .getYposition(), foreground); // for motion // event hint.setColor(Color.BLACK); hint.setTextSize(45); } else { // mTextPaths.add(strgettile); // for (int i = 0; i < mTextPaths.size(); i++) { canvas.drawText(characterToString, data.get(i) .getXposition(), m * data.get(i).getHeight() + data.get(i).getYposition(), foreground); // } hint.setColor(Color.BLACK); hint.setTextSize(45); } } try { if (foreground != null) { foreground.getTextPath(characterToString, 0, characterToString.length(), data.get(i) .getXposition() * 2 / 3, data.get(i) .getYposition() - 4, path); } } catch (Exception e) { } } } } @Override public boolean onTouchEvent(MotionEvent event) { if (event.getAction() != MotionEvent.ACTION_DOWN) game.showKeypadOrError(selX, selY); foreground.setColor(getResources().getColor(R.color.puzzle_foreground)); foreground.setStyle(Style.FILL); foreground.setTextSize(height * 0.75f); foreground.setTextScaleX(width / height); foreground.setTextAlign(Paint.Align.CENTER); FontMetrics fm = foreground.getFontMetrics(); positionX = (int) event.getX(); positionY = (int) event.getY() - (fm.ascent + fm.descent) / 2; return true; } public void setSelectedTile(String tile, String strorientations) { // TODO Auto-generated method stub Log.v("getting string in puzzle view ", tile); if (game.setTileIfValid(selX, selY, tile)) { strgettile = tile; getorientation = strorientations; mTextPaths.add(path); data.add(new Kirti(positionX, positionY, strgettile, getorientation, width, height)); invalidate(); Log.v("getting mtextpaths", mTextPaths.toString()); } }} 

La clase del modelo es:

 public class Kirti { float positionX; float positionY; String strgettile; String getorientation; float width; float height; public Kirti(float positionX, float positionY, String strgettile, String getorientation, float width, float height) { super(); this.positionX = positionX; this.positionY = positionY; this.strgettile = strgettile; this.getorientation = getorientation; this.width = width; this.height = height; } public float getPositionX() { return positionX; } public void setPositionX(float positionX) { this.positionX = positionX; } public float getPositionY() { return positionY; } public void setPositionY(float positionY) { this.positionY = positionY; } public String getStrgettile() { return strgettile; } public void setStrgettile(String strgettile) { this.strgettile = strgettile; } public String getGetorientation() { return getorientation; } public void setGetorientation(String getorientation) { this.getorientation = getorientation; } public float getWidth() { return width; } public void setWidth(float width) { this.width = width; } public float getHeight() { return height; } public void setHeight(float height) { this.height = height; }} 

No voy a leer ese código excesivamente largo y horriblemente formateado con todo el manejo irrelevante de eventos incluido … pero en general, si desea guardar el estado del lienzo entre los dibujos, debe hacerlo explícitamente.

Google "androide de dibujo de pantalla"

Dibujo fuera de la pantalla en android

Dibujar en un mapa de bits. Pintar ese mapa de bits en el lienzo. Repetir.

  • Android Ver agregar niño
  • Cómo cambiar el color de texto de un Android ToogleButton en el cambio de estado?
  • Obtener texto de la página web a la cadena
  • ¿Cómo dibujar texto en cursiva en el lienzo de Android?
  • Vista de texto con textos de colores diferentes en código xml
  • Render el texto en la aplicación puramente nativa de Android
  • Alinear el centro de texto con android
  • Portar clases y métodos Java a Android. (TextLayout, Font, Graphics2D, y más)
  • Color del texto del cambio del androide de artículos en hilandero
  • ¿Existen bibliotecas de análisis de PDF gratuitas que funcionen en Android?
  • Paginación en Android TextView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.