2013-07-03 32 views
0

我正在使用最新的支持庫中的SlidingPaneLayout,該庫提供了openPane()closePane()方法來平滑打開和關閉面板。不幸的是,沒有動畫就沒有公開的方法。SlidingPaneLayout:沒有平滑動畫的幻燈片?

有沒有辦法仍然這樣做?我有一種感覺可能是必要的。

P.S.該文件在sdk/extras/android/support/v4/src/java/android/support/v4/widget/下可用。

+0

*沒有*動畫?爲什麼? – Ahmad

+0

偶爾我會顯示一個對話框。使用動畫會使轉換看起來不連貫。 –

回答

2

我寫了一個子類,提供了兩種方法,openPaneNoAnimation()closePaneNoAnimation()。是的,這是反思,可能會停止與未來的支持庫合作,但現在它完成了這項工作。最壞的情況下,這些方法可以回到使用openPane()closePane()

import java.lang.reflect.Field; 
import java.lang.reflect.Method; 

import android.content.Context; 
import android.support.v4.widget.SlidingPaneLayout; 
import android.util.AttributeSet; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.View; 

public class AnimationlessSlidingPaneLayout extends SlidingPaneLayout { 
    private boolean mSlideEnabled = true; 
    private Field mSlideOffsetField = null; 
    private Field mSlideableViewField = null; 
    private Method updateObscuredViewsVisibilityMethod = null; 
    private Method dispatchOnPanelOpenedMethod = null; 
    private Method dispatchOnPanelClosedMethod = null; 
    private Field mPreservedOpenStateField = null; 
    private Method parallaxOtherViewsMethod = null; 

    public AnimationlessSlidingPaneLayout(Context context) { 
     this(context, null, 0); 
    } 

    public AnimationlessSlidingPaneLayout(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public AnimationlessSlidingPaneLayout(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     try { 
      mSlideOffsetField = SlidingPaneLayout.class.getDeclaredField("mSlideOffset"); 
      mSlideableViewField = SlidingPaneLayout.class.getDeclaredField("mSlideableView"); 
      updateObscuredViewsVisibilityMethod = SlidingPaneLayout.class.getDeclaredMethod("updateObscuredViewsVisibility", 
                          View.class); 
      dispatchOnPanelClosedMethod = SlidingPaneLayout.class.getDeclaredMethod("dispatchOnPanelClosed", View.class); 
      dispatchOnPanelOpenedMethod = SlidingPaneLayout.class.getDeclaredMethod("dispatchOnPanelOpened", View.class); 
      mPreservedOpenStateField = SlidingPaneLayout.class.getDeclaredField("mPreservedOpenState"); 
      parallaxOtherViewsMethod = SlidingPaneLayout.class.getDeclaredMethod("parallaxOtherViews", float.class); 

      mSlideOffsetField.setAccessible(true); 
      mSlideableViewField.setAccessible(true); 
      updateObscuredViewsVisibilityMethod.setAccessible(true); 
      dispatchOnPanelOpenedMethod.setAccessible(true); 
      dispatchOnPanelClosedMethod.setAccessible(true); 
      mPreservedOpenStateField.setAccessible(true); 
      parallaxOtherViewsMethod.setAccessible(true); 
     } catch (Exception e) { 
      Log.w("ASPL", "Failed to set up animation-less sliding layout."); 
     } 
    } 

    public void openPaneNoAnimation() { 
     try { 
      View slideableView = (View) mSlideableViewField.get(this); 
      mSlideOffsetField.set(this, 1.0f); 
      parallaxOtherViewsMethod.invoke(this, 1.0f); 
      requestLayout(); 
      invalidate(); 
      dispatchOnPanelOpenedMethod.invoke(this, slideableView); 
      mPreservedOpenStateField.set(this, true); 
     } catch (Exception e) { 
      openPane(); 
     } 
    } 

    public void closePaneNoAnimation() { 
     try { 
      View slideableView = (View) mSlideableViewField.get(this); 
      mSlideOffsetField.set(this, 0.0f); 
      parallaxOtherViewsMethod.invoke(this, 0.0f); 
      requestLayout(); 
      invalidate(); 
      updateObscuredViewsVisibilityMethod.invoke(this, slideableView); 
      dispatchOnPanelClosedMethod.invoke(this, slideableView); 
      mPreservedOpenStateField.set(this, false); 
     } catch (Exception e) { 
      closePane(); 
     } 
    } 

}