2014-03-28 18 views
0

我試圖使用與Viber的界面(討論頁面)相同的導航風格,而不使用第三方庫(如SlidingMenu)。三個滑動窗格 - 上面的中間窗格左右窗格

我認爲他們已經使用SlidingPaneLayout來達到這個好效果,但是當我試着對它進行編碼時,我注意到最後一個窗格總是超過了第二個。

我的問題:

  1. 這真的是一個SlidingPaneLayout
  2. 如果是的話請怎麼做?
  3. 如果不是,是否有一種android本地方式來做同樣的事情?!

左窗格

Left Pane

右窗格

Right Pane

+0

如果你不想使用任何第三方庫,那麼你可以創建自定義屏幕,然後像滑塊一樣應用動畫。 – InnocentKiller

+0

謝謝@InnocentKiller。你能更精確一些,如何應用這樣的動畫??! –

+0

檢查我的下面的答案。 – InnocentKiller

回答

2

首先在你的類中聲明這一切變量

/** Sliding Menu */ 
    boolean alreadyShowing = false; 
    private int windowWidth; 
    private Animation animationClasses; 
    private RelativeLayout classesSlider; 
    LayoutInflater layoutInflaterClasses; 

然後onCreate方法內聲明這一點,這將有助於你得到屏幕的高度和寬度

Display display = getWindowManager().getDefaultDisplay(); 
     windowWidth = display.getWidth(); 
     display.getHeight(); 
     layoutInflaterClasses = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

,然後你的任何按鈕或圖像,其中通過點擊您要打開滑蓋把下面的代碼。

findViewById(R.id.slidermenu).setOnClickListener(new OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (!alreadyShowing) { 
        alreadyShowing = true; 
        openSlidingMenu(); 
       } 
      } 
     }); 

然後的onCreate外聲明openSlidingMenu()如下。

private void openSlidingMenu() { 
     // showFadePopup(); 
     int width = (int) (windowWidth * 0.8f); 
     translateView((float) (width)); 
     @SuppressWarnings("deprecation") 
     int height = LayoutParams.FILL_PARENT; 
     // creating a popup 
     final View layout = layoutInflaterClasses.inflate(
       R.layout.option_popup_layout, 
       (ViewGroup) findViewById(R.id.popup_element)); 

     ImageView imageViewassignment = (ImageView) layout 
       .findViewById(R.id.assignment); 
     imageViewassignment.setOnClickListener(this); 

final PopupWindow optionsPopup = new PopupWindow(layout, width, height, 
       true); 
     optionsPopup.setBackgroundDrawable(new PaintDrawable()); 
     optionsPopup.showAtLocation(layout, Gravity.NO_GRAVITY, 0, 0); 
     optionsPopup.setOnDismissListener(new PopupWindow.OnDismissListener() { 
      public void onDismiss() { 
       // to clear the previous animation transition in 
       cleanUp(); 
       // move the view out 
       translateView(0); 
       // to clear the latest animation transition out 
       cleanUp(); 
       // resetting the variable 
       alreadyShowing = false; 
      } 
     }); 
    } 

只需更換

final View layout = layoutInflaterClasses.inflate(
        R.layout.option_popup_layout, 
        (ViewGroup) findViewById(R.id.popup_element)); 

這上面的代碼與您的自定義XML的屏幕名稱和它的ID。這裏是你需要的其他方法。

private void translateView(float right) { 
     animationClasses = new TranslateAnimation(0f, right, 0f, 0f); 
     animationClasses.setDuration(100); 
     animationClasses.setFillEnabled(true); 
     animationClasses.setFillAfter(true); 

     classesSlider = (RelativeLayout) findViewById(R.id.classes_slider); 
     classesSlider.startAnimation(animationClasses); 
     classesSlider.setVisibility(View.VISIBLE); 
    } 

    private void cleanUp() { 
     if (null != classesSlider) { 
      classesSlider.clearAnimation(); 
      classesSlider = null; 
     } 
     if (null != animationClasses) { 
      animationClasses.cancel(); 
      animationClasses = null; 
     } 
    } 

記得這裏animationClasses = new TranslateAnimation(0f, right, 0f, 0f);你可以用這個參數玩一些不同的效果,也不要忘記當前屏幕的ID來改變這一行的ID例如像檢查以下ID

classesSlider = (RelativeLayout) findViewById(R.id.classes_slider); 

在這裏你需要用當前Java屏幕的XML文件ID替換此ID。

希望這會幫助你。