2014-02-28 43 views
5

我有一个片段视图。该片段位于FrameLayout内。我想动画这个视图在片段边界之外移动。但是,在越过边界时,视图总是被剪切掉。我曾尝试将android:clipChildren="false"android:clipToPadding="false"设置为一切,但我无法使其正常工作。Android动画视图外部片段正在被剪辑

这甚至有可能吗?

+0

这是什么运气?你如何添加片段;动态还是通过布局?我正在动态添加,然后为其内部的视图添加动画,并将其剪切。无法让它现在剪辑;在寻找工作时发现这一点。谢谢。 – wkhatch

回答

7

我对碎片有类似的问题,并在我的层次结构中的所有级别上放置了android:clipChildren="false"android:clipToPadding="false",但它仍然不起作用。为我工作的诀窍是添加此覆盖在我的片段代码:

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    ViewGroup vg = (ViewGroup) view; 
    vg.setClipChildren(false); 
    vg.setClipToPadding(false); 
} 

希望这有助于...

附:信用应该去这answer

+0

我希望;不为我工作 – wkhatch

+1

这个解决方案背后的想法,或者至少我是怎么理解的,就是当你使用碎片时,系统会为你创建视图来保存它,而这个视图是它的唯一缺点,因为它是唯一的一个我没有看到从XML或代码或其他任何地方。而这个解决方案实际上是为了访问这个“最后的视图”,它没有调用setClip ...(false)。我相信这就是为什么它对我有用。 – frangulyan

+0

鉴于此,我建议您在运行时转储视图层次结构,以创建并显示所有视图和片段,并转储此层次结构中所有视图的剪切标记。在我的情况下,我删除了其余的setClip ...(false),我将它添加到了“以防万一”,并且它仍然有效,只是找到了放置它的最佳位置。在你的情况下,你可以设置所有这些,并检查是否仍然无法工作,当所有设置。附:忘了说,如果你正在谈论Android 2.x然后忘了它 - 我没有设法让它工作:) – frangulyan

2

frangulyan您错过了您的信用答案代码的其他位。下面的解决方案为我工作。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 
    LinearLayout rootView = (LinearLayout) inflater.inflate(R.layout.fragment_main, container, false); 
    //This can be done in XML 
    rootView.setClipChildren(false); 
    rootView.setClipToPadding(false); 
    return rootView; 
} 

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 
//This is the NoSaveStateFrameLayout - force it to not clip 
FrameLayout frameLayout = (FrameLayout) getView(); 
frameLayout.setClipChildren(false); 
frameLayout.setClipToPadding(false); 

}

0

已经@frangulyan和@Barrie Galitzky给出都是在正确的轨道上,但我不得不这样循环添加到层次setClipping假所有家长会工作之前,这些问题的答案正确

@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 
    super.onViewCreated(view, savedInstanceState); 

    ViewGroup vg = (ViewGroup) view; 
    while(vg != null) { 
     vg.setClipChildren(false); 
     vg.setClipToPadding(false); 
     vg = vg.getParent() instanceof ViewGroup ? (ViewGroup) vg.getParent() : null; 
    } 
} 
0

我知道这是有点老了,而正确的答案已经给出,但我想补充一点,你可以做同样的事情,frangulyan使用ViewGrouponCreateView一样。 I.e .:

@Override 
public View onCreateView(LayoutInflater, ViewGroup container, Bundle savedInstanceState) { 
    container.setClipChildren(false); 
    container.setClipToPadding(false); 
    // Whatever other setup you like 
    return View; 
}