2011-12-03 15 views
5

Mam długi tekst i stały rozmiar textView. Jak wyświetlić stronę tekstową? Użytkownicy będą interaktywni z programem w ten sposób: Przesuwa palcem w lewo lub w prawo, aby przejść do następnej lub poprzedniej strony.Jak wstawić długi tekst?

Obecnie tworzę stronę PageManager, aby wykonać to zadanie. Ale jest bardzo ograniczony. Kod podstawowy do przetwarzania tekstu jest:

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

Ograniczeniem jest tu strona może obciąć tekst jak

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

// długim słowem człowieka

lub incorrec linii powodu opakowania słowo :

// Strona Menedżer oblicza ten (2 linie):

|a sentence with loooooooo| 

|ooong word abcdefghijklmn| 

// Ale faktycznie w widoku tekstowym (3 linie):

|a sentence with   | 

|looooooooooong word  | 

|abcdefghijklmn   | 

więc ostateczna liczba linii jest więcej niż obliczenia. Więc mój kierownik strony jest głupi. Czy ktoś mi pomoże? dzięki!

+0

Ponieważ jest to algorytm powiązane pytanie, może powinieneś rozważyć opublikowanie go w http://programmers.stackexchange.com/ –

+0

Zobacz moją odpowiedź tutaj http://stackoverflow.com/questions/20204348/how-to-break-styled-text-into-pages -in-android – mixel

Odpowiedz

5

Może być za późno na odpowiedź, ale opiszę, jak rozwiązałem taki problem.

Zrobiłem podobny projekt, ale dla tabletu z Androidem. W mojej aplikacji mam dolny pasek systemu, pasek nawigacyjny i nagłówek. Te części działania nie biorą udziału w podglądzie tekstu, więc chcę je wykluczyć w obliczeniach. W przypadku ekranu 750px te części zajmują 24% ekranu, a to około 180 pikseli. Więc użyć następującego algorytmu do wyświetlenia tekstu w widoku tekstu:

  1. Oblicz rzeczywistej wysokości aby zobaczyć tekst, to wysokość mojego TextView: ScreenHeight - ScreenHeight * 0,24
  2. Ustaw rozmiar tekstu, na przykład 14,0
  3. Oblicz ilość linii w pliku tekstowym
  4. Oblicz ilość wierszy na stronie: rzeczywisty rozmiar wysokość/tekst
  5. numer
  6. Oblicz stron i załadować je w 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)); 

Formatowanie i inne transformacje wykonywany "w locie". Nic trudnego, ale działa dla mnie.Istnieją przykłady

Przed użyciem algorytmu:

enter image description here

Po użyciu algorytmu:

enter image description here

enter image description here

+0

@ henry-sou Czy możesz przyjąć odpowiedź? – Sigrlami

+1

Mam ten sam problem, ale nie mogę zrozumieć, jak twój kod rozwiązuje problem ... Może dlatego, że nie rozumiem, jak obliczyć "mLinesInText". Czy możesz wyjaśnić nieco więcej, proszę @Sigrlami –

+0

@ kort.es Możesz otrzymać * mLinesInText * czytając tekst otworu i zliczając separator nowej linii * "\ n" *. Oczywiście, jeśli ponownie sformatujesz tekst, ten parametr również powinien zostać ponownie obliczony. – Sigrlami

Powiązane problemy