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.
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.
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);
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)
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);
}
Dans mon cas, clipChildren n'a fait que clipToPadding="false"
a résolu le problème. Allez comprendre.
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();