реализация слайдера на андроиде

Я пытаюсь реализовать меню слайдера так же, как приложение facebook для Android.

Мне удалось сдвинуть меню и снова сдвинуть его обратно.

У меня есть два представления, подходящие для макета кадра.
1. Основной макет (X)
2. Макет меню. (Y)

Я сдвигаю X вправо, что показывает Y при скольжении, а при скольжении назад я перемещаю X обратно на 0, что скрывает меню.

@Override
public void setContentView(int layout) {

    FrameLayout frame = new FrameLayout(getBaseContext());
    frame.setLayoutParams(new FrameLayout.LayoutParams(FrameLayout.LayoutParams.FILL_PARENT, FrameLayout.LayoutParams.FILL_PARENT));


    LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    mainLayout = inflator.inflate(layout, null);

    menuList = inflator.inflate(R.layout.menu_page, null);


    fakeView= inflator.inflate(R.layout.fake_transparent_view, null);
    menuAnimator = new MenuAnimation(mainLayout,menuList,fakeView);
    frame.addView(menuList);
    frame.addView(mainLayout);
    frame.addView(fakeView);

    fakeView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if(mainLayout.getLeft()>0)
            {

            menuAnimator.moveMenu("left");
            }

        }
    });

    super.setContentView(frame);


}





public void moveMenu(String direction) {
        int width=(int) (QuikrApplication.getWidth()*.85);
        if (direction.equals("right")) {
            this.direction="right";
            fakeView.setVisibility(View.VISIBLE);
            TranslateAnimation moveRight = new TranslateAnimation(0, width, 0, 0);
            moveRight.setDuration(500);
            parentLayout.setAnimation(moveRight);
            moveRight.setAnimationListener(animationListner);
            parentLayout.startAnimation(moveRight);
            fakeView.startAnimation(moveRight);
        }
        else if (direction.equals("left")){
            this.direction="left";

            TranslateAnimation moveLeft = new TranslateAnimation(0, -width, 0, 0);
            moveLeft.setDuration(500);
            parentLayout.setAnimation(moveLeft);
            moveLeft.setAnimationListener(animationListner);
            parentLayout.startAnimation(moveLeft);
            fakeView.startAnimation(moveLeft);
        }
    }

Теперь проблема в том, что когда я выполняю какое-то действие в основном представлении, асинхронно основное представление перемещается (когда меню видно)


person Ganesh Shinde    schedule 02.02.2013    source источник
comment
Зачем нужна собственная реализация, если уже есть несколько хороших?   -  person Evos    schedule 02.02.2013


Ответы (3)


Попробуй это,

 <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<FrameLayout
    android:id="@+id/menu_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@android:color/black"
    android:orientation="vertical" >

    <LinearLayout
        android:id="@+id/fake_layouy"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:visibility="gone" >
    </LinearLayout>

    <Button
        android:id="@+id/button1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="inner button" />
</FrameLayout>

<RelativeLayout
    android:id="@+id/main_layout"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#FFFFFF"
    android:orientation="vertical" >

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="menu" />
</RelativeLayout>

java code

   public class MainActivity extends Activity {

private View toplayout;
private View sublayout;
private View fakeLayout;
private int screenWidth;
private int animToPosition;
private boolean menuOpen = false;
private int oldLeft;
private int oldTop;
private int newleft;
private int newTop;
private Button button1;
private Button button2;
private AnimationListener AL;
private DisplayMetrics metrics;
private Display display;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    requestWindowFeature(Window.FEATURE_NO_TITLE);
    setContentView(R.layout.activity_ugsimply_beta);
    toplayout = (View) findViewById(R.id.main_layout);
    sublayout = (View) findViewById(R.id.menu_layout);
    fakeLayout = (View) findViewById(R.id.fake_layouy);
    button1 = (Button) findViewById(R.id.button1);
    button2 = (Button) findViewById(R.id.button2);
    metrics = new DisplayMetrics();
    this.getWindowManager().getDefaultDisplay().getMetrics(metrics);
    display = getWindowManager().getDefaultDisplay();
    screenWidth = display.getWidth();
    int calcAnimatePosition = (screenWidth / 4);
    animToPosition = screenWidth - calcAnimatePosition;
    RelativeLayout.LayoutParams parms = new RelativeLayout.LayoutParams(
            animToPosition, RelativeLayout.LayoutParams.FILL_PARENT);
    sublayout.setLayoutParams(parms);

    /** Animatio Listner */

    AL = new AnimationListener() {

        @Override
        public void onAnimationStart(Animation animation) {
            // TODO Auto-generated method stub
            button2.setClickable(false);
            toplayout.setEnabled(false);
        }

        @Override
        public void onAnimationRepeat(Animation animation) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onAnimationEnd(Animation animation) {
            // TODO Auto-generated method stub
            if (menuOpen) {

                toplayout.layout(oldLeft, oldTop,
                        oldLeft + toplayout.getMeasuredWidth(), oldTop
                                + toplayout.getMeasuredHeight());
                menuOpen = false;
                // sublayout.setEnabled(false);
                button2.setClickable(true);
                toplayout.setEnabled(true);

            } else if (!menuOpen) {

                toplayout.layout(newleft, newTop,
                        newleft + toplayout.getMeasuredWidth(), newTop
                                + toplayout.getMeasuredHeight());
                button2.setClickable(true);

                menuOpen = true;
                toplayout.setEnabled(true);
            }

        }
    };

    button2.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (!menuOpen) {
                animSlideRight();
            }
        }
    });

    button1.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub
            if (menuOpen) {

                animSlideLeft();
            }
        }
    });

}

/** Animation right */

private void animSlideRight() {

    fakeLayout.setVisibility(View.VISIBLE);
    newleft = toplayout.getLeft() + animToPosition;

    newTop = toplayout.getTop();
    TranslateAnimation slideRight = new TranslateAnimation(0, newleft, 0, 0);
    slideRight.setDuration(500);
    slideRight.setFillEnabled(true);
    slideRight.setAnimationListener(AL);
    toplayout.startAnimation(slideRight);

}

/** Animation left */

private void animSlideLeft() {
    // TODO Auto-generated method stub
    fakeLayout.setVisibility(View.GONE);
    oldLeft = toplayout.getLeft() - animToPosition;

    oldTop = toplayout.getTop();
    TranslateAnimation slideLeft = new TranslateAnimation(newleft, oldLeft,
            0, 0);
    slideLeft.setDuration(500);
    slideLeft.setFillEnabled(true);
    slideLeft.setAnimationListener(AL);
    toplayout.setAnimation(slideLeft);

}

}

При нажатии на кнопку меню происходит правильная скользящая анимация. И нажав внутреннюю кнопку, анимация исчезнет. проверьте ниже экран

введите здесь описание изображениявведите здесь описание изображения

person MuraliGanesan    schedule 02.02.2013

Помимо LibSlideMenu, на github есть еще один проект с более чем 280 коммитами, который я также использовал в паре проектов, которые очень легко реализовать, с множеством функций, которые вы также можете проверить.

https://github.com/jfeinstein10/SlidingMenu

person Brosa    schedule 03.02.2013

Если я могу что-то предложить, на github есть очень хорошая реализация библиотеки для меню слайдера в стиле facebook/google+:

https://github.com/bk138/LibSlideMenu

Я использовал его один или два проекта, и он работает очень хорошо. Вы должны попробовать это.

person Anup Cowkur    schedule 02.02.2013