如何更新画布绘制文本而不是重绘画布

时间:2014-11-27 12:16:40

标签: android text android-canvas draw

我能够在动画视图上的画布上绘制文本,现在问题是当我绘制文本时在同一个画布上进行下一次绘制我的绘制文本正在消失我的意思是屏幕正在重绘因为无效我想保留我以前的绘制并在同一画布上进行新绘制我将如何做到这一点?

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


}

2 个答案:

答案 0 :(得分:1)

  1. 无论何时呼叫,Canvas都会创建 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());
        }
    
    }}
    
  3.   

    模型类是:

    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”

off screen drawing in android

绘制位图。 在画布上绘制位图。 重复。