2014-10-19 61 views
3

您好,我嘗試製作的動畫有問題。從GONE到VISIBLE的Android可見性不能正常工作

我使用此庫AndroidViewAnimations

這裏是我的佈局XML代碼:

<Button 
     android:id="@+id/buttonDetails" 
     style="@style/Button_Details"/> 

    <LinearLayout 
     android:id="@+id/linearLayoutDetails" 
     android:visibility="gone" 
     style="@style/LinearLayout_Details"> 

     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clmn_text" 
      android:checked="true"/> 
     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clme_text" 
      android:checked="true"/> 
     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clmn_text" 
      android:checked="true"/> 
     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clmn_text" 
      android:checked="true"/> 
     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clmn_text" 
      android:checked="true"/> 
     <CheckBox 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:text="@string/checkbox_clmn_text" 
      android:checked="true"/> 

    </LinearLayout> 

在這裏,我的Java代碼:

// Declare Variables 
@ViewById 
LinearLayout linearLayoutDetails; 

@Click 
void buttonDetails() { 
    // Checks Linear Layout Visibility 
    if (linearLayoutDetails.getVisibility() == View.GONE) { 
     // Sets linearLayoutDetails Visibility to VISIBLE 
     linearLayoutDetails.setVisibility(View.VISIBLE); 
     // Makes Appear Animation 
     YoYo.with(Techniques.SlideInDown) 
       .duration(700) 
       .playOn(linearLayoutDetails); 
    } else { 
     linearLayoutDetails.setVisibility(View.GONE); 
    } 
} 

現在的問題是,我第一次按下動畫不能正常使用的按鈕,但之後,每隔一段時間工作。

我做了一些研究,發現問題是我已將可見性設置爲消失,如果將其設置爲隱形,則它將從第一次正常工作。事情是,我不想讓可見性看不見,但因爲我不希望線性佈局在隱藏時佔據空間。

任何想法?

+1

我不是一個期待,但要儘量做動畫之前某處你的LinearLayout調用requestLayout()。 你有YoYo的代碼嗎?看到真實的代碼真是太棒了。 – 2014-10-19 18:09:34

+0

是的我已經嘗試了requestLayout(),但它沒有工作 – user3596163 2014-10-19 18:15:44

回答

5

我只是解決了一對夫婦前使用ViewTreeObserver分鐘。在下面的示例中,變量currentMode是我想要進出動畫的視圖。它的默認值是「消失」了,而我的確有相同的問題。

這裏是我如何解決它:

ViewTreeObserver vto = currentMode.getViewTreeObserver(); 
vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { 
    @Override 
    public void onGlobalLayout() { 
     if(currentMode.isShown()) { 
      YoYo.with(Techniques.SlideInDown).duration(250).playOn(currentMode); 
     } 
    } 
}); 
currentMode.setVisibility(mShouldShowMode ? View.VISIBLE : View.GONE); 

使用ViewTreeObserver我們可以觀看到UI全球變化,然後作出反應。方法View.isShown()檢查是否可見。如果是這樣,那麼我開始動畫。這對我很好。

那麼對於出口的動畫,你必須偵聽器連接到像這樣出來的動畫:

YoYo.with(Techniques.SlideOutUp).duration(250).withListener(new Animator.AnimatorListener() { 
    @Override 
    public void onAnimationStart(Animator animation) { 

    } 

    @Override 
    public void onAnimationEnd(Animator animation) { 
     currentMode.setVisibility(View.GONE); 
    } 

    @Override 
    public void onAnimationCancel(Animator animation) { 

    } 

    @Override 
    public void onAnimationRepeat(Animator animation) { 

    } 
}).playOn(currentMode); 
+1

你是我的英雄我希望我能投票給你 – user3596163 2014-11-26 08:57:53

0

解決方法:

boolean firstTIme = true; 

(...) 

@Click 
void buttonDetails() { 
    // Checks Linear Layout Visibility 
    if (linearLayoutDetails.getVisibility() == View.GONE || firstTIme) { 
     firstTIme = false; 
     linearLayoutDetails.setVisibility(View.VISIBLE); 
     YoYo.with(Techniques.SlideInDown) 
       .duration(700) 
       .playOn(linearLayoutDetails); 
    } else { 
     linearLayoutDetails.setVisibility(View.GONE); 
    } 
} 
+0

我很抱歉,但這將如何幫助?你只需要布爾檢查其餘的代碼與地雷相同 – user3596163 2014-10-19 19:47:50

+0

你說所有的東西都運行正常,除了你第一次運行。我的布爾檢查克服了這個問題:firstTIme在啓動時將是真實的,所以if語句中的代碼將會運行,不管它在什麼後面都會返回到一個簡單的可見性檢查 – nunoh123 2014-10-19 20:27:07

+0

好吧,我現在看到誤解發生在哪裏。 問題不在於代碼沒有啓動。代碼總是得到執行,但第一次發生這種情況時,如果線性佈局可見性設置爲消失,動畫不起作用(因爲我認爲它沒有得到渲染,因爲不可見的可見性,如果我設置可見性以隱藏動畫作品因爲線性佈局得到渲染,但我不希望這樣,因爲這種方式線性佈局佔用空間) – user3596163 2014-10-20 08:14:59

0

如果您使用的YoYo圖書館那就試試這個。

  YoYo.with(Techniques.SlideInDown) 
      .duration(400) 
      .withListener(new Animator.AnimatorListener() { 
       @Override 
       public void onAnimationStart(Animator animation) { 

       } 

       @Override 
       public void onAnimationEnd(Animator animation) { 
         //this will do the trick 
         YoYo.with(Techniques.Landing) 
          .duration(1) 
          .playOn(view); 
       } 

       @Override 
       public void onAnimationCancel(Animator animation) { 

       } 

       @Override 
       public void onAnimationRepeat(Animator animation) { 

       } 
      }) 
      .playOn(view); 

您也可以在任何視圖對象上使用這個連續動畫。

0

我有一個類似的問題,即使接受的答案我不能使它的工作。所以,我沒有這個

TransitionInflater inflater = TransitionInflater.from(context); 
Transition transition = inflater.inflateTransition(R.transition.yoyo_transition); 
transition.addListener(new Transition.TransitionListener() { 
     ... 
     @Override 
     public void onTransitionEnd(Transition transition) { 
      do_stuff_with_yoyo(); 
     } 
     ... 
    }); 

TransitionManager.beginDelayedTransition((ViewGroup) getRootView(), transition); 
yoyo.setVisibility(View.VISIBLE); 

yoyo_transition.xml

<?xml version="1.0" encoding="utf-8"?> 
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"> 

    <changeBounds android:duration="0"> 
     <targets> 
      <target android:targetId="@+id/yoyo_id"></target> 
     </targets> 
    </changeBounds> 

    <fade android:duration="0"> 
     <targets> 
      <target android:targetId="@+id/yoyo_id"></target> 
     </targets> 
    </fade> 

</transitionSet>