Ответ 1
Найдите группу ViewGroup, к которой принадлежит ImageView, и примените ViewGroup.setClipChildren(false). По умолчанию рисунок дочерних элементов ограничивается границами родительской ViewGroup.
У меня есть LinearLayout и ImageView внутри этого LinearLayout.
Для 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.
Найдите группу ViewGroup, к которой принадлежит ImageView, и примените ViewGroup.setClipChildren(false). По умолчанию рисунок дочерних элементов ограничивается границами родительской ViewGroup.
Существуют два атрибута, которые могут вызвать это: clipChildren и clipToPadding. Вам нужно будет установить clipChildren в значение false для каждой родительской ViewGroup, границы которой объект будет анимировать из. Вам также нужно установить clipToPadding для непосредственного родителя (и, возможно, больше, но я еще не видел его для него).
Вы можете установить оба атрибута в XML
android:clipChildren="false"
android:clipToPadding="false"
или в коде
viewGroup.setClipChildren(false);
viewGroup.setClipToPadding(false);
Моя реализация. Это может помочь кому-то:
Версия 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)
В моем случае clipChildren ничего не сделал, кроме clipToPadding="false"
исправил проблему. Наведите указатель мыши.
Получите высоту вида, затем добавьте процент от высоты, к которой он будет сдвигаться.
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);
}
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();