【问题标题】:Drop down menu or view on slide下拉菜单或幻灯片视图
【发布时间】:2011-04-15 05:30:27
【问题描述】:

我想知道是否有人可以指导我如何完成以下操作,

用户有标题栏,当用户按住标题栏向下拖动时;它向用户展示了不同的视图。这是位于 tabhost 中的视图。

类似于android的默认状态栏。

【问题讨论】:

    标签: android drop-down-menu titlebar


    【解决方案1】:

    您应该尝试使用带有RelativeLayout 子级的ViewFlipper 并在headers 上附加OnTouchListeners 来完成此操作(类似于AccordionView 的行为)。它对我有用。

    示例应用程序

    ma​​in.xml //内部res/layouts

    <?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">
        <ViewFlipper android:id="@+id/flipper" 
            android:layout_width="fill_parent" android:layout_height="fill_parent">
            <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent">
                <TextView android:id="@+id/txt_states" android:text="First panel" 
                    android:layout_centerHorizontal="true"
                    android:textSize="18dp" android:textStyle="bold" android:textColor="@android:color/white"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" />
                <Button android:id="@+id/btn_next" android:text="@string/goto_second"
                    android:layout_width="fill_parent" android:layout_height="wrap_content" 
                    android:gravity="center_horizontal" android:layout_centerHorizontal="true" android:layout_alignParentBottom="true"/>
                <TextView android:id="@+id/txt_content1" android:text="@string/loremipsum1" 
                     android:layout_width="fill_parent" android:layout_height="fill_parent" 
                     android:layout_below="@id/txt_states" android:layout_above="@id/btn_next" 
                     android:layout_marginTop="10dp" />
            </RelativeLayout>
            <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent">
                <Button android:id="@+id/btn_prev" android:text="@string/goto_first"
                    android:layout_width="fill_parent" android:layout_height="wrap_content"
                    android:gravity="center_horizontal" android:layout_centerHorizontal="true" />
                <TextView android:id="@+id/txt_commands" android:text="Second panel" 
                    android:layout_centerHorizontal="true"
                    android:textSize="18dp" android:textStyle="bold" android:textColor="@android:color/white"
                    android:layout_width="wrap_content" android:layout_height="wrap_content" 
                    android:layout_below="@id/btn_prev" />
                <TextView android:id="@+id/txt_content2" android:text="@string/loremipsum2" 
                     android:layout_width="fill_parent" android:layout_height="fill_parent"
                     android:layout_below="@id/txt_commands" android:layout_marginTop="10dp" />
            </RelativeLayout>
        </ViewFlipper>
    </RelativeLayout>
    

    androidManifest.xml //仅活动声明

    <activity android:name=".AccordionSample" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    

    AccordionSample.java //你的主要活动

    import android.app.Activity;
    import android.os.Bundle;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.Button;
    import android.widget.ViewFlipper;
    
    public class AccordionSample extends Activity implements View.OnTouchListener 
    {
        private float oldTouchValue;
        private ViewFlipper flipper;
        private Button currentButton;
    
        @Override
        protected void onCreate(Bundle savedInstanceState)
        {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
    
            flipper = (ViewFlipper)findViewById(R.id.flipper);
            findViewById(R.id.btn_prev).setOnTouchListener(this);
            findViewById(R.id.btn_next).setOnTouchListener(this);
        }
    
        private boolean onButtonTouchEvent(MotionEvent touchevent)
        {
            if (currentButton == null)
                return false;
            switch (touchevent.getAction())
            {
                case MotionEvent.ACTION_DOWN:
                {
                    oldTouchValue = touchevent.getY();
                    break;
                }
                case MotionEvent.ACTION_UP:
                {
                    float currentY = touchevent.getY();
                    final float diff = oldTouchValue - currentY;
                    if ((diff < -100) && (currentButton.getId() == R.id.btn_prev))
                    {
                        //Up --> Bottom
                        flipper.setInAnimation(AccordionAnimation.inFromTopAnimation());
                        flipper.setOutAnimation(AccordionAnimation.outToBottomAnimation());
                        flipper.showNext();
                    }
                    else if ((diff > 100) && (currentButton.getId() == R.id.btn_next))
                    {
                        //Bottom --> Up
                        flipper.setInAnimation(AccordionAnimation.inFromBottomAnimation());
                        flipper.setOutAnimation(AccordionAnimation.outToTopAnimation());
                        flipper.showPrevious();
                    }
                    break;
                }
            }
            currentButton = null;
            return true;
        }
    
        @Override
        public boolean onTouch(View v, MotionEvent event)
        {
            currentButton = (Button)v;
            final boolean result = this.onButtonTouchEvent(event);
            return result;
        }
    }
    

    AccordionAnimation.java //用于上下滑动

    import android.view.animation.AccelerateInterpolator;
    import android.view.animation.Animation;
    import android.view.animation.TranslateAnimation;
    
    public class AccordionAnimation
    {
        public static Animation inFromBottomAnimation()
        {
            Animation inFromBottom =
                    new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, +1.0f, Animation.RELATIVE_TO_PARENT, 0.0f);
            inFromBottom.setDuration(350);
            inFromBottom.setInterpolator(new AccelerateInterpolator());
            return inFromBottom;
        }
    
        public static Animation outToTopAnimation()
        {
            Animation outtoTop =
                    new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, -1.0f);
            outtoTop.setDuration(350);
            outtoTop.setInterpolator(new AccelerateInterpolator());
            return outtoTop;
        }
    
        public static Animation inFromTopAnimation()
        {
            Animation inFromTop =
                    new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, -1.0f, Animation.RELATIVE_TO_PARENT, 0.0f);
            inFromTop.setDuration(350);
            inFromTop.setInterpolator(new AccelerateInterpolator());
            return inFromTop;
        }
    
        public static Animation outToBottomAnimation()
        {
            Animation outtoBottom =
                    new TranslateAnimation(Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, 0.0f,
                            Animation.RELATIVE_TO_PARENT, 0.0f, Animation.RELATIVE_TO_PARENT, +1.0f);
            outtoBottom.setDuration(350);
            outtoBottom.setInterpolator(new AccelerateInterpolator());
            return outtoBottom;
        }
    }
    

    strings.xml //在res/values

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="goto_first">Slide down to see the first panel</string>
        <string name="goto_second">Slide up to see the second panel</string>
        <string name="loremipsum1">Lorem ipsum dolor sit amet...</string>
        <string name="loremipsum2">Sed ut perspiciatis unde omnis iste...</string>
        <string name="app_name">AccordionSample</string>
    </resources>
    

    编辑
    如果您想将不同的视图拆分为不同的布局 xml,请说

    1. first_view.xml 和
    2. 第二个view.xml,

    你应该修改你的onCreate 方法:

    flipper = (ViewFlipper)findViewById(R.id.flipper);
    LayoutInflater inflater = getLayoutInflater();
    
    final View firstView = inflater.inflate(R.layout.first_view, flipper, false);
    flipper.addView(firstView);
    
    final View secondView = inflater.inflate(R.layout.second_view, flipper, false);
    flipper.addView(secondView);
    
    firstView.findViewById(R.id.btn_next).setOnTouchListener(this);
    secondView.findViewById(R.id.btn_prev).setOnTouchListener(this);
    

    编辑
    或者更优雅、更高效,只需将您为不同视图创建的布局 xml 包含到您的 main.xml 中:

    <?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">
        <ViewFlipper android:id="@+id/flipper" 
            android:layout_width="fill_parent" android:layout_height="fill_parent">
            <include android:id="@+id/flipping_view_1" layout="@layout/flipping_view_1" />
            <include android:id="@+id/flipping_view_2" layout="@layout/flipping_view_2" />
        </ViewFlipper>
    </RelativeLayout>
    

    在哪里

    • layout/flipping_view_1.xml 包含第一个RelativeLayout, 和
    • layout/flipping_view_2.xml 包含第二个RelativeLayout

    原始 main.xml 中的 ViewFlipper

    要了解更多关于 android 布局的可重用性以及整体布局技术,您应该查看Romain Guy's great post covering layout tricks

    【讨论】:

    • @rekaszeru 有什么办法可以在活动之间做到这一点吗?导致布局过于复杂,无法拥有一个 xml 布局
    • 我不知道。另外,请参阅我的最新更新:如果将布局拆分为单独的 xml 文件(将它们保持在同一个活动中)就足够了,那么该技术可能对您有用。
    • 是的,这正是我正在做的。就是想知道有没有别的办法!非常感谢。
    • 嗨哈迪斯,请看一下我上次的更新,&lt;include&gt; 标签可能会帮助您清理 xml,而且您不必更改逻辑(java 代码)。
    • @rekaszeru 嗨,是的,我就是这么做的。工作出色。
    【解决方案2】:
    猜你喜欢
    • 1970-01-01
    • 2014-05-22
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多