2015-05-02 4 views
0

У меня есть этот код. Это не сложно, я учусь, и я практиковал и возился с поверхностным видом. Я хочу только 2 прямоугольника, чтобы быть там, и изображение снижается. Когда мы касаемся второго прямоугольника, изображение начинает расти. Мы касаемся одного слева, и изображение перезапускается. Когда он достигает строки 89, он останавливается и дает исключение нулевого указателя. Я предполагаю, что ошибка возникает, когда я создаю холст.У меня есть исключение NullPointerException с использованием SurfaceView

public class LearningThreads extends Activity { 

ActivitySurface activitySurface; 
boolean crossGoesUp = false;//Sets if the cross goes up or down 
int leftRectangle1, topRectangle1, rightRectangle1, bottomRectangle1; 
int leftRectangle2, topRectangle2, rightRectangle2, bottomRectangle2; 

protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    activitySurface = new ActivitySurface(this); 
    activitySurface.setOnTouchListener(new canvasClicked()); 
    setContentView(activitySurface);//Sets the content to be the class we've created 
} 

protected void onPause() {//When the app is paused, it calls the method which pauses the thread that is constantly running 
    super.onPause(); 
    activitySurface.pause(); 
} 

protected void onResume() {//When the app starts or restarts, it calls the method which starts the thread 
    super.onResume(); 
    activitySurface.resume(); 
} 

public class canvasClicked implements OnTouchListener { 

    public boolean onTouch(View v, MotionEvent e) { 
     if (e.getAction() == MotionEvent.ACTION_DOWN) {//Only if the user starts touching something because I'm not interested in when he releases 
      if (e.getX() <= leftRectangle1 && e.getX() >= rightRectangle1 && e.getY() <= topRectangle1 && e.getY() >= bottomRectangle1) {//Tests if the user touched one of the rectangles 
       crossGoesUp = false; 
      } 
      if (e.getX() <= leftRectangle2 && e.getX() >= rightRectangle2 && e.getY() <= topRectangle2 && e.getY() >= bottomRectangle2) {//Tests if the user touched the other rectangle 
       crossGoesUp = true; 
      } 
     } 
     return false;//It doesn't repeat 
    } 
} 

public class ActivitySurface extends SurfaceView { 

    Thread mainThread; 
    boolean isRunning = false;//Sets when the app is running or not 
    SurfaceHolder holder;//Gives us useful methods to use in the canvas 
    int crossY = 0;//Sets the y coordinate of the cross 

    public ActivitySurface(Context context) { 
     super(context); 
     holder = getHolder(); 
    } 

    public void resume() { 
     isRunning = true; 
     mainThread = new Thread(new mainThread()); 
     mainThread.start(); 
    } 

