2011-12-03 27 views
5

Tôi có văn bản dài và kích thước văn bản cố định. Làm cách nào để hiển thị trang văn bản theo trang? Người dùng sẽ tương tác với chương trình theo cách này: Anh vuốt sang trái hoặc phải để chuyển sang trang tiếp theo hoặc trang trước.Làm cách nào để trang văn bản dài?

Hiện tại, tôi tạo Trình quản lý trang để thực hiện công việc này. Nhưng nó rất hạn chế. Các mã lõi để xử lý văn bản là:

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

Hạn chế là trang có thể cắt ngắn văn bản như

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

// một từ lâu người đàn ông

hoặc incorrec dòng do chế độ ngắt dòng :

// Trình quản lý trang tính toán (2 dòng):

|a sentence with loooooooo| 

|ooong word abcdefghijklmn| 

// Nhưng trên thực tế theo quan điểm của văn bản (3 lines):

|a sentence with   | 

|looooooooooong word  | 

|abcdefghijklmn   | 

Vì vậy, số lượng dòng cuối cùng là hơn tính toán. Vì vậy, quản lý trang của tôi là ngu ngốc. Có ai giúp tôi không? cảm ơn!

+0

Vì nó là một thuật toán câu hỏi liên quan, có thể bạn nên xem xét đăng nó trong http://programmers.stackexchange.com/ –

+0

Xem câu trả lời của tôi ở đây http://stackoverflow.com/questions/20204348/how-to-break-styled-text-into-pages -in-android – mixel

Trả lời

5

Có thể đã quá muộn để trả lời, nhưng tôi sẽ đăng cách tôi giải quyết vấn đề như thế này.

Tôi đã thực hiện dự án tương tự, nhưng dành cho máy tính bảng Android. Trong ứng dụng của tôi, tôi có thanh đáy hệ thống, thanh điều hướng và tiêu đề của tôi. Các phần Hoạt động này không tham gia vào phần xem trước văn bản, vì vậy tôi muốn loại trừ chúng trong các phép tính. Đối với màn hình 750px, các bộ phận này chiếm 24% màn hình, khoảng 180px. Vì vậy, tôi sử dụng các thuật toán sau để xem văn bản trong quan điểm của văn bản:

  1. Tính thực tế chiều cao để xem văn bản, đó là chiều cao của TextView tôi: ScreenHeight - ScreenHeight * 0.24
  2. Đặt kích thước văn bản, ví dụ 14.0
  3. Tính số các dòng trong tập tin văn bản
  4. Tính số dòng mỗi trang: thực tế kích thước chiều cao/văn bản
  5. số
  6. Tính trang và tải chúng trong 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)); 

Formatting và biến đổi khác thực hiện "on the fly". Không có gì khó khăn, nhưng làm việc cho tôi.Có những ví dụ

Trước khi sử dụng thuật toán:

enter image description here

Sau khi sử dụng thuật toán:

enter image description here

enter image description here

+0

@ henry-sou Bạn có thể chấp nhận câu trả lời không? – Sigrlami

+1

Tôi có cùng một vấn đề, nhưng tôi không thể hiểu làm thế nào mã của bạn được giải quyết một vấn đề ... Có lẽ nó bởi vì tôi không nhận được cách bạn tính toán 'mLinesInText'. Bạn có thể giải thích thêm một chút được không @Sigrlami –

+0

@ kort.es Bạn có thể lấy * mLinesInText * bằng cách đọc văn bản lỗ và đếm dấu phân cách dòng mới * "\ n" *. Ofcourse, nếu bạn định dạng lại văn bản theo một cách nào đó, tham số này cũng nên được tính toán lại. – Sigrlami

Các vấn đề liên quan