我能够在动画视图上的画布上绘制文本,现在问题是当我绘制文本时在同一个画布上进行下一次绘制我的绘制文本正在消失我的意思是屏幕正在重绘因为无效我想保留我以前的绘制并在同一画布上进行新绘制我将如何做到这一点?
@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();
}
答案 0 :(得分:1)
这是解决问题的方法之一。画布只是一个 位图。无论你画什么都是永久性的。有办法 处理它,但大多数实现只是重绘整个 每一次传球都有画布。
以下是代码片段:
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;
}}
答案 1 :(得分:-2)
我不会阅读包含所有不相关的事件处理的过长且可怕的格式化代码......但一般情况下,如果要在绘制之间保存画布状态,则需要明确地执行此操作。
谷歌“屏幕绘图的android”
绘制位图。 在画布上绘制位图。 重复。