web-dev-qa-db-fra.com

Android Affichage disparaissant lorsque vous sortez du parent

J'ai un LinearLayout et ImageView à l'intérieur de ce LinearLayout.

Il y a un effet de traduction pour ImageView.

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

L'animation fonctionne mais elle disparaît lorsque ImageView sort de LinearLayout.

Vous pouvez voir le problème ici: http://screenr.com/zoAH

Comment puis-je le réparer sans modifier la hauteur de LinearLayout.

59
Eray

Recherchez le ViewGroup auquel appartient ImageView et appliquez ViewGroup.setClipChildren (false) . Par défaut, le dessin des enfants est limité aux limites du ViewGroup parent.

79
JuniKim

Il existe deux attributs qui peuvent provoquer cela: clipChildren et clipToPadding. Vous devrez définir clipChildren sur false pour chaque ViewGroup parent dont les limites seront animées par l'objet. Vous devez également définir clipToPadding sur le parent immédiat (et peut-être plus, mais je n'ai pas encore vu de cas pour cela).

Vous pouvez définir les deux attributs dans le XML

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

ou en code

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

Ma mise en œuvre. Cela peut probablement aider quelqu'un:

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

appelez setAllParentsClip(yourView, false); pour désactiver l'écrêtage de tous les parents.

Édité:

la version de Kotlin comme fonction d'extension:

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

Appel: yourView.setAllParentsClip(false)

15
ahmed_khan_89

Obtenez la hauteur de la vue, puis ajoutez un pourcentage de la hauteur à l'endroit où elle glissera

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

Dans mon cas, clipChildren n'a fait que clipToPadding="false" a résolu le problème. Allez comprendre.

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