2012-03-30 3 views
0

Ну, я попытаюсь объяснить, что я притворяюсь:Многопоточность в том же холсте

Я хочу нарисовать битмап в холст в произвольной позиции по координатам экрана на ощупь, и Я хочу, чтобы сообщение (текст) отображалось каждый раз, когда пользователь прикасается к экрану.

Итак, если вы рисуете текст в том же потоке, что и для растрового изображения, он появится и исчезнет сразу после него, и я хочу, чтобы он оставался на экране в течение нескольких секунд и исчез. Моя первая идея состояла в том, чтобы использовать Thread.sleep(), но для этого мне нужно создать поток только для текста, иначе я тоже буду работать с Bitmap.

Я пытался использовать многопоточность в одном холсте, но я не знаю, как это сделать. Может кто-то пожалуйста, объясните мне ...

Вот некоторые из кода я получил до сих пор:

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

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

     hasSurface = false; 

    } 

общественного недействительными резюме() {

 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(); 
     } 
    } 

// НИТИ

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; 

      } 

     } 

ответ

0

Вот некоторый неполный псевдокод делать то, что вы описали. Для каждого из этих элементов есть много хороших примеров, которые помогут вам заполнить пробелы.

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

Спасибо за этот ответ. Выглядит намного понятнее, но не должен ли метод clearText быть Runnable? – Kevin04PT

+0

@Simon В будущем отредактируйте существующий ответ вместо публикации нового. Теперь вы можете потерять голосование, которое вы получили по другому ответу, когда они объединены. –

1

Нужно ли использовать SurfaceView? Это похоже на тяжелый труд.

Я только что сделал что-то подобное, создав собственный класс вида и переопределив метод onDraw. Затем используйте canvas.save() и canvas.restore(). Вот соответствующие биты моего onDraw.

@Override 
public void onDraw(Canvas canvas) { 

    canvas.save(); 

    // scale the canvas 
    canvas.scale(scaleFactor, scaleFactor); //, mid.x, mid.y); 

    // and translate... 
    canvas.translate(translateX/scaleFactor, translateY/scaleFactor); 

    super.onDraw(canvas); 

    // draw the lights 
    for(Light light:lights){ 
     if (light.isOn){ 
      canvas.drawCircle(light.getX(),light.getY(), light.getDiameter()/scaleFactor,light.paint); 
     } 
    } 

    canvas.restore(); 
} 

Огни включаются и выключаются отдельной нитью назад в деятельности, которая завысила вид. Они остаются на экране, пока они работают.

Приветствие

+0

Я думал, что это лучший способ сделать что-то, поскольку есть некоторое взаимодействие с пользователем ... Итак, я мог бы просто использовать другой метод onDraw для растрового изображения и текста ...? – Kevin04PT

+0

Несомненно. Вы можете нарисовать что-нибудь на холсте. См. Документацию Canvas. Взгляните на методы рисования *. http://developer.android.com/reference/android/graphics/Canvas.html – Simon

+0

Да, я просто попробовал то, что вы сказали, но он рисует один раз, но мне нужно, чтобы он постоянно рисовал новое растровое изображение, поскольку координаты случайным образом меняются ... Или я что-то упускаю? * Извините, я новичок в этом ... – Kevin04PT

Смежные вопросы