Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/209.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在画布上绘制并擦除圆圈_Java_Android_Android Canvas - Fatal编程技术网

Java 在画布上绘制并擦除圆圈

Java 在画布上绘制并擦除圆圈,java,android,android-canvas,Java,Android,Android Canvas,我是android的新手,所以我不知道这个问题是否基本 我想每N秒在画布上画一个圆圈 在寻找教程时,我成功地在画布上画了一个圆。但随后问题出现了。 我怎样才能删除我以前画的一个圆 我这样做可能不好,事实上,我只是画了另一个圆圈(但白色)。这意味着,每次迭代我都会画一个白色的圆圈,以擦除前一个圆圈。然后是蓝色的新圆圈 它在第一次迭代中工作得很好…但是一旦我在已经画圆的地方开始画圆…事情就开始出错了…就好像再次画一些以前被擦除的圆再次出现一样 我真的不知道该怎么解释 您可以看到在执行这段代码时会发生

我是android的新手,所以我不知道这个问题是否基本

我想每N秒在画布上画一个圆圈

在寻找教程时,我成功地在画布上画了一个圆。但随后问题出现了。 我怎样才能删除我以前画的一个圆

我这样做可能不好,事实上,我只是画了另一个圆圈(但白色)。这意味着,每次迭代我都会画一个白色的圆圈,以擦除前一个圆圈。然后是蓝色的新圆圈

它在第一次迭代中工作得很好…但是一旦我在已经画圆的地方开始画圆…事情就开始出错了…就好像再次画一些以前被擦除的圆再次出现一样

我真的不知道该怎么解释

您可以看到在执行这段代码时会发生什么

我的游戏活动发射器

public class GameActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Float max = new Float(200.42);
        ArrayList<Float> liste_test = new ArrayList<Float>();
        liste_test.add(new Float(36.8));
        liste_test.add(new Float(147.8));
        liste_test.add(new Float(97.8));
        liste_test.add(new Float(max));
        liste_test.add(new Float(10));
        setContentView(new ExampleSurfaceView(this,liste_test,max));
    }
}
公共类GameActivity扩展了AppCompativity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
最大浮动=新浮动(200.42);
ArrayList liste_test=新建ArrayList();
增加(新浮点数(36.8));
增加(新浮点数(147.8));
增加(新浮点数(97.8));
添加(新浮动(最大值));
添加(新浮点数(10));
setContentView(新示例SurfaceView(此,列表测试,最大值));
}
}
我的示例SurfaceView使用列表中的数据“规格化”绘制圆圈

public class ExampleSurfaceView extends SurfaceView implements SurfaceHolder.Callback {
    // Le holder
    SurfaceHolder mSurfaceHolder;
    // Le thread dans lequel le dessin se fera
    DrawingThread mThread;

    int oldPosition_x;
    int oldPosition_y;

    ArrayList<Integer> valeurs_capteurs;
    int nb_valeurs;

    public ExampleSurfaceView (Context context,ArrayList<Float> donees_capteur, Float max) {
        super(context);
        this.valeurs_capteurs=normalise(donees_capteur,max);
        this.nb_valeurs=this.valeurs_capteurs.size();
        mSurfaceHolder = getHolder();
        mSurfaceHolder.addCallback(this);

        mThread = new DrawingThread();
    }

    //pour récupérer des données uniforme peu importe le capteur
    public ArrayList<Integer> normalise(ArrayList<Float> donnees, Float max){
        valeurs_capteurs = new ArrayList<Integer>();
        for (Float donnee : donnees) {
            int donnee_normalized= (int)((donnee/max)*100);
            valeurs_capteurs.add(donnee_normalized);
        }
        return valeurs_capteurs;
    }


    protected void onDraw(Canvas canvas,int nb) {
        //dessinez ici
        super.onDraw(canvas);
        Paint paint = new Paint();
        paint.setStyle(Paint.Style.FILL);

        int index = nb%(nb_valeurs-1);

        System.out.println(index);

        //On calcule une position à partir des données du capteur
        int circlePositionX = 60+this.valeurs_capteurs.get(index);
        int circlePositionY = 60+this.valeurs_capteurs.get(index);


        //initialisation au premier draw
        if(nb==0){
            oldPosition_x=circlePositionX;
            oldPosition_y=circlePositionY;
        }

        //effacer l'andien cercle
        paint.setColor(Color.WHITE);
        canvas.drawCircle(oldPosition_x,oldPosition_y, 50,paint);
        System.out.println("Erase in "+oldPosition_x+" - "+oldPosition_y);

        oldPosition_x=circlePositionX;
        oldPosition_y=circlePositionY;

        //dessiner le nouveau cercle
        paint.setColor(Color.BLUE);
        canvas.drawCircle(circlePositionX, circlePositionY, 50,paint);
        System.out.println("Draw in "+circlePositionX+" - "+circlePositionY);

    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
        // Que faire quand le surface change ? (L'utilisateur tourne son téléphone par exemple)
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        mThread.keepDrawing = true;
        mThread.start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        mThread.keepDrawing = false;

        boolean joined = false;
        while (!joined) {
            try {
                mThread.join();
                joined = true;
            } catch (InterruptedException e) {}
        }
    }

