web-dev-qa-db-ja.com

Android親の外に出ると表示が消えます

このLinearLayout内にLinearLayoutとImageViewがあります。

ImageViewには翻訳効果があります。

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

アニメーションは動作しますが、ImageViewがLinearLayoutの外に出ると消えます。

ここで問題を確認できます。 http://screenr.com/zoAH

LinearLayoutの高さを変更せずに修正するにはどうすればよいですか。

59
Eray

ImageViewが属するViewGroupを見つけて適用します ViewGroup.setClipChildren(false) 。デフォルトでは、子の描画は親ViewGroupの境界に制限されます。

79
JuniKim

これを引き起こす可能性のある2つの属性があります:clipChildrenとclipToPadding。オブジェクトの境界がアニメーション化される親ViewGroupごとに、clipChildrenをfalseに設定する必要があります。また、clipToPaddingを直接の親に設定する必要があります(さらにそれ以上の場合もありますが、まだそのケースを見ていません)。

XMLで両方の属性を設定できます

Android:clipChildren="false"
Android:clipToPadding="false"

またはコード内

viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);
74
Maxwell

私の実装。おそらく誰かを助けることができます:

Javaバージョン:

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

setAllParentsClip(yourView, false);を呼び出して、すべての親のクリッピングを無効にします。

編集済み:

拡張機能としてのKotlinのバージョン:

_fun View.setAllParentsClip(enabled: Boolean) {
    var parent = parent
    while (parent is ViewGroup) {
        parent.clipChildren = enabled
        parent.clipToPadding = enabled
        parent = parent.parent
    }
}
_

呼び出し:yourView.setAllParentsClip(false)

15
ahmed_khan_89

ビューの高さを取得し、スライドする場所に高さの割合を追加します

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);
}
1
Martin Itotia

私の場合、clipChildrenはclipToPadding="false"問題を修正しました。図を移動します。

1
Opus1217
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();
0
Prateek Yadav