2011-12-03 11 views
5

Ho un testo lungo e una dimensione di testo fissa. Come può mostrare il testo pagina per pagina? Gli utenti interagiranno con il programma in questo modo: Si sposta verso sinistra o destra per passare alla pagina successiva o precedente.Come pagina un lungo testo?

Attualmente, creo un PageManager per eseguire questo lavoro. Ma è molto limitato. Il codice di base per elaborare il testo è:

while (true) { 
     newLineIndex = TextUtils.indexOf(content, '\n', processIndex); 
     if (newLineIndex == -1) {// till the end of content 
      charCount = paint.breakText(content, processIndex, content.length(), false, leftLines * lineWidth, width); 
     } else { 
      charCount = paint.breakText(content, processIndex, ++newLineIndex, false, leftLines * lineWidth, width); 
     } 

     leftLines = (int) ((leftLines * lineWidth - width[0])/lineWidth); 
     processIndex += charCount; 

     if (leftLines < 1 || processIndex >= content.length()) { 
      page = new Page(); 
      page.endIndex = processIndex; 
      page.startIndex = pageBaseLine; 
      page.content = content.subSequence(page.startIndex, page.endIndex); 
      result.add(page); 
      pageBaseLine = processIndex; 

      leftLines = lineNumber; 
     } 

     if (processIndex >= content.length()) { 
      break; 
     } 
    } 

La limitazione è la pagina può troncare il testo come

|A lon| 
|g wor| 
|d man| 

// una parola lunga uomo

o incorrec linee a causa di word wrapping :

// Pagina manager calcola questo (2 linee):

|a sentence with loooooooo| 

|ooong word abcdefghijklmn| 

// Ma in realtà in modalità testo (3 linee):

|a sentence with   | 

|looooooooooong word  | 

|abcdefghijklmn   | 

Così il numero di riga finale è più di calcolo. Quindi il mio gestore di pagine è stupido. Qualcuno mi aiuterebbe? Grazie!

+0

Poiché si tratta di un algoritmo domanda correlata, forse dovresti prendere in considerazione la possibilità di postarla in http://programmers.stackexchange.com/ –

+0

Vedere la mia risposta qui http://stackoverflow.com/questions/20204348/how-to-break-styled-text-into-pages -in-android – mixel

risposta

5

Potrebbe essere troppo tardi per rispondere, ma posterò come ho risolto un problema come questo.

Ho realizzato un progetto simile, ma per tablet Android. Nella mia applicazione, ho la barra di fondo del sistema, la mia barra di navigazione e l'intestazione. Queste parti di attività non prendono parte all'anteprima del testo, quindi voglio escluderle nei calcoli. Per lo schermo 750px queste parti occupano il 24% dello schermo, sono circa 180px. Quindi io uso il seguente algoritmo per visualizzare il testo in modalità testo:

  1. Calcolare effettiva altezza per visualizzare il testo, è all'altezza del mio TextView: ScreenHeight - ScreenHeight * 0,24
  2. Set la dimensione del testo, ad esempio 14,0
  3. Calcola di righe nel file di testo
  4. numero Calcolare di righe per pagina: dimensione reale altezza/testo
  5. numero
  6. Calcolare di pagine e caricarli in HashMap

Display display = getWindowManager().getDefaultDisplay(); 
int width = display.getWidth(); 
int height = display.getHeight() — 0.24*display.getHeight(); 
mLinesInPage = (int) (Math.floor(height/mTextSize)); 
mPages = (int) (Math.ceil(mLinesInText/mLinesInPage)); 

formattazione e altre trasformazioni esegue "al volo". Niente di difficile, ma funziona per me.Ci sono esempi

Prima di utilizzare l'algoritmo:

enter image description here

Dopo aver utilizzato l'algoritmo:

enter image description here

enter image description here

+0

@ henry-sou Potresti accettare la risposta? – Sigrlami

+1

Ho lo stesso problema, ma non capisco come il tuo codice risolva un problema ... Forse perché non capisco come calcoli 'mLinesInText'. Puoi spiegare un po 'di più per favore @Sigrlami –

+0

@ kort.es Puoi ottenere * mLinesInText * leggendo il testo del buco e contando il delimitatore di nuova riga * "\ n" *. Ovviamente, se riformattate il testo in qualche modo, anche questo parametro dovrebbe essere ricalcolato. – Sigrlami

Problemi correlati