2016-12-11 88 views
0

一切工作正常,除了TextViewEditText,只有在相機火炬停止閃爍後纔會更新。該程序應該在摩爾斯電碼中閃爍(它確實會)突出顯示該文本,因爲它接近該字母並以莫爾斯電碼顯示當前字母。當for循環完成而不是多次時,EditText和Text View只更新一次

public class TextFlashActivity extends AppCompatActivity { 

private TextView textView; 
private String morseString; 
private String text; 
private String iLearnedWhatImmutableMeans; 
private EditText editText; 
public static HashMap morseCode; 
public static Camera cam = null; 
public static Camera.Parameters parameters = null; 
public static Boolean isLightOn = false; 
private Button button; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.text_flash_layout); 
    init(); 
    button = (Button) findViewById(R.id.Button_flash); 
    button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      morseTextFlash(); 
     } 
    }); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    cam.release(); 
} 


private void morseTextFlash() { 

    text = editText.getText().toString(); 
    Spannable WordtoSpan = new SpannableString(text); 
    iLearnedWhatImmutableMeans = text.toLowerCase(); 
    for (int i = 0; i < text.length(); i++) { 
     WordtoSpan.setSpan(new ForegroundColorSpan(Color.RED), 0, i + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); 
     editText.setText(WordtoSpan); 
     textView.setText((String) morseCode.get(iLearnedWhatImmutableMeans.charAt(i))); 
     if (iLearnedWhatImmutableMeans.charAt(i) != ' ') 
      morseString = (String) morseCode.get(iLearnedWhatImmutableMeans.charAt(i)); 
     for (int j = 0; j < morseString.length(); j++) { 
      try { 
       Thread.sleep(1000); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
      if (morseString.charAt(j) == '.') { 
       try { 
        flashSwitch(); 
        Thread.sleep(100); 
        flashSwitch(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } else { 
       try { 
        flashSwitch(); 
        Thread.sleep(400); 
        flashSwitch(); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
      } 
     } 
    } 
} 

private void init() { 
    textView = (TextView) findViewById(R.id.TV_flash); 
    editText = (EditText) findViewById(R.id.ET_flash); 
    cam = Camera.open(); 
    parameters = cam.getParameters(); 
    cam.startPreview(); 
    hashMapInit(); 
} 


private void flashSwitch() { 
    if (isLightOn) { 
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_OFF); 
     cam.setParameters(parameters); 
     isLightOn = false; 
    } else { 
     parameters.setFlashMode(Camera.Parameters.FLASH_MODE_TORCH); 
     cam.setParameters(parameters); 
     isLightOn = true; 
    } 
} 


private void hashMapInit() { 
    morseCode = new HashMap<Character, String>(); 
    morseCode.put('a', ".-"); 
    morseCode.put('b', "-..."); 
    morseCode.put('c', "-.-"); 
    morseCode.put('d', "-.."); 
    morseCode.put('e', "."); 
    morseCode.put('f', "..-."); 
    morseCode.put('g', "--."); 
    morseCode.put('h', "...."); 
    morseCode.put('i', ".."); 
    morseCode.put('j', ".---"); 
    morseCode.put('k', "-."); 
    morseCode.put('l', ".-.."); 
    morseCode.put('m', "--"); 
    morseCode.put('n', "-."); 
    morseCode.put('o', "---"); 
    morseCode.put('p', ".--."); 
    morseCode.put('q', "--.-"); 
    morseCode.put('r', ".-."); 
    morseCode.put('s', "..."); 
    morseCode.put('t', "-"); 
    morseCode.put('u', "..-"); 
    morseCode.put('v', "...-"); 
    morseCode.put('w', ".--"); 
    morseCode.put('x', "-..-"); 
    morseCode.put('y', "-.--"); 
    morseCode.put('z', "--.."); 
    morseCode.put('1', ".----"); 
    morseCode.put('2', "..---"); 
    morseCode.put('3', "...--"); 
    morseCode.put('4', "....-"); 
    morseCode.put('5', "....."); 
    morseCode.put('6', "-...."); 
    morseCode.put('7', "--..."); 
    morseCode.put('8', "---.."); 
    morseCode.put('9', "----."); 
    morseCode.put('0', "-----"); 
} 

}在main thread運行時

回答

0

切勿使用Thread.sleep,此塊屏幕上的任何用戶界面的變化,並使得應用程序無法響應觸摸。

您可以改用已內置在Android中的每查看Handler,像這樣:

editText.setText("hello"); 
editText.postDelayed(new Runnable() { 
     @Override 
     public void run() { 
      editText.setText("hello again"); 
      // schedule the next change here 
     } 
}, 1000); 

閱讀postDelayed這裏:https://developer.android.com/reference/android/view/View.html#postDelayed(java.lang.Runnable, long)