2011-12-31 34 views
55

Tại sao textView không hiển thị?Tại sao không setVisibility hoạt động sau khi chế độ xem được làm động?

Đây là xml bố trí của tôi:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TextView 
    android:id="@+id/tvRotate" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Rotate Me" 
/> 
</LinearLayout> 

..và đây là hoạt động của tôi:

public class RotateMeActivity extends Activity 
{ 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     TextView tvRotate = (TextView) findViewById(R.id.tvRotate); 

     RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
     r.setDuration(0); 
     r.setFillAfter(true); 
     tvRotate.startAnimation(r); 
     tvRotate.setVisibility(View.INVISIBLE); 
    } 
} 

Mục tiêu của tôi là để xoay một cái nhìn và sau đó có thể để ẩn và hiển thị nó trong mã bằng cách đặt setVisibility. Các công trình sau đây, nhưng setRotation chỉ có trong API Cấp 11. Tôi cần một cách để làm điều đó trong API Cấp 10.

tvRotate.setRotation(180);//instead of the RotateAnimation, only works in API Level 11 
tvRotate.setVisibility(View.INVISIBLE); 

Trả lời

18

Tất cả các hình ảnh động (trước android 3.0) đang thực sự áp dụng cho một bitmap mà là một ảnh chụp nhanh chế độ xem của bạn thay vì trên chế độ xem gốc. Khi bạn đang thiết lập điền sau khi sự thật này thực sự có nghĩa là bitmap sẽ tiếp tục được hiển thị trên màn hình thay vì xem của bạn. Đây là lý do tại sao mức độ hiển thị sẽ không thay đổi khi sử dụng setVisibility và cũng là lý do khiến chế độ xem của bạn sẽ không nhận được sự kiện chạm trong giới hạn mới (xoay vòng). (nhưng kể từ khi bạn đang xoay trên 180 độ đó không phải là một vấn đề).

+1

vì vậy, có cách nào để ẩn b itmap mà vẫn tồn tại sau khi xoay? – ZippyFerguson

+0

cùng một vấn đề ... – SunnySonic

1

Tôi đã yêu cầu cấp API 11 và sử dụng setRotation để thực hiện việc này. Điều này có vẻ như một yêu cầu khá đơn giản mà không thể được thực hiện trước Honeycomb mặc dù. Tất cả tôi muốn làm là xoay một nút và sau đó ẩn/hiển thị nó.

1

Tôi đã đưa ra giải pháp cho điều này: về cơ bản ngay trước khi bạn gọi setVisibility (View.GONE), thực hiện hoạt ảnh với duration = 0 setFillAfter (false) và có góc từ/đến đặt góc quay hiện tại .

Thao tác này sẽ xóa bitmap setFillAfter và cho phép chế độ xem biến mất.

7

Cách khác để giải quyết vấn đề này là bọc chế độ xem động của bạn ở chế độ xem khác và đặt chế độ hiển thị của chế độ xem trình bao bọc đó.

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 
    <FrameLayout 
     android:id="@+id/animationHoldingFrame" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
     <TextView 
      android:id="@+id/tvRotate" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Rotate Me" 
     /> 
    </FrameLayout> 
</LinearLayout> 

Và mã sau đó trở thành này:

TextView tvRotate = (TextView) findViewById(R.id.tvRotate); 
FrameLayout animationContainer = (FrameLayout)findViewById(R.id.animationHoldingFrame) 

RotateAnimation r = new RotateAnimation(0, 180, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f); 
r.setDuration(0); 
r.setFillAfter(true); 
tvRotate.startAnimation(r); 
animationContainer.setVisibility(View.INVISIBLE); 
+0

Chính xác những gì tôi đang tìm kiếm :-) – Couitchy

151

Đối với tôi gọi clearAnimation của View cố định vấn đề. Trong trường hợp của tôi, tôi muốn đặt View trở lại vị trí ban đầu của nó sau khi thực hiện một bản dịch với fillAfter set thành true.

+6

Tôi đã gặp sự cố này và có thể xác nhận rằng clearAnimation thực hiện thủ thuật. –

+0

xin vui lòng ai đó chấp nhận câu trả lời này vì đó là một trong đó tiết kiệm của bạn một ** sau DAYS đấu tranh;) thx! –

+4

Tôi xác nhận rằng điều này khắc phục được sự cố.Để sử dụng nó hữu ích hơn trong 'onAnimationEnd()' trong 'AnimationListener';) – czaku

5

Sử dụng này trước khi setVisibility sau khi hình ảnh động được hoàn thành:

anim.reverse(); 
anim.removeAllListeners(); 
anim.end(); 
anim.cancel(); 

nơi anim là ObjectAnimator bạn

nhưng nếu bạn đang sử dụng lớp Animation, sau đó chỉ cần làm:

view.clearAnimation(); 

trên chế độ xem hoạt ảnh nào được thực hiện

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