    private class DrawingThread extends Thread {
        // Utilisé pour arrêter le dessin quand il le faut
        boolean keepDrawing = true;

        @SuppressLint("WrongCall")
        @Override
        public void run() {

            int nb=0;
            while (keepDrawing) {
                Canvas canvas = null;

                try {
                    // On récupère le canvas pour dessiner dessus
                    canvas = mSurfaceHolder.lockCanvas();
                    // On s'assure qu'aucun autre thread n'accède au holder
                    synchronized (mSurfaceHolder) {
                        // Et on dessine
                        onDraw(canvas,nb);
                        nb+=1;
                    }
                } finally {
                    // Notre dessin fini, on relâche le Canvas pour que le dessin s'affiche
                    if (canvas != null)
                        mSurfaceHolder.unlockCanvasAndPost(canvas);
                }

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {}
            }
        }
    }
}
public类示例SurfaceView扩展了SurfaceView实现了SurfaceHolder.Callback{
//勒霍尔德
表面支架;
//这是一个非常有趣的故事
DrawingThread mThread;
int oldPosition_x;
int oldPosition_y;
ArrayList valeurs_Capturers;
内华达州;
public ExampleSurfaceView(上下文、数组列表受赠者、捕获者、浮点最大值){
超级(上下文);
这个。valeurs_capturers=正常化(受赠人_capturer,最大值);
this.nb_valeurs=this.valeurs_capters.size();
mSurfaceHolder=getHolder();
mSurfaceHolder.addCallback(此);
mThread=newdrawingthread();
}
//为穿制服的人倒杯酒
公共ArrayList标准化(ArrayList donnees,浮点最大值){
valeurs_capteurs=新阵列列表();
对于(浮动唐尼:唐尼){
int donnee_归一化=(int)((donnee/max)*100);
添加(donnee_规范化);
}
返回valeurs_捕获者;
}
受保护的void onDraw(画布,内部nb){
//德西内斯
super.onDraw(帆布);
油漆=新油漆();
绘制.设置样式(绘制.样式.填充);
综合指数=nb%(nb_-1);
系统输出打印项次(索引);
//关于俘虏方地位的计算
int circlePositionX=60+这个.valeurs\u captures.get(索引);
int circlePositionY=60+this.valeurs\u capters.get(索引);
//非盟总理抽签
如果(nb==0){
oldPosition_x=circlePositionX;
oldPosition_y=圆形位置;
}
//安迪恩火山灰
油漆。设置颜色(颜色。白色);
画布.画圈(oldPosition_x,oldPosition_y,50,绘画);
System.out.println(“在“+oldPosition\ux+”-“+oldPosition\uy”中擦除);
oldPosition_x=circlePositionX;
oldPosition_y=圆形位置;
//德斯纳新中心酒店
油漆。设置颜色(颜色。蓝色);
画布.画圈(圆圈位置X,圆圈位置Y,50,绘画);
System.out.println(“引入”+circlePositionX+“-”+circlePositionY);
}
@凌驾
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
/For Furle Qand and Load Survivchange?(L'UpLISATUR Toun Te Le Le Phone Par)
}
@凌驾
已创建的公共空白表面(表面持有人){
mThread.keepDrawing=true;
mThread.start();
}
@凌驾
公共空间表面覆盖(表面覆盖物持有人){
mThread.keepDrawing=false;
布尔连接=假;
当(!加入){
试一试{
mThread.join();
连接=真;
}捕获(中断异常e){}
}
}
私有类DrawingThread扩展线程{
//在这一天里,我们要充分利用这一机会
布尔值keepDrawing=true;
@SuppressLint(“错误呼叫”)
@凌驾
公开募捐{
int nb=0;
while(继续绘制){
Canvas=null;
试一试{
//在画布上洒上一杯酒
canvas=mSurfaceHolder.lockCanvas();
//关于s'assure qu'aucun autre螺纹n'accède au holder
已同步(mSurfaceHolder){
//德辛岛
onDraw(帆布,nb);
nb+=1;
}
}最后{
//最后的圣母院,在画布上的圣母院
if(canvas!=null)
mSurfaceHolder.unlockCanvasAndPost(画布);
}
试一试{
《睡眠》(2000年);
}捕获(中断异常e){}
}
}
}
}

当我查看指纹时,数据似乎是合乎逻辑的,我擦除并打印到好的位置…但问题仍然存在…显然我做错了什么,但我无法在多次搜索后找出它是什么。感谢您的帮助。

如果您试图删除画布上的所有内容,您可以在
onDraw
方法的开头调用:

canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR)
此外,为了每秒绘制60次画布,您可以