0

Я пытаюсь создать меню слайда справа налево слайд menu.i поиск пользовательского меню слайда и я нашел источник, но этот источник меню слайда слева направо это источникандроид меню слайда правого левой

public class MainLayout extends LinearLayout { 

    private static final int SLIDING_DURATION = 500; 
    private static final int QUERY_INTERVAL = 16; 
    int mainLayoutWidth; 
    private View menu; 
    private View content; 
    private static int menuRightMargin = 5; 

    private enum MenuState { 
     HIDING, HIDDEN, SHOWING, SHOWN, 
    }; 

    private int contentXOffset; 
    private MenuState currentMenuState = MenuState.HIDDEN; 
    private Scroller menuScroller = new Scroller(this.getContext(), 
      new EaseInInterpolator()); 
    private Runnable menuRunnable = new MenuRunnable(); 
    private Handler menuHandler = new Handler(); 
    int prevX = 0; 
    boolean isDragging = false; 
    int lastDiffX = 0; 

    public MainLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MainLayout(Context context) { 
     super(context); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 

     mainLayoutWidth = MeasureSpec.getSize(widthMeasureSpec); 
     menuRightMargin = mainLayoutWidth * 60/100; 
    } 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 

     menu = this.getChildAt(0); 
     content = this.getChildAt(1); 
     content.setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       return MainLayout.this.onContentTouch(v, event); 
      } 
     }); 
     menu.setVisibility(View.GONE); 
    } 

    @Override 
    protected void onLayout(boolean changed, int left, int top, int right, 
      int bottom) { 
     if (changed) { 
      LayoutParams contentLayoutParams = (LayoutParams) content 
        .getLayoutParams(); 
      contentLayoutParams.height = this.getHeight(); 
      contentLayoutParams.width = this.getWidth(); 
      LayoutParams menuLayoutParams = (LayoutParams) menu 
        .getLayoutParams(); 
      menuLayoutParams.height = this.getHeight(); 
      menuLayoutParams.width = this.getWidth() - menuRightMargin; 
     } 
     menu.layout(left, top, right - menuRightMargin, bottom); 
     content.layout(left + contentXOffset, top, right + contentXOffset, 
       bottom); 

    } 

    public void toggleMenu() { 

     if (currentMenuState == MenuState.HIDING 
       || currentMenuState == MenuState.SHOWING) 
      return; 

     switch (currentMenuState) { 
     case HIDDEN: 
      currentMenuState = MenuState.SHOWING; 
      menu.setVisibility(View.VISIBLE); 
      menuScroller.startScroll(0, 0, menu.getLayoutParams().width, 0, 
        SLIDING_DURATION); 
      break; 
     case SHOWN: 
      currentMenuState = MenuState.HIDING; 
      menuScroller.startScroll(contentXOffset, 0, -contentXOffset, 0, 
        SLIDING_DURATION); 
      break; 
     default: 
      break; 
     } 
     menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL); 
     this.invalidate(); 
    } 

    protected class MenuRunnable implements Runnable { 
     @Override 
     public void run() { 
      boolean isScrolling = menuScroller.computeScrollOffset(); 
      adjustContentPosition(isScrolling); 
     } 
    } 

    private void adjustContentPosition(boolean isScrolling) { 
     int scrollerXOffset = menuScroller.getCurrX(); 

     content.offsetLeftAndRight(scrollerXOffset - contentXOffset); 

     contentXOffset = scrollerXOffset; 
     this.invalidate(); 
     if (isScrolling) 
      menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL); 
     else 
      this.onMenuSlidingComplete(); 
    } 

    private void onMenuSlidingComplete() { 
     switch (currentMenuState) { 
     case SHOWING: 
      currentMenuState = MenuState.SHOWN; 
      break; 
     case HIDING: 
      currentMenuState = MenuState.HIDDEN; 
      menu.setVisibility(View.GONE); 
      break; 
     default: 
      return; 
     } 
    } 

    protected class EaseInInterpolator implements Interpolator { 
     @Override 
     public float getInterpolation(float t) { 
      return (float) Math.pow(t - 1, 5) + 1; 
     } 

    } 

    public boolean isMenuShown() { 
     return currentMenuState == MenuState.SHOWN; 
    } 

    public boolean onContentTouch(View v, MotionEvent event) { 
     if (currentMenuState == MenuState.HIDING 
       || currentMenuState == MenuState.SHOWING) 
      return false; 
     int curX = (int) event.getRawX(); 
     int diffX = 0; 

     switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 

      prevX = curX; 
      return true; 

     case MotionEvent.ACTION_MOVE: 
      if (!isDragging) { 
       isDragging = true; 
       menu.setVisibility(View.VISIBLE); 
      } 
      diffX = curX - prevX; 
      if (contentXOffset + diffX <= 0) { 
       diffX = -contentXOffset; 
      } else if (contentXOffset + diffX > mainLayoutWidth 
        - menuRightMargin) { 
       diffX = mainLayoutWidth + menuRightMargin + contentXOffset; 
      } 
      content.offsetLeftAndRight(diffX); 
      contentXOffset += diffX; 
      this.invalidate(); 

      prevX = curX; 
      lastDiffX = diffX; 
      return true; 

     case MotionEvent.ACTION_UP: 
      Log.d("MainLayout.java onContentTouch()", "Up lastDiffX " 
        + lastDiffX); 

      if (lastDiffX > 0) { 
       currentMenuState = MenuState.SHOWING; 
       menuScroller.startScroll(contentXOffset, 0, 
         menu.getLayoutParams().width - contentXOffset, 0, 
         SLIDING_DURATION); 
      } else if (lastDiffX < 0) { 
       currentMenuState = MenuState.HIDING; 
       menuScroller.startScroll(contentXOffset, 0, -contentXOffset, 0, 
         SLIDING_DURATION); 
      } 
      menuHandler.postDelayed(menuRunnable, QUERY_INTERVAL); 
      this.invalidate(); 
      isDragging = false; 
      prevX = 0; 
      lastDiffX = 0; 
      return true; 

     default: 
      break; 
     } 

     return false; 
    } 
} 

