2013-09-09 2 views
0

У меня настоящие проблемы с работой с моей нитью. Проще говоря, я хочу, чтобы красный квадрат появлялся на экране, когда он касался и исчезал, когда ничто не касается экрана. Мне удалось заставить это работать.Остановка нити при возникновении ACTION_UP

Теперь я пытаюсь реализовать его так, чтобы при касании экрана появился красный квадрат, но затем он начинает двигаться к пальцу. Я думал, что сделаю это, если поток будет запущен, когда коснется экран, который обновит координаты X & Y. Я попробую это, как только я заставлю поток начать и остановить ACTION_DOWN и ACTION-UP.

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

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

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

package com.mr.mwood.thumbinput; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.Paint.Align; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 

public class MainActivity extends Activity { 
    boolean screenIsBeingTouched = false; 

    Thread th=new Thread(){ 
     @Override 
     public void run(){ 
      while (screenIsBeingTouched == true) { 
       try { 
        Thread.sleep(2000); 
        System.out.println("Thread is running "); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    }; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new SampleView(this)); 
    } 

    class SampleView extends SurfaceView { 

     int timer =0; 
     private final SurfaceHolder surfaceHolder; 
     private final Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 

     // CONSTRUCTOR 
     public SampleView(Context context) { 
      super(context); 
      surfaceHolder = getHolder(); 
      paint.setColor(Color.RED); 
      paint.setStrokeWidth(3); 
     } 

     @Override 
     public boolean onTouchEvent(MotionEvent event) { 

      switch (event.getAction()) { 
       case MotionEvent.ACTION_DOWN:{ 
        screenIsBeingTouched = true; 
        System.out.println("screenIsBeingTouched = true"); 
        Canvas canvas = surfaceHolder.lockCanvas(); 
        canvas.drawColor(Color.BLACK); 
        canvas.drawRect(30, 30, 80, 80, paint); 
        surfaceHolder.unlockCanvasAndPost(canvas); 
        th.start(); 
        break; 
       } 
       case MotionEvent.ACTION_UP:{ 
        screenIsBeingTouched = false; 
        System.out.println("screenIsBeingTouched = false"); 
        Canvas canvas = surfaceHolder.lockCanvas(); 
        canvas.drawColor(Color.BLACK); 
        surfaceHolder.unlockCanvasAndPost(canvas); 
        break; 
       } 
      } 

      return true; 
     } 

    } 
} 

ответ

1

просто обновить здесь и попробовать

@Override 
     public boolean onTouchEvent(MotionEvent event) { 

      //your code 

      return false; // UPDATE HERE 
     } 
+0

Вы никогда не увидите ACTION_MOVE или ACTION_UP, когда вы вернете false из onTouchEvent. – Mark

0

У меня есть несколько советов для вас:

  1. Вы не должны остановить нить подобное. Вы должны остановить поток с помощью th.interrupt(). Он будет вызывать InterruptedException, находясь в сон. Когда вы не спите, вы должны проверить isInterrupted() flag.
  2. Помните, что вы не сможете изменять какие-либо изменения в пользовательском интерфейсе из потока, отличного от потока пользовательского интерфейса. В конце концов вам придется опубликовать некоторые Runnable on Handler, которые будут обновлять пользовательский интерфейс. На самом деле вам не нужен этот другой поток. Вы можете решить все, только используя Handler.post + Handler.removeCallbacks.
Смежные вопросы