Android Вид Исчезает, Когда Выйти За Пределы Родителя


У меня есть 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.

6 54

6 ответов:

найти ViewGroup, что ImageView принадлежит и применить ViewGroup.setClipChildren (false). По умолчанию чертеж дочерних элементов ограничен границами родительской группы представлений.

существуют два атрибута, которые могут привести к этому: clipChildren и clipToPadding. Вам нужно будет установить clipChildren в false для каждой родительской группы представлений, границы которой будут анимированы объектом. Вам также нужно установить clipToPadding для непосредственного родителя (и, возможно, больше, но я еще не видел случая для этого).

вы можете установить оба атрибута в XML

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

или в коде

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

моя реализация. Это, вероятно, может помочь кому-то:

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); чтобы отключить отсечение во всех родителях.

в моем случае 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();