этот код работает perfec.i может создать меню слайдов, но теперь я хочу переписать этот код. Я хочу получить меню слайдов справа налево. Я хочу обменять этот пример. p.s Я знаю те же хорошие примеры о меню слайдов, но я хочу переписать этот источник. как я могу решить свою проблему? если кто-нибудь знает решение, пожалуйста, помогите me.thanks каждому

+0

Вы просто пытаетесь создать навигационный ящик? Вы можете просто использовать [DrawerLayout] (http://developer.android.com/reference/android/support/v4/widget/DrawerLayout.html) и получить полностью рабочий слайд в меню всего несколькими строками кода. – NoChinDeluxe

+0

@drschultz спасибо, я знаю DrawerLayout, но мне это не нужно, потому что я хочу переместить рамку вправо налево, как это http://alexanderblom.se/images/facebook-ios.jpeg – donoachua

+0

А! Итак, вы хотите, чтобы ваш контент скользил, показывая меню ниже? Взгляните на этот ответ: [http://stackoverflow.com/questions/33587371/android-move-main-content-to-reveal-drawer](http://stackoverflow.com/questions/33587371/android-move -main-content-to-discovery-drawer) – NoChinDeluxe

ответ

0

Чтобы ваш основного содержимого слайда, открыв меню внизу, есть хороший пример того, как сделать это здесь: https://stackoverflow.com/questions/33587371/android-move-main-content-to-reveal‌​-drawer

Так как вы хотите, чтобы ваше меню будет показанный с правой стороны, вы просто вычтите вычисления X из ширины родительского представления, которое в примере представляет собой DrawerLayout под названием drawerLayout. Таким образом, вы бы сделать следующие корректировки этих строк:

Это исходный код для установки положения X выдвижного ящика и содержания:

drawerContent.setX(drawerView.getWidth() * (1 - slideOffset)); 
mainContent.setX(drawerView.getWidth() * slideOffset); 

Эти расчеты начинаются сползание в положении 0 и сдвиньте до ширины выдвижного ящика. Вместо этого мы хотим, чтобы начальная позиция ширины родительского макета (наш вид drawerLayout) и сдвигалась назад к нулю (по ширине ящика). Таким образом, мы бы изменили эти строки следующим образом:

drawerContent.setX(drawerLayout.getWidth() - (drawerView.getWidth() * (1 - slideOffset))); 
mainContent.setX(drawerLayout.getWidth() - (drawerView.getWidth() * slideOffset)); 
+0

благодарю вас за ответ, но ваш второй код не работает идеально, когда у меня есть drawerlayout с правой стороны – donoachua

Смежные вопросы