android - 如何更新 Canvas 绘制文本而不是重绘 Canvas

标签 android text android-canvas draw

我现在可以在运动 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();


}

最佳答案

  1. 每当您调用 无效()方法。所以我维护所有的文本和位置 在 arraylist 中,并在每次单击 Canvas 时绘制 Canvas 。
  2. 这是解决您问题的方法之一。 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/

相关文章:

android - android中的位图圆形裁剪

java - 如何返回 DocumentSnapShot 作为方法的结果?

mysql - 如何上传文件(csv 或文本)并在 Zope 框架中读取内容

java - 在主 Activity 中单击按钮更改 Canvas

java - 从 BLOB 数据类型转义特殊字符

android - 在自定义 View 的状态更改时更改颜色

android - INSTALL_FAILED_UPDATE_INCOMPATIBLE 即使在原件被完全移除后也会出现

android - 如何在 Flutter 上绘制两个地理点之间的路线?

android - 如何从android中的json对象中删除和解析空字符串并显示为列表