2013-06-13 26 views
16

Tôi có chế độ xem văn bản chứa một phần của văn bản. Khi người dùng nhấp vào mũi tên, chế độ xem văn bản sẽ thay đổi kích thước để văn bản đầy đủ được hiển thị. Xem những hình ảnh dưới đây cho một ví dụ: collapsedAnimate MaxLines and Ellipsize

expanded

Các TextView có chiều cao wrap_content, và khi sụp đổ một Maxlines = "4".

Các onClick của mũi tên chứa mã này:

 if (isExpanded) { 
      btnToggle.setImageDrawable(getResources().getDrawable(
        R.drawable.arrow_down)); 
      tvText.setMaxLines(4); 
      tvText.setEllipsize(TruncateAt.END); 
     } else { 
      btnToggle.setImageDrawable(getResources().getDrawable(
        R.drawable.arrow_up)); 
      tvText.setMaxLines(Integer.MAX_VALUE); 
      tvText.setEllipsize(null); 
     } 
     isExpanded = !isExpanded; 

Mã này hoạt động, nhưng nó không phải là hoạt hình. Tôi cần tạo hiệu ứng cho việc mở rộng, do đó, hoạt ảnh của TextView có chiều cao đầy đủ. Tôi không thể tìm thấy bất kỳ điều gì về các thuộc tính hoạt ảnh như MaxLines. Ai có thể giúp tôi?

Trả lời

46

Bạn có thể đạt được điều này bằng một ObjectAnimator

ObjectAnimator animation = ObjectAnimator.ofInt(
     tvText, 
     "maxLines", 
     25); 
animation.setDuration(4000); 
animation.start(); 

này sẽ làm tăng "Maxlines" tài sản của "tvText" TextView từ bất cứ điều gì ban đầu được thiết lập để, đến 25, trong giai đoạn 4000 mili giây.

Xem thêm herehere.

+1

Dường như hoạt động! Chỉ có 25 tác phẩm, Integer.MAX_VALUE không hoạt động. Nhưng tôi sẽ chỉ đặt giá trị đó lên 1000, sẽ không vượt quá mức đó :) Đáng giá tiền thưởng! – harmjanr

+2

@harmjanr Integer.MAX_VALUE hoạt động, nhưng bạn không chú ý đến hoạt ảnh vì nó xuất phát từ maxLines = 4 (hoặc bất kỳ số dòng mong muốn tối thiểu nào của bạn) thành maxLines = 2147483647 trong khoảng 4000ms. Một giải pháp lý tưởng là biết các dòng văn bản đầy đủ của bạn sẽ sử dụng trước khi hiển thị (http://stackoverflow.com/questions/15679147/how-to-get-line-count-of-textview-before-rendering) – Sanders

+0

Điều này chắc chắn hữu ích như vậy, cảm ơn bạn! Tuy nhiên, bất kỳ đề xuất nào nếu hoạt ảnh kết quả của chúng tôi bị thay đổi? Bố cục của tôi rất tốt có thể hơi nặng vì vậy tôi sẽ cố gắng cắt nó xuống nhưng khác hơn thế, bất kỳ suy nghĩ nào? –

4

Trong khi hoạt ảnh maxLines hoạt động, kết quả hơi bị thay đổi do chiều cao lượt xem của bạn nhảy rất nhiều.

int startHeight = content.getMeasuredHeight(); 
content.setMaxLines(Integer.MAX_VALUE); 
content.measure(
      View.MeasureSpec.makeMeasureSpec(parent.getWidth(), View.MeasureSpec.AT_MOST), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)); 
int endHeight = content.getMeasuredHeight(); 

content là một TextView với maxLines thiết lập để 2. Bây giờ bạn có thể làm động chiều cao TextView để thay thế. Chỉnh sửa: TextView cuộn khi không thể vừa với nội dung theo chiều dọc, bạn sẽ cần giải pháp. setMovementMethod(null) tắt tính năng cuộn, nhưng nó cũng vô hiệu hóa việc nhấp vào liên kết. Bởi vì Android.

1

Câu trả lời được chấp nhận về cơ bản là sai, vì nó buộc tiếng gọi của TextView.setMaxLines()nhiều lần với cùng một giá trị mà không cần lý do, làm cho kết quả hình ảnh động giật.

Bạn có thể sử dụng một ValueAnimator đơn giản với một lá cờ lastValue thay vì:

ValueAnimator animator = ValueAnimator.ofInt(fromThisLineCount, toThisLineCount).setDuration(250); 

    animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
     int lastValue = -1; 

     @Override 
     public void onAnimationUpdate(ValueAnimator animation) { 
      int value = (int) animation.getAnimatedValue(); 

      if (value == lastValue) { 
       return; 
      } 

      lastValue = value; 

      yourTextView.setMaxLines(value); 
     } 
    }); 

    animator.start(); 

Hãy nhớ rằng các hình ảnh động thêm/loại bỏ 1 toàn bộ dòng mỗi lần, vì vậy nó vẫn có thể nhìn giật nếu thời gian hoạt hình quá cao hoặc nếu nó chỉ ảnh hưởng đến một vài dòng. Cách tiếp cận tốt nhất là tạo Chế độ xem tùy chỉnh và thực hiện các phép đo thích hợp onMeasure (xem ví dụ: https://github.com/Manabu-GT/ExpandableTextView).

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