2014-02-28 46 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; 
}