    public void pause() { 
     isRunning = false; 
     try { 
      mainThread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public class mainThread implements Runnable {//Takes care of the thread 
     public void run() { 
      while(isRunning) { 
       if (holder.getSurface().isValid())//Tests if the surface is valid, if it is not it won't do anything until it is 
        continue; 

       Canvas canvas = holder.lockCanvas();//Creating the canvas: it has a mistake, everytime I use the canvas it gives a NullPointerException 
       canvas.drawRGB(50, 50, 50);//Setting the color of the canvas 

       leftRectangle1 = canvas.getWidth()/4 - 40;//Setting the variables so they can be used outside this Thread 
       topRectangle1 = canvas.getHeight()/2 - 25; 
       rightRectangle1 = canvas.getWidth()/4 + 40; 
       bottomRectangle1 = canvas.getHeight()/2 + 25; 

       leftRectangle2 = canvas.getWidth()/4 + (canvas.getWidth()/4) * 2 - 40; 
       topRectangle2 = canvas.getHeight()/2 - 25; 
       rightRectangle2 = canvas.getWidth()/4 + (canvas.getWidth()/4) * 2 + 40; 
       bottomRectangle2 = canvas.getHeight()/2 + 25; 

       Paint paint = new Paint();//Setting the paint which will define the colors of the rectangles 
       paint.setARGB(0, 100, 100, 100); 

       Rect rectangle1 = new Rect();//Setting the position of the rectangle 1 
       rectangle1.set(leftRectangle1, topRectangle1, rightRectangle1, bottomRectangle1); 

       Rect rectangle2 = new Rect();//Setting the position of the rectangle 2 
       rectangle2.set(leftRectangle2, topRectangle2, rightRectangle2, bottomRectangle2); 

       canvas.drawRect(rectangle1, paint);//Drawing the rectangles 
       canvas.drawRect(rectangle2, paint); 

       Bitmap cross = BitmapFactory.decodeResource(getResources(), R.drawable.animation);//Creating the image which is going to go up and down 
       canvas.drawBitmap(cross, canvas.getWidth()/2 - cross.getWidth()/2, crossY, paint); 

       if (crossGoesUp) {//If the crossGoesUp is true, that means the user last touch was in the rectangle 2, so the image goes up 
        if (crossY < -cross.getHeight())//Tests if the image isn't out of bounds 
         crossY = canvas.getHeight() + cross.getHeight(); 
        crossY -= 5; 
       } else { 
        if (crossY > canvas.getHeight() + cross.getHeight())//Same as above 
         crossY = -cross.getHeight(); 
        crossY += 5; 
       } 

       holder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
} 
} 

Это мой LogCat:

05-02 07:13:41.897: E/AndroidRuntime(1634): FATAL EXCEPTION: Thread-103 

05-02 07:13:41.897: E/AndroidRuntime(1634): Process: garden.apps.my_apps, PID: 1634 

05-02 07:13:41.897: E/AndroidRuntime(1634): java.lang.NullPointerException 

05-02 07:13:41.897: E/AndroidRuntime(1634): at com.apps.my_apps.LearningThreads$ActivitySurface$mainThread.run(LearningThreads.java:90) 

05-02 07:13:41.897: E/AndroidRuntime(1634): at java.lang.Thread.run(Thread.java:841) 
+0

Пожалуйста, ваши StackTrace, если у вас возникли проблемы с вашим кодом –

+0

@BojanKseneman правда, пожалуйста, напишите свой журнал кошку – Chaoz

+0

и добавить комментарий в строку под номером 86. – Pavya

ответ

0

вы должны использовать SurfaceHolder.Callback, ваша краска невидимая paint.setARGB (альфа, красный, зеленый, синий) - альфа 0..255 0 незримые 255 видимых

public class LearningThreads extends Activity { 

ActivitySurface activitySurface; 
boolean crossGoesUp = false;//Sets if the cross goes up or down 
int leftRectangle1, topRectangle1, rightRectangle1, bottomRectangle1; 
int leftRectangle2, topRectangle2, rightRectangle2, bottomRectangle2; 

protected void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    activitySurface = new ActivitySurface(this); 
    activitySurface.setOnTouchListener(new canvasClicked()); 
    setContentView(activitySurface);//Sets the content to be the class we've created 
} 

protected void onPause() {//When the app is paused, it calls the method which pauses the thread that is constantly running 
    super.onPause(); 
} 

protected void onResume() {//When the app starts or restarts, it calls the method which starts the thread 
    super.onResume(); 
} 

public class canvasClicked implements View.OnTouchListener { 

    public boolean onTouch(View v, MotionEvent e) { 
     if (e.getAction() == MotionEvent.ACTION_DOWN) {//Only if the user starts touching something because I'm not interested in when he releases 
      if (e.getX() <= leftRectangle1 && e.getX() >= rightRectangle1 && e.getY() <= topRectangle1 && e.getY() >= bottomRectangle1) {//Tests if the user touched one of the rectangles 
       crossGoesUp = false; 
      } 
      if (e.getX() <= leftRectangle2 && e.getX() >= rightRectangle2 && e.getY() <= topRectangle2 && e.getY() >= bottomRectangle2) {//Tests if the user touched the other rectangle 
       crossGoesUp = true; 
      } 
     } 
     return false;//It doesn't repeat 
    } 
} 

public class ActivitySurface extends SurfaceView implements SurfaceHolder.Callback { 

    Thread mainThread; 
    boolean isRunning = false;//Sets when the app is running or not 
    SurfaceHolder holder;//Gives us useful methods to use in the canvas 
    int crossY = 0;//Sets the y coordinate of the cross 

    public ActivitySurface(Context context) { 
     super(context); 
     holder = getHolder(); 
     holder.addCallback(this); 
    } 

    public void resume() { 
     isRunning = true; 
     mainThread = new Thread(new mainThread()); 
     mainThread.start(); 
    } 

    public void pause() { 
     isRunning = false; 
     try { 
      mainThread.join(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
    } 

    public class mainThread implements Runnable {//Takes care of the thread 

     public void run() { 
      while (isRunning) { 
       if (!holder.getSurface().isValid())//Tests if the surface is valid, if it is not it won't do anything until it is 
        continue; 

       Canvas canvas = holder.lockCanvas();//Creating the canvas: it has a mistake, everytime I use the canvas it gives a NullPointerException 
       canvas.drawRGB(50, 50, 50);//Setting the color of the canvas 

       leftRectangle1 = canvas.getWidth()/4 - 40;//Setting the variables so they can be used outside this Thread 
       topRectangle1 = canvas.getHeight()/2 - 25; 
       rightRectangle1 = canvas.getWidth()/4 + 40; 
       bottomRectangle1 = canvas.getHeight()/2 + 25; 

       leftRectangle2 = canvas.getWidth()/4 + (canvas.getWidth()/4) * 2 - 40; 
       topRectangle2 = canvas.getHeight()/2 - 25; 
       rightRectangle2 = canvas.getWidth()/4 + (canvas.getWidth()/4) * 2 + 40; 
       bottomRectangle2 = canvas.getHeight()/2 + 25; 

       Paint paint = new Paint();//Setting the paint which will define the colors of the rectangles 
       paint.setARGB(255, 100, 100, 100); 

       Rect rectangle1 = new Rect();//Setting the position of the rectangle 1 
       rectangle1.set(leftRectangle1, topRectangle1, rightRectangle1, bottomRectangle1); 

       Rect rectangle2 = new Rect();//Setting the position of the rectangle 2 
       rectangle2.set(leftRectangle2, topRectangle2, rightRectangle2, bottomRectangle2); 

       canvas.drawRect(rectangle1, paint);//Drawing the rectangles 
       canvas.drawRect(rectangle2, paint); 

       Bitmap cross = BitmapFactory.decodeResource(getResources(), R.drawable.animation);//Creating the image which is going to go up and down 
       canvas.drawBitmap(cross, canvas.getWidth()/2 - cross.getWidth()/2, crossY, paint); 

       if (crossGoesUp) {//If the crossGoesUp is true, that means the user last touch was in the rectangle 2, so the image goes up 
        if (crossY < -cross.getHeight())//Tests if the image isn't out of bounds 
         crossY = canvas.getHeight() + cross.getHeight(); 
        crossY -= 5; 
       } else { 
        if (crossY > canvas.getHeight() + cross.getHeight())//Same as above 
         crossY = -cross.getHeight(); 
        crossY += 5; 
       } 

       holder.unlockCanvasAndPost(canvas); 
      } 
     } 
    } 
    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 

     resume(); 
    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, 
           int height) { 

    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 

     pause(); 
    } 

} 
+0

Вы только добавили обратный вызов и изменили значение альфа-краски, верно? Если это так, это не сработало, оно продолжает давать мне ту же ошибку. – WillGarden

+0

Я тестирую, я действительно работаю, я также перемещаю резюме, останавливаюсь и меняю больше вещей ... копируем его по твоему и проверяем его –

+0

резюме, пауза не должна вызываться из действия только с поверхности. Создание, sufaceDestroyed –

0
someActivity.runOnUiThread(new Runnable() { 
    @Override 
    public void run() { 
     //Your code to run in GUI thread here 
    }//public void run() { 
}); 

Я надеюсь, что это поможет.

0

мне удалось figger его сам, проблема была в этом блоке кода:

if (holder.getSurface().isValid())//Tests if the surface is valid, if it is not it won't do anything until it 
    continue; 

я забыл поставить восклицательный знак, так что приложение только сделал то, что было ниже, когда поверхность не была valid и он дал мне исключение NullPointerException. Спасибо, в любом случае.