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(); }
- Android ImageButton con imagen y texto
- Java de Java no funciona
- Cómo cambiar el color del texto del hilandero
- ¿Hay una manera de crear el stackoverfow "Etiquetas" EditText / Campo de entrada en Android?
- Obtener palabra de EditText en la posición actual del cursor
- Alinear texto alrededor del centro vertical de ImageSpan
- Necesidad de formatear moneda para TextView
- ¿Cómo se cambia el texto a negrita en Android?
- Android EditText, problema del textWatcher del teclado
- React Native: Determine el número de líneas del componente Text
- android xml El atributo de texto Textview no puede tomar '<' como valor
- Archivo de sonido grabado (ala google ahora, google keep) - RecognizerIntent / Listener
- Cambiar el tamaño de la fuente en el objeto del botón Spinner real
- 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.
-
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.
- ¿Se puede generar mediante programación la imagen enfocada para un ImageButton?
- ¿Cómo puedo ver que View se vuelve visible