我现在可以在运动 View 的 Canvas 上绘制文本,问题是当我绘制文本并在同一 Canvas 上进行下一次绘制时,我的绘制文本正在消失,我的意思是屏幕正在重绘,因为我想要无效保留我以前的绘图并在同一 Canvas 上绘制新绘图我要怎么做?
@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();
}
最佳答案
- 每当您调用 无效()方法。所以我维护所有的文本和位置 在 arraylist 中,并在每次单击 Canvas 时绘制 Canvas 。
这是解决您问题的方法之一。 Canvas 只是一个 位图。无论你在上面画什么,它都是永久的。有办法 处理它,但大多数实现只是重新绘制整个 Canvas 在每一遍上。
下面是代码 fragment :
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()); } }}
The model class is:
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;
}}
关于android - 如何更新 Canvas 绘制文本而不是重绘 Canvas ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27170618/