在画布上绘制多次 [英] Draw on Canvas multiple times

查看:225
本文介绍了在画布上绘制多次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在锻炼我班有一个小问题。这次演习是绘制形状多次在画布上。但我只能画一次,当我画一个又一个的previous被删除。这里是我的CustomView code。 figuras是形状,在未来我会救他们的LinkedList的。上绘制我应该从sRaw值LinkedList的数字。

I've got a little problem on a exercise of my class. The exercise is to draw Shapes multiple times on Canvas. But I can only draw once, when I draw another one, the previous is deleted. Here is my CustomView code. figuras is an LinkedList of shapes that in the future I will save them. On draw i shall sraw the figures from the LinkedList.

包com.example.AndroidTest;

package com.example.AndroidTest;

    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Color;
    import android.graphics.Paint;
    import android.graphics.Paint.Style;
    import android.text.TextUtils;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Toast;

    import java.util.LinkedList;

公共类CustomView扩展视图{

public class CustomView extends View {

private final Paint brush;
private LinkedList<Figures> figuras;
public int id;
private float startX;
private float endX;
private float startY;
private float endY;
Figures fig; // á partida é para mudar para o createFigure
public CustomView(Context context, LinkedList <Figures> figures)
{
    super(context);
    brush = new Paint();
    brush.setStyle(Style.STROKE);
    brush.setColor(Color.WHITE);
    brush.setStrokeWidth(6);
    figuras = figures;
}

@Override
protected void onDraw(Canvas canvas)
{
    super.onDraw(canvas);


        createFigure( startX,  startY,  endX,  endY);
        fig.drawFigure(canvas, brush);
        invalidate();

}

public String getString(){
    String joined = TextUtils.join("\n\n", figuras); return joined;
} // criar uma string a copiar o conteudo duma list com o intervalo de uma virgula.


@Override
public boolean onTouchEvent( MotionEvent event) {

    if (event.getAction() == event.ACTION_DOWN) {
        startY = event.getY();
        startX = event.getX();
        endY = event.getY();
        endX = event.getX();
        figuras.add(fig);
        Toast.makeText(getContext(), "" + figuras.size(), Toast.LENGTH_SHORT).show();

    } else if (event.getAction() == event.ACTION_MOVE) {
        endY = event.getY();
        endX = event.getX();
        figuras.getLast().setEndVars(endX, endY);

    }
    return super.onTouchEvent(event);
}

public void createFigure(float startX, float startY, float endX, float endY) {


    switch (id) // aqui crio a figura Fig fig = new line/circle/rect
    {
        case 0:
            fig = new Line(startX, startY, endX, endY);
            break;
        case 1:
            fig = new Circle(startX, startY, endX, endY);
            break;
        case 2:
            fig = new Rectangle(startX, startY, endX, endY);
            break;
    }
    //return fig;
}

public void setID(int aux)
{
    id = aux;
}

public LinkedList<Figures> getArray()
{
    return figuras;
}

}

推荐答案

在调用无效已绘制将被删除,的onDraw将会再次调用一切。目前你在无限循环绘制,绘制每一幅图的startY,运行startx,恩迪和endX变量的当前值的时间,那么失效你画什么。如果这些变量已经改变了旧的数字将不会被再次吸入。

After you call invalidate everything that has been drawn will be erased and onDraw will be called again. Currently you are drawing in an infinite loop, every time drawing one figure with the current values of the startY, startX, endY and endX variables then invalidating what you have drawn. If those variables have changed the old figure will not be drawn again.

为了绘制新图和所有旧的为好,每次的onDraw时间叫你将不得不遍历 figuras 并再次战平每一个人物。然后,你应该看到figuras ,因此,所有的数字要绘制不断加入所有数据。像这样的:

In order to draw the new figure and all the old ones as well, every time onDraw is called you would have to iterate over figuras and draw every figure again. Then you should see all figures ever added to figuras, therefore all figures you want to draw. Like this:

protected void onDraw(Canvas canvas)
{
   super.onDraw(canvas);
   for(Figures f : figuras) {
      f.drawFigure(canvas, brush);
   }
}

业绩还有两个概念。你应该叫无效 onTouchEvent 并没有对的onDraw 。这将节省大量的计算能力的。目前,我敢打赌,你可以用你的手机作为暖手器。
你也应该建立在 onTouchEvent 的身影。在的onDraw 只能做是必要的。其他的一切应该是外面的的onDraw

Two more notions on performance. You should call invalidate in your onTouchEvent and not on the onDraw. That will save a lot of calculating power. Currently i bet you can use your phone as hand warmer. Also you should create the figure in the onTouchEvent. In the onDraw only do what is necessary. Everything else should be outside of onDraw.

这篇关于在画布上绘制多次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