2014-09-20 2 views
1

Я хочу, чтобы сделать графическое представление данных дистанционного ультразвукового датчика (пока не реализовано)Android рисунок несколько строк

Я хочу, чтобы нарисовать прямоугольник, представляющий Gokart, с 6 линий в передней и 6 в задней части. Код, кажется, плохо убит, из-за моего новичка java knoweledge. При тестировании методов рисования линии программа не запускается. Любые идеи почему?

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 

     } 
} 

Объект Gokart:

package com.example.gokartdst; 

import android.graphics.Canvas; 
import android.graphics.drawable.ShapeDrawable; 
import android.graphics.drawable.shapes.OvalShape; 
import android.graphics.drawable.shapes.RectShape; 
import android.graphics.Paint; 

public class GoKart { 

    private int i; 
    private double j; 

    private int dst; 

    ShapeDrawable mLinesDrawable; 
    Paint paint= new Paint(); 

    public GoKart(int ix, double jx) { 

     this.i = ix; 
     this.j = jx; 
     mLinesDrawable = new ShapeDrawable(new RectShape()); 
    } 

    public void BallDraw(Canvas canvas) { 

     /*mLinesDrawable.setBounds(X - diameter/2, Y - diameter/2, X + diameter/2, Y + diameter/2); 
     mLinesDrawable.getPaint().setColor(color); 
     mLinesDrawable.draw(canvas); 
     */ 
     if(i==0) 
     { 
      if(j==1) 
      { 
       canvas.drawLine(30, 30, 40, 30, paint); 
      } 
      if(j==2) 
      { 
       canvas.drawLine(40, 30, 50, 30, paint); 
      } 
     } 
    } 

И 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 

ответ

1

Это из-за вашего цикл, он должен быть

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

Примечание Я изменил и снаружи и внутреннего оврага. Оба условия остановки должны использовать оператор < не < =

Всякий раз, когда вы создаете массив (или в данном случае 2D-массив) размера N, вы должны выполнять итерацию только до тех пор, пока i (или j) меньше N, потому что, если вы продолжаете работать, когда i <= N также будет продолжаться до i = N + 1, что вызовет исключение ArrayIndexOutOfBoundsException, которое в основном говорит, что вы запрашиваете значение, находящееся за пределами границ массива.

+0

Спасибо, понял, что я также инициализировал 2d-массив в [1] [5] вместо [2] [6]. – VikingPingvin

+0

Правильно, если вы действительно хотите, чтобы размер был равен 2x6, ваши петли будут работать, однако более распространено обозначать такие циклы, а не использовать 'j <= N-1'. Кстати, хорошая вещь о Java - вы можете просто получить длину массива, выполнив 'array.length' – Gerard

1

вашего массив detectors имеет длину 5

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

в то время как вы назначаете значения до 6-индекса как условие в течение цикла является j <= 5 сделать его j < 5

Это должно быть

for(j = 0; j < 5; j++) { 
    detectors[i][j] = new GoKart(i, j); 
} 
Смежные вопросы