2013-08-05 36 views
53

Tôi có LinearLayout và ImageView bên trong LinearLayout này.Chế độ xem Android biến mất khi ra bên ngoài phụ huynh

Có hiệu ứng dịch cho ImageView.

// v = ImageView  
ObjectAnimator animation2 = ObjectAnimator.ofFloat(v, "translationY", 200); 
         animation2.setDuration(3000); 
         animation2.setTarget(v); 
         animation2.start(); 

Hoạt ảnh hoạt động nhưng nó biến mất khi ImageView đi ra ngoài LinearLayout.

Bạn có thể thấy vấn đề ở đây: http://screenr.com/zoAH

Làm thế nào tôi có thể sửa chữa nó mà không cần thay đổi chiều cao của LinearLayout.

Trả lời

72

Tìm nhóm xem mà ImageView thuộc về và áp dụng ViewGroup.setClipChildren(false). Theo mặc định, bản vẽ của trẻ em được giới hạn trong giới hạn của ViewGroup gốc.

+4

Thiết 'android LinearLayout của: clipChildren = "false" 'trên XML nhưng không thay đổi? – Eray

+47

Tôi đã đặt 'clipChildren =" false "' thành TẤT CẢ cha mẹ của ImageView (nghĩa là cha mẹ của LinearLayout). Và nó hoạt động. Cảm ơn bạn. – Eray

+2

Nếu chưa cuộn xuống, hãy xem câu trả lời của maxwell bên dưới. Đặt 'android: clipToPadding =" false "'. – Darpan

62

Hai thuộc tính tồn tại có thể gây ra điều này xảy ra: clipChildren và clipToPadding. Bạn sẽ cần phải đặt clipChildren thành false cho mỗi ViewGroup gốc có giới hạn đối tượng sẽ sinh ra. Bạn cũng cần phải đặt clipToPadding cho cha mẹ ngay lập tức (và có thể nhiều hơn, nhưng tôi chưa thấy một trường hợp nào cho nó).

Bạn có thể đặt cả thuộc tính trong XML

android:clipChildren="false" 
android:clipToPadding="false" 

hoặc trong mã

viewGroup.setClipChildren(false); 
viewGroup.setClipToPadding(false); 
+2

Tôi personnally đã phải thiết lập clipToPadding để sai trên tất cả các bậc cha mẹ quá. Kỳ dị. –

+5

'Mỗi nhóm ViewGroup của cha là chìa khóa! Cảm ơn câu trả lời này. –

+0

Điều này khá hữu ích. Cảm ơn bạn! –

1

Trong trường hợp clipChildren tôi đã không làm gì nhưng clipToPadding="false" cố định vấn đề. Đi con số.

11

Triển khai của tôi. Nó có lẽ có thể giúp ai đó:

public static void setAllParentsClip(View v, boolean enabled) { 
    while (v.getParent() != null && v.getParent() instanceof ViewGroup) { 
     ViewGroup viewGroup = (ViewGroup) v.getParent(); 
     viewGroup.setClipChildren(enabled); 
     viewGroup.setClipToPadding(enabled); 
     v = viewGroup; 
    } 
} 

gọi setAllParentsClip(yourView, false); để vô hiệu hóa clipping trong tất cả các bậc cha mẹ.

+2

Đẹp !! cảm ơn vì chia sẻ! –

0
try to update camera position as in my case below: 
ValueAnimator lockAnimator = ValueAnimator.ofFloat(1, 0);  // value from 0 to 1 
       lockAnimator.setDuration(500); 
       lockAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { 
        @Override 
        public void onAnimationUpdate(ValueAnimator pAnimation) { 
         float value = (Float) (pAnimation.getAnimatedValue()); 
         if (value < .6 && flipped) { 
          if (preview != null) 
           mCanvasImage.setImageBitmap(preview); 
          else 
           mCanvasImage.setImageBitmap(imageBitmap); 
          flipped = false; 
         } 
         if (value > .3 && value < .7) { 
          lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() - 100); 
         } else { 
          lyt_rlt_container.setCameraDistance(lyt_rlt_container.getCameraDistance() + 100); 
         } 
         lyt_rlt_container.setRotationY(180 * value); 

        } 
       }); 
       lockAnimator.start(); 
1

Lấy chiều cao xem, sau đó thêm một tỷ lệ phần trăm của chiều cao đến nơi mà nó sẽ trượt để

public void SlideUp(View view){ 
    float height = view.getHeight(); 

    TranslateAnimation animate = new TranslateAnimation(0,0,0,0); 

    animate.setDuration(500); 
    animate.setFillAfter(true); 

    view.animate().translationY((float)(0-0.62*height)).start(); 
    view.startAnimation(animate); 
} 
Các vấn đề liên quan