Многопоточность в том же Canvas - PullRequest
0 голосов
/ 30 марта 2012

Хорошо, я попытаюсь объяснить, что именно я притворяюсь:

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

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

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

Вот часть кода, который у меня есть:

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

// РЕЗЬБА

    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;

            }

        }

Ответы [ 2 ]

1 голос
/ 30 марта 2012

Вам нужно использовать 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 голосов
/ 30 марта 2012

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

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

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...