Как обновить текст холста, а не перерисовывать холст

Я могу нарисовать текст на холсте при просмотре движения, теперь проблема заключается в том, что когда я рисую текст и иду для следующего розыгрыша на том же холсте, мой текст рисования исчезает, я имею в виду, что экран перерисовывается из-за недействительности. Я хочу сохранить предыдущий Рисовать и делать новую жеребьевку на том же холсте, как я собираюсь это сделать?

@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. Холст создает каждый раз, когда вы вызываете метод invalidate (). Поэтому я сохраняю весь текст и позиции в arraylist и рисую холст при каждом нажатии на холст.
  2. Это один из способов решить вашу проблему. Холст – это просто растровое изображение. Все, что вы нарисовали на нем, является постоянным. Есть способы справиться с этим, но снова большинство реализаций просто перерисовывают весь холст на каждом проходе.

    Ниже приведен код:

     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()); } }} 

Класс модели:

 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; }} 

Я не буду читать этот чрезмерно длинный и ужасно отформатированный код со включенной несущественной обработкой событий … но в целом, если вы хотите сохранить состояние холста между рисунками, вам нужно сделать это явно.

Google «Android-рисунок экрана»

Выключение экрана в андроиде

Нарисуйте растровое изображение. Покрасьте это растровое изображение на холсте. Повторение.