【问题标题】:How can I create a sliding layout, like the main android menu?如何创建滑动布局,例如主 android 菜单?
【发布时间】:2012-06-11 11:25:38
【问题描述】:

我需要创建一个具有 4 个视图的应用程序。我需要通过触摸和向左或向右移动(无按钮)从一个视图传递到另一个视图。我想要的效果和你从一个页面传递到另一个页面时在android的主菜单中导航时看到的一样。

我已经测试了 ViewFlipper,但我不能使用它:它似乎没有正确捕捉到触摸事件。我什至不知道它是否是正确的组件。

处理这个问题的正确方法是什么?

【问题讨论】:

  • 更多细节:在android的主视图中,通常在底部,有一些项目符号,表示您在第1、2或其他页面。您可以使用一根手指向左或向右移动来更改页面。有人可以帮助我吗?

标签: android


【解决方案1】:

我终于成功了。这是我的解决方案。 首先,您需要定义一个包含子布局的主布局。

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


<ViewFlipper android:id="@+id/ViewFlipper01" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"
    >
    <include android:id="@+id/libraryView1"  layout="@layout/page_1" />
    <include android:id="@+id/libraryView2"  layout="@layout/page_2" />


</ViewFlipper>

</RelativeLayout>

其中 page_1 和 page_2 是我需要交换的布局。这些布局绝对是标准布局,随心所欲。

那么你需要一个活动:

public class Main extends Activity {

    private ViewFlipper vf;

    private float oldTouchValue;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        vf=(ViewFlipper)findViewById(R.id.ViewFlipper01);
    }

    @Override
    public boolean onTouchEvent(MotionEvent touchevent) {
        switch (touchevent.getAction())
        {
            case MotionEvent.ACTION_DOWN:
            {
                oldTouchValue = touchevent.getX();
                break;
            }
            case MotionEvent.ACTION_UP:
            {
                //if(this.searchOk==false) return false;
                float currentX = touchevent.getX();
                if (oldTouchValue < currentX)
                {
                   vf.setInAnimation(inFromLeftAnimation());
                   vf.setOutAnimation(outToRightAnimation());
                    vf.showNext();
                }
                if (oldTouchValue > currentX)
                {
                    vf.setInAnimation(inFromRightAnimation());
                    vf.setOutAnimation(outToLeftAnimation());
                    vf.showPrevious();
                }
            break;
            }
        }
        return false;
    }

    //for the previous movement
    public static Animation inFromRightAnimation() {

        Animation inFromRight = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  +1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        inFromRight.setDuration(350);
        inFromRight.setInterpolator(new AccelerateInterpolator());
        return inFromRight;
        }
    public static Animation outToLeftAnimation() {
        Animation outtoLeft = new TranslateAnimation(
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  -1.0f,
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        outtoLeft.setDuration(350);
        outtoLeft.setInterpolator(new AccelerateInterpolator());
        return outtoLeft;
        }    
    // for the next movement
    public static Animation inFromLeftAnimation() {
        Animation inFromLeft = new TranslateAnimation(
        Animation.RELATIVE_TO_PARENT,  -1.0f, Animation.RELATIVE_TO_PARENT,  0.0f,
        Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        inFromLeft.setDuration(350);
        inFromLeft.setInterpolator(new AccelerateInterpolator());
        return inFromLeft;
        }
    public static Animation outToRightAnimation() {
        Animation outtoRight = new TranslateAnimation(
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,  +1.0f,
         Animation.RELATIVE_TO_PARENT,  0.0f, Animation.RELATIVE_TO_PARENT,   0.0f
        );
        outtoRight.setDuration(350);
        outtoRight.setInterpolator(new AccelerateInterpolator());
        return outtoRight;
        }    
}

多田!完成!

【讨论】:

    【解决方案2】:

    我认为您正在寻找的是SlidingDrawer。有了它,你可以这样:

    <SlidingDrawer
         android:id="@+id/drawer"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
    
         android:handle="@+id/handle"
         android:content="@+id/content">
    
         <ImageView
             android:id="@id/handle"
             android:layout_width="88dip"
             android:layout_height="44dip" />
    
         <GridView
             android:id="@id/content"
             android:layout_width="match_parent"
             android:layout_height="match_parent" />
    
     </SlidingDrawer>
    

    【讨论】:

    • 效果不错,但不是我需要的:我需要改变页面,而不是最小化页面底部。
    【解决方案3】:

    您的意思是像主屏幕一样,您可以在其中滑动视图并捕捉每个视图?
    This 可能会帮助您。

    【讨论】:

    • 是的!该链接帮助了我,但不是一个好的示例,因为包含错误和一些无法解释的功能。我将发布我所做的完整解决方案。
    【解决方案4】:

    我认为您可以为此目的使用布局动画..

    res/anim/popin.xml:

    <set xmlns:android="http://schemas.android.com/apk/res/android"
         android:interpolator="@android:anim/accelerate_interpolator">
      <scale
        android:fromXScale="0.0" android:toXScale="1.0"
        android:fromYScale="0.0" android:toYScale="1.0"
        android:pivotX="50%"
        android:pivotY="50%"
        android:duration="400" 
      />
    </set>
    

    res/anim/popinlayout.xml:

    <layoutAnimation 
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:delay="0.5"
      android:animationOrder="random"
      android:animation="@anim/popin" 
    />
    

    来源:

    // Applying a Layout Animation and Animation Listener
    aViewGroup.setLayoutAnimationListener(new AnimationListener() {
      public void onAnimationEnd(Animation _animation) {
        // TODO: Actions on animation complete. 
      }
      public void onAnimationRepeat(Animation _animation) {}
      public void onAnimationStart(Animation _animation) {}
    });
    
    aViewGroup.scheduleLayoutAnimation();
    

    【讨论】:

    • 我不需要动画。动画是一个奖励:我需要更改布局。
    猜你喜欢
    • 1970-01-01
    • 2016-10-12
    • 2011-04-01
    • 2011-11-09
    • 1970-01-01
    • 2013-12-05
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多