2012-03-30 12 views
0

Nun, ich werde versuchen, genau zu erklären, was ich so tun:Multi-Threading in der gleichen Leinwand

ich eine Bitmap in einer Leinwand in zufälligen Positionen entsprechend den Koordinaten des Bildschirms auf Touch zeichnen möchten, und Ich möchte, dass eine Nachricht (Text) immer dann angezeigt wird, wenn der Benutzer den Bildschirm berührt.

Also, wenn ein Text im selben Thread als ich für die Bitmap, wird es erscheinen und verschwinden direkt danach, und ich will es auf dem Bildschirm bleiben für ein paar Sekunden und die verschwinden. Meine erste Idee war es, Thread.sleep() zu benutzen, aber dafür muss ich nur einen Thread für den Text erstellen, oder ich werde mich auch mit der Bitmap anlegen.

Ich habe versucht, Multithreading in der gleichen Leinwand zu verwenden, aber ich weiß nicht wie. Kann mir bitte jemand erklären ...

, dass einige der Code ist die ich bisher habe:

private void init() { 
     // CREATE SURFACEHOLDER AND ADD THIS CLASS AS HIS CALLBACK 
     enemyHolder = getHolder(); 
     enemyHolder.addCallback(this); 

     scoreHolder = getHolder(); 
     scoreHolder.addCallback(this); 

     hasSurface = false; 

    } 

public void resume() {

 if (surfaceViewThread == null) { 
      surfaceViewThread = new SurfaceViewThread(); // CREATE A NEW 
                  // THREAD 
      if (hasSurface) 
       surfaceViewThread.start(); // START OUR THREAD 
     } 

     if (secondThread == null) { 
      secondThread = new SecondThread(); 

      if (hasSurface) 
       secondThread.start(); 
     } 

    } 



public void surfaceCreated(SurfaceHolder holder) { 
     hasSurface = true; 

     if (surfaceViewThread != null) 
      surfaceViewThread.start(); 

     if (scoreShow == 1) { 

      if (secondThread != null) 
       secondThread.start(); 
     } 
    } 

// THREAD

private final class SurfaceViewThread extends Thread { 
     private boolean done; 

     SurfaceViewThread() { 
      super(); 
      done = false; 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      super.run(); 
      SurfaceHolder surfaceHolder = enemyHolder; 

      while (!done) { 

       Canvas canvas = surfaceHolder.lockCanvas(); 

       canvas.drawColor(Color.WHITE); 

       canvas.drawBitmap(enemy1, enemy1X, enemy1Y, null); // DRAW 
                    // FIRST 
                    // ENEMY 




    // SECOND THREAD 

    private final class SecondThread extends Thread { 
     private boolean done; 

     SecondThread() { 
      super(); 
      done = false; 
     } 

     @Override 
     public void run() { 
      // TODO Auto-generated method stub 
      super.run(); 
      SurfaceHolder surfaceHolder = scoreHolder; 

      while (!done) { 

       Canvas canvas = surfaceHolder.lockCanvas(); 

       Paint paint = new Paint(); 
       paint.setColor(Color.BLACK); 

       canvas.drawText("xD", 50, 50, paint); 

       surfaceHolder.unlockCanvasAndPost(canvas); 

       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 

       scoreShow = 0; 

      } 

     } 

Antwort

0

Hier einige unvollständige Pseudo-Code zu tun, was Sie beschrieben haben. Es gibt viele gute Beispiele für jedes dieser Elemente, die Ihnen helfen, die Lücken zu füllen.

public class MyCustomView extends View { 

    int touchPointX; 
    int touchPointY; 

    private String mText; 

    public MyCustomView(Context context) { 

     // do initialisation stuff 

    } 

    public setText(String text){ 
     mText = text; 
     this.invalidate(); 
    } 

    @Override 
    public void onDraw(Canvas canvas) { 

     canvas.save(); 

     super.onDraw(canvas); 

     canvas.drawBitmap(touchPointX, touchPointY, bitmap) 

     if (!mText.equals(""){ 
      canvas.drawText(touchPointX, touchPointY + 10, mText) 
     } 

     canvas.restore(); 
    } 

} 

public class MyActivity extends Activity implements OnTouchListener{ 

    private Handler mHandler = new Handler(); 
    private MyCustomView mCustomView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
      mCustomView = (MyCustomView) findViewById(r.id.myCustomView); 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent rawEvent) { 

      // get x and y of touch 
      mCustomview.touchPointX = x; 
      mCustomview.touchPointY = y; 
      mCustomView.setText("Screen touched"); 

      // clear the text after 5 seconds 
      mHandler.postDelayed(clearText, 5000); 


      // redraw the view 
      mCustomView.invalidate(); 

    } 

    private void clearText(){mCustomView.setText("");} 

} 
+0

Danke für diese Antwort. Sieht jetzt viel klarer aus, aber sollte die ClearText-Methode kein Runable sein? – Kevin04PT

+0

@Simon Bearbeiten Sie in Zukunft Ihre vorhandene Antwort, anstatt eine neue zu veröffentlichen. Sie könnten jetzt die Up-Abstimmung verlieren, die Sie bei der anderen Antwort erhalten haben, wenn sie kombiniert werden. –

1

Benötigen Sie eine SurfaceView? Es scheint wie eine harte Arbeit, Dinge zu tun.

Ich habe gerade etwas Ähnliches getan, indem ich eine benutzerdefinierte Ansichtsklasse erstellt und die onDraw-Methode überschrieben habe. Dann benutze canvas.save() und canvas.restore(). Hier sind die relevanten Teile meiner onDraw.

Die Lichter werden durch einen separaten Thread in der Aktivität, die die Ansicht aufgebläht hat, ein- und ausgeschaltet. Sie bleiben auf dem Bildschirm, solange sie eingeschaltet sind.

Prost

+0

Ich dachte, es wäre der beste Weg, etwas zu tun, da es eine Interaktion mit dem Benutzer gibt ... Also könnte ich einfach eine andere onDraw-Methode für die Bitmap und den Text verwenden ...? – Kevin04PT

+0

Sicher. Sie können alles auf der Leinwand zeichnen. Siehe die Canvas-Dokumentation. Schau dir die Draw * -Methoden an. http://developer.android.com/reference/android/graphics/Canvas.html – Simon

+0

Yep, ich habe gerade versucht, was du gesagt hast, aber es zeichnet einmal, aber ich brauche es ständig ein neues Bitmap zu zeichnen, seit dem Koordinaten ändern sich zufällig ... Oder fehlt mir etwas? * Entschuldigung, ich bin neu dazu ... – Kevin04PT