【问题标题】:Android View Disappearing When Go Outside Of Parent离开父母时Android视图消失
【发布时间】:2013-08-05 00:19:13
【问题描述】:

我在这个 LinearLayout 中有一个 LinearLayout 和 ImageView。

ImageView有翻译效果。

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

动画工作,但当 ImageView 超出 LinearLayout 时它消失了。

如何在不修改 LinearLayout 高度的情况下修复它。

【问题讨论】:

    标签: java android animation android-animation


    【解决方案1】:

    找到ImageView所属的ViewGroup并应用ViewGroup.setClipChildren(false)。 默认情况下,子项的绘制仅限于父 ViewGroup 的边界。

    【讨论】:

    • 在 XML 上设置 LinearLayout 的 android:clipChildren="false"但没有任何改变?
    • 我已将 clipChildren="false" 设置为 ImageView 的所有父级(我的意思是 LinearLayout 的父级)。它正在工作。谢谢。
    • 如果还没有向下滚动,请参阅下面 maxwell 的答案。也设置android:clipToPadding="false"
    • @Eray:我们可以处理对该 ImageView 的点击吗?
    • 您可能不仅要为直接父 ViewGroup 设置剪辑子项,还需要为层次结构中的其他 ViewGroups 设置剪辑子项。
    【解决方案2】:

    存在两个可能导致这种情况发生的属性:clipChildren 和clipToPadding。您需要将每个父 ViewGroup 的 clipChildren 设置为 false,对象将在其边界之外进行动画处理。您还需要将 clipToPadding 设置为直接父级(也许更多,但我还没有看到它的案例)。

    您可以在 XML 中设置这两个属性

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

    或在代码中

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

    【讨论】:

    • 我个人也不得不将每个父母的 clipToPadding 设置为 false。很奇怪。
    • Each parent ViewGroup 是关键!感谢您的回答。
    • 这很有帮助。谢谢老哥!
    • 完全正确! 1) 将 clipChildren 设置为 每个父 false它的边界是视图。 2) 将clipToPadding 设置为false 用于直系父母。但正如我尝试的那样,RelativeLayout 仍然不起作用。见here
    【解决方案3】:

    我的实现。它可能可以帮助某人:

    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)

    【讨论】:

    • 您确定要应用 setAllParentsClip(yourView, false);到正确的观点?您确定您面临与所问问题相同的问题吗?很抱歉,我真的不知道为什么它不适合你?
    【解决方案4】:

    在我的例子中,clipChildren 除了 clipToPadding="false" 解决了这个问题之外什么也没做。去图吧。

    【讨论】:

      【解决方案5】:

      获取视图高度,然后将高度的百分比添加到它将滑动到的位置

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

      【讨论】:

        【解决方案6】:
        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();
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-06-18
          相关资源
          最近更新 更多