2010-07-06 3 views
0

La fonction ci-dessous fait partie du code pour l'application Appareil photo de Google. Je n'ai pas compris la logique des déclarations en gras. S'il vous plaît aider.Besoin d'aide pour interpréter le code de Google pour l'application Appareil photo Android

int secondes = intention.getIntExtra (MediaStore.EXTRA_DURATION_LIMIT, 0); mMaxVideoDurationInMs = 1000 * secondes;

mMediaRecorder.setMaxDuration (mMaxVideoDurationInMs);

// cette fonction est de mettre à jour la durée d'enregistrement

updateRecordingTime private void() { if (mMediaRecorderRecording!) { de retour; } depuis longtemps maintenant = SystemClock.uptimeMillis(); long delta = maintenant - mRecordingStartTime;

// Starting a minute before reaching the max duration 
    // limit, we'll countdown the remaining time instead. 
    boolean countdownRemainingTime = (mMaxVideoDurationInMs != 0 
      && delta >= mMaxVideoDurationInMs - 60000); 

    long next_update_delay = 1000 - (delta % 1000); 
    long seconds; 
    if (countdownRemainingTime) { 
     **delta = Math.max(0, mMaxVideoDurationInMs - delta); 
     seconds = (delta + 999)/1000;** 
    } else { 
     **seconds = delta/1000; // round to nearest** 
    } 

    long minutes = seconds/60; 
    long hours = minutes/60; 
    long remainderMinutes = minutes - (hours * 60); 
    long remainderSeconds = seconds - (minutes * 60); 

    String secondsString = Long.toString(remainderSeconds); 
    if (secondsString.length() < 2) { 
     secondsString = "0" + secondsString; 
    } 
    String minutesString = Long.toString(remainderMinutes); 
    if (minutesString.length() < 2) { 
     minutesString = "0" + minutesString; 
    } 
    String text = minutesString + ":" + secondsString; 
    if (hours > 0) { 
     String hoursString = Long.toString(hours); 
     if (hoursString.length() < 2) { 
      hoursString = "0" + hoursString; 
     } 
     text = hoursString + ":" + text; 
    } 
    mRecordingTimeView.setText(text); 

    if (mRecordingTimeCountsDown != countdownRemainingTime) { 
     // Avoid setting the color on every update, do it only 
     // when it needs changing. 
     mRecordingTimeCountsDown = countdownRemainingTime; 

     int color = getResources().getColor(countdownRemainingTime 
       ? R.color.recording_time_remaining_text 
       : R.color.recording_time_elapsed_text); 

     mRecordingTimeView.setTextColor(color); 
    } 

    // Work around a limitation of the T-Mobile G1: The T-Mobile 
    // hardware blitter can't pixel-accurately scale and clip at the 
    // same time, and the SurfaceFlinger doesn't attempt to work around 
    // this limitation. In order to avoid visual corruption we must 
    // manually refresh the entire surface view when changing any 
    // overlapping view's contents. 
    mVideoPreview.invalidate(); 
    mHandler.sendEmptyMessageDelayed(
      UPDATE_RECORD_TIME, next_update_delay); 
} 

Répondre

1

Faites-vous référence à ces lignes?

1.  delta = Math.max(0, mMaxVideoDurationInMs - delta); 
2.  seconds = (delta + 999)/1000; 

et

3.  seconds = delta/1000; // round to nearest 

Il est difficile de dire exactement, comme rien était gras dans votre question (mais le ** avant et après ces lignes me fait penser que est ce que vous faites référence).

delta est en millisecondes, dont 1000 en une seconde.

Ligne 1: assure une 0 apparaît à la place d'un nombre négatif

Ligne 2: arrondit à la seconde près. Puisque seconds est un nombre entier, toute valeur de delta de 1001 (1s 1ms) à 1999 (1s, 999ms) serait retournée comme seconds = 2.

Ligne 3: gouttes simplement la partie ms, donc delta = 1 retours 0, mais le fait delta = 999. Delta signifie "changer dans" comme dans la quantité de changement d'heure.


Les deux sont presque les mêmes, mais lorsque le code affiche les secondes restantes, il choisit d'arrondir de sorte que, par exemple, le code affiche les secondes restantes. 1.5s (1500ms) restants est affiché en 1 seconde. Quand il compte des secondes écoulées, il arrondit vers le bas, de sorte que, par ex. 1.5s (1500ms) écoulé est affiché en 1s.

Étant donné que secondes est un entier, tout nombre à virgule flottante aura la partie décimale coupée. Alors:

1500/1000 = 1.500 
(int)1.500 = 1 

Lorsque vous ajoutez le 999 vous avez la place:

(1500 + 999)/1000 = 2499/1000 = 2.499 
(int)2.499 = 2 
+0

Oui ce sont les lignes dont je parlais to.Thank vous. Mais, je n'ai pas vraiment compris 'delta'. et quelle est la différence entre la ligne 2 et 3? dans la ligne 2, le ms se fait larguer n'est-ce pas? Quel est le besoin de la ligne 3? – Namratha

+0

J'ai mis à jour la réponse (puisque le formatage est plus facile dans la partie réponse). Est ce que ça aide? – mbafford

+0

compte à rebours booléenRemainingTime = (mMaxVideoDurationInMs! = 0 && delta> = mMaxVideoDurationInMs - 60000); Pourriez-vous expliquer cette ligne s'il vous plaît? – Namratha

Questions connexes