亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Gmail三段式動畫方案的完整工作示例?

Gmail三段式動畫方案的完整工作示例?

猛跑小豬 2020-02-03 14:45:59
我正在尋找一個完整的工作樣本,該樣本將被稱為“ Gmail三段動畫”方案。具體來說,我們想從兩個片段開始,像這樣:兩個碎片在發生某些UI事件(例如,點擊片段B中的某些內容)時,我們想要:片段A從屏幕左側滑出片段B滑動到屏幕的左邊緣并縮小以占據片段A空出的位置片段C從屏幕右側滑入并占據片段B空出的位置并且,在按下“返回”按鈕時,我們希望該組操作被逆轉。現在,我已經看到了很多部分實現。我將在下面回顧其中的四個。除了不完整之外,它們都有問題。@Reto邁爾促成這種普遍的回答相同的基本問題,表明你會使用setCustomAnimations()一個FragmentTransaction。對于兩個片段的場景(例如,您最初只看到片段A,并希望使用動畫效果將其替換為新的片段B),我完全同意。然而:由于您只能指定一個“入”和一個“出”動畫,因此我看不到如何處理三片段場景所需的所有不同動畫在<objectAnimator>他的代碼示例使用像素的硬連線的位置,這似乎給出不同的屏幕尺寸是不切實際的,但setCustomAnimations()需要動畫資源,排除在Java中定義這些事情的可能性我不知道比例縮放的對象動畫制作器如何與諸如android:layout_weight按LinearLayout百分比分配空間的對象動畫配合我一開始就對片段C的處理方式不知所措(將GONE?android:layout_weight的0?預先設置為0的比例動畫了嗎?還有其他嗎?)@Roman Nurik指出,您可以為任何屬性設置動畫,包括您自己定義的屬性。這可以幫助解決固定位置的問題,而以發明自己的自定義布局管理器子類為代價。這對某些人有所幫助,但是我仍然對Reto的其余解決方案感到困惑。該pastebin條目的作者顯示了一些誘人的偽代碼,基本上是說所有三個片段最初都將駐留在容器中,而片段C首先通過hide()事務操作隱藏。然后我們在UI事件發生時使用show()C和hide()A。但是,我看不到如何處理B更改大小這一事實。它還依賴于一個事實,即您顯然可以將多個片段添加到同一容器中,并且我不確定從長遠來看這是否是可靠的行為(更不用說它應該破壞了findFragmentById(),盡管我可以忍受)。這篇博文的作者指出,Gmail根本沒有使用setCustomAnimations(),而是直接使用對象動畫器(“您只需更改根視圖的左邊界+更改右視圖的寬度”)。但是,這仍然是兩段式解決方案AFAICT,實現再次顯示了以像素為單位的硬接線尺寸。我將繼續解決這個問題,所以有一天我可能會自己回答,但我真的希望有人能為這個動畫場景制定出三片段解決方案,并可以發布代碼(或鏈接)。Android中的動畫使我想拔頭發,而那些看到我的人都知道這是徒勞的。
查看完整描述

3 回答

?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

在github上上傳了我的建議 (盡管強烈建議將視圖硬件加速用于這種動畫,但它適用于所有android版本。對于非硬件加速的設備,位圖緩存實現應該更合適)


帶有動畫的演示視頻在此處(導致屏幕投放速度緩慢的幀率。實際性能非??欤?/p>


用法:


layout = new ThreeLayout(this, 3);

layout.setAnimationDuration(1000);

setContentView(layout);

layout.getLeftView();   //<---inflate FragmentA here

layout.getMiddleView(); //<---inflate FragmentB here

layout.getRightView();  //<---inflate FragmentC here


//Left Animation set

layout.startLeftAnimation();


//Right Animation set

layout.startRightAnimation();


//You can even set interpolators

說明:


創建了一個新的自定義RelativeLayout(ThreeLayout)和2個自定義動畫(MyScalAnimation,MyTranslateAnimation)


ThreeLayout假設其他可見視圖具有,則以參數的形式獲取左窗格的權重weight=1。


因此,new ThreeLayout(context,3)創建一個具有3個子級的新視圖,左側窗格的總屏幕數為1/3。另一個視圖占據了所有可用空間。


它在運行時計算寬度,更安全的實現是在draw()中第一次計算尺寸。而不是post()


縮放和平移動畫實際上是調整視圖的大小和移動視圖,而不是偽[縮放,移動]。注意,fillAfter(true)任何地方都不會使用它。


View2是view1的right_of



View3是view2的right_of


設置了這些規則后,RelativeLayout會處理其他所有事情。動畫改變了margins(移動中)和[width,height]比例


要訪問每個孩子(以便您可以用Fragment對其進行充氣,可以調用


public FrameLayout getLeftLayout() {}


public FrameLayout getMiddleLayout() {}


public FrameLayout getRightLayout() {}

下面展示了2個動畫


階段1


--- IN屏幕----------!----- OUT ----


[View1] [_____ View2 _____] [_____ View3_____]


第二階段


--OUT-!-------- IN屏幕------


[View1] [View2] [_____ View3_____]


查看完整回答
反對 回復 2020-02-03
  • 3 回答
  • 0 關注
  • 728 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號