I am able to draw a text on canvas on motion view now the problem is that when i draw text & go for the next draw on same canvas my draw text is getting disappear i mean screen is getting redraw because of invalidate i want keep my previous draw and make new draw on same canvas how am i going to do that ?
@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();
}
It is one of the way to solve your problem. A canvas is just a bitmap. Whatever you draw on it is permanent. There are ways to handle it but again most implementations just redraw the entire canvas on every pass.
Below is code snip:
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;
}}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With