Java Android绘制多条线

Java Android绘制多条线,java,android,multithreading,canvas,graphic,Java,Android,Multithreading,Canvas,Graphic,我想用图形表示超声波传感器的距离数据(尚未实现) 我想画一个矩形来代表gokart,前面有6条线,后面有6条线。 由于我的java新手知识,代码似乎遭到了严重的破坏。 测试线条绘制方法时,程序不会启动。你知道为什么吗 package com.example.gokartdst; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android

我想用图形表示超声波传感器的距离数据(尚未实现)

我想画一个矩形来代表gokart,前面有6条线,后面有6条线。 由于我的java新手知识,代码似乎遭到了严重的破坏。 测试线条绘制方法时,程序不会启动。你知道为什么吗

package com.example.gokartdst;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class GameView extends SurfaceView implements SurfaceHolder.Callback
{
    private RefreshThread drawThread;
    public static int screenWidth;
    public static int screenHeight;
    private float density;

    public static float tX;
    public static float tY;
    public int i;
    public int j;

    private GoKart[][] detectors;


    public GameView(Context context, float density) {
        super(context);

        this.density = density;
        detectors=new GoKart[1][5];
        for(i=0;i<=1;i++)
        {
            for(j=0;j<=5;j++)
            {
                detectors[i][j]=new GoKart(i,j);
            }
        }



        //detectors = new GoKart(Color.WHITE, 15.0, dpTodx(30));

        getHolder().addCallback(this);
        drawThread = new RefreshThread(getHolder(), this);
    }

    /*public GameView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }
    */

    // Itt számolja újra a szükséges pozíciókat
    public void update(Canvas c) {

        if (c != null) {
            screenWidth = c.getWidth();
            screenHeight = c.getHeight();
        }

        //detectors.BallPosUpdate();

    }

    //Újrarajzolás
    @Override
    public void onDraw(Canvas canvas) {
        if (canvas != null) {
            canvas.drawColor(Color.BLACK);
            for(i=0;i<=1;i++)
                for(j=0;j<=5;j++)
                {
                    detectors[i][j].BallDraw(canvas);
                }

            //Log.i("onDraw", "onDraw");
        }
    }

    public int dpTodx(int dp) {
        int px = (int) (dp*density);
        return px;
    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        if(drawThread!=null)
        {
          drawThread.setRunning(true);
          drawThread.start();
        }
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        boolean retry = true;
        if(drawThread!=null)
        {
            drawThread.setRunning(false);
            while (retry) {
                try {
                    drawThread.join();
                    retry = false;
                } catch (InterruptedException e) {
                }
            }
        }
    }

    // A RefreshThread a fő szál, hogy ne az UI szálon fusson. Így gyorsabb.
        class RefreshThread extends Thread {
            private SurfaceHolder mSurfaceHolder;
            private GameView gameView;
            private boolean enabled = false;

            public RefreshThread(SurfaceHolder surfaceHolder, GameView panel) {
                mSurfaceHolder = surfaceHolder;
                gameView = panel;
            }

            public void setRunning(boolean run) {
                enabled = run;
            }
            @Override
            public void run() {
                long lastTime = System.nanoTime();
                long timer = System.currentTimeMillis();
                final double ns = 1000000000.0 / 60.0;
                double delta = 0;
                int frames = 0;
                int updates = 0;
                Canvas c;
                while (enabled) {
                    c = null;
                    long now = System.nanoTime();
                    delta += (now - lastTime) / ns;
                    //Log.i("DELTA", Double.toString(delta));
                    lastTime = now;

                    try {
                        c = mSurfaceHolder.lockCanvas(null);
                        while (delta >= 1) {
                            synchronized (mSurfaceHolder) {
                                if (gameView != null) {
                                    gameView.update(c);
                                    updates++;
                                    delta--;
                                }
                            }
                        }
                        gameView.onDraw(c);
                        frames++;

                        if (System.currentTimeMillis() - timer > 1000) {
                            timer += 1000;
                            Log.i("Frames", "Frames: " + frames + " | Updates: " + updates);
                            updates = 0;
                            frames = 0;
                        }
                    } finally {
                        // igy biztos nem hagyjuk
                        // inkonzisztens állapotban a Surface-t
                        if (c != null) {
                            mSurfaceHolder.unlockCanvasAndPost(c);
                        }
                    }
                }
            }
        }

        @Override
        public void surfaceChanged(SurfaceHolder holder, int format, int width,
                int height) {
            // TODO Auto-generated method stub

        }   
}
还有Logkat:

09-20 11:01:29.320: W/dalvikvm(5277): threadid=1: thread exiting with uncaught exception (group=0x415efba8)
09-20 11:01:29.320: E/AndroidRuntime(5277): FATAL EXCEPTION: main
09-20 11:01:29.320: E/AndroidRuntime(5277): Process: com.example.soccergame, PID: 5277
09-20 11:01:29.320: E/AndroidRuntime(5277): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.soccergame/com.example.gokartdst.GameActivity}: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread.access$800(ActivityThread.java:135)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.os.Handler.dispatchMessage(Handler.java:102)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.os.Looper.loop(Looper.java:136)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread.main(ActivityThread.java:5017)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at java.lang.reflect.Method.invokeNative(Native Method)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at java.lang.reflect.Method.invoke(Method.java:515)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at dalvik.system.NativeStart.main(Native Method)
09-20 11:01:29.320: E/AndroidRuntime(5277): Caused by: java.lang.ArrayIndexOutOfBoundsException: length=5; index=5
09-20 11:01:29.320: E/AndroidRuntime(5277):     at com.example.gokartdst.GameView.<init>(GameView.java:36)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at com.example.gokartdst.GameActivity.onCreate(GameActivity.java:17)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.Activity.performCreate(Activity.java:5231)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
09-20 11:01:29.320: E/AndroidRuntime(5277):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-20 11:01:29.320: E/AndroidRuntime(5277):     ... 11 more
09-20 11:01:29.320:W/dalvikvm(5277):threadid=1:线程以未捕获异常退出(组=0x415efba8)
09-20 11:01:29.320:E/AndroidRuntime(5277):致命异常:主
09-20 11:01:29.320:E/AndroidRuntime(5277):进程:com.example.soccergame,PID:5277
09-20 11:01:29.320:E/AndroidRuntime(5277):java.lang.RuntimeException:无法启动活动组件信息{com.example.soccergame/com.example.gokartdst.GameActivity}:java.lang.ArrayIndexOutOfBoundsException:长度=5;指数=5
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2195)
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2245)
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.ActivityThread.access$800(ActivityThread.java:135)
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.os.Handler.dispatchMessage(Handler.java:102)上
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.os.Looper.loop(Looper.java:136)
09-20 11:01:29.320:E/AndroidRuntime(5277):位于android.app.ActivityThread.main(ActivityThread.java:5017)
09-20 11:01:29.320:E/AndroidRuntime(5277):位于java.lang.reflect.Method.Invokenactive(本机方法)
09-20 11:01:29.320:E/AndroidRuntime(5277):位于java.lang.reflect.Method.invoke(Method.java:515)
09-20 11:01:29.320:E/AndroidRuntime(5277):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
09-20 11:01:29.320:E/AndroidRuntime(5277):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
09-20 11:01:29.320:E/AndroidRuntime(5277):在dalvik.system.NativeStart.main(本机方法)
09-20 11:01:29.320:E/AndroidRuntime(5277):由以下原因引起:java.lang.ArrayIndexOutOfBoundsException:length=5;指数=5
09-20 11:01:29.320:E/AndroidRuntime(5277):位于com.example.gokartdst.GameView。(GameView.java:36)
09-20 11:01:29.320:E/AndroidRuntime(5277):在com.example.gokartdst.GameActivity.onCreate(GameActivity.java:17)
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.Activity.performCreate(Activity.java:5231)上
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)上
09-20 11:01:29.320:E/AndroidRuntime(5277):在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2159)
09-20 11:01:29.320:E/AndroidRuntime(5277):。。。还有11个

这是因为您的for循环,它应该是

    for(i=0;i<1;i++)
    {
        for(j=0;j<5;j++)
        {
            detectors[i][j]=new GoKart(i,j);
        }
    }
for(j = 0; j < 5; j++) {
    detectors[i][j] = new GoKart(i, j);
}

对于(i=0;i您的数组
检测器
长度为5

for(j = 0; j <= 5; j++) {
    detectors[i][j] = new GoKart(i, j);
}

for(j=0;j谢谢,我意识到我还将2d数组初始化为[1][5]而不是[2][6]。对,如果您真的希望它的大小为2x6,那么您的循环就可以工作了,但是像这样表示循环比使用
j更常见
for(j = 0; j < 5; j++) {
    detectors[i][j] = new GoKart(i, j);
}