Android 自定义仿IOS上拉菜单实现

最近在做一个歪果仁给我外包的项目,主页需要做一个类似于IOS那种上拉菜单的功能,于是一时间试了各种方法,什么Spinner、Drawlayout,SlidingMenu等等等等,都搞不了,后面实在被逼无奈自己写了一个上拉菜单控件,居然还能凑合着用!

姑且可以叫他MyPullUpMenu! 有时间我会封装一下发到GitHub。

效果图如下:

实现的功能有仨:

1、上拉位置未超过一定距离时,松开自动往下滚动。

2、上拉位置超过一定距离时,松开自动网上滚动直至菜单全展开。

3、菜单滚动到顶部并停止滚动时,点击按钮菜单自动回滚到底部

实现步骤:

1.首先写MyPullUpMenu的xml界面:

    <LinearLayout
        android:id="@+id/main_textmenu"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >

        <ImageButton
            android:id="@+id/main_dropdownbtn"
            android:layout_width="80dp"
            android:layout_height="30dp"
            android:layout_alignParentBottom="true"
            android:layout_centerHorizontal="true"
            android:layout_gravity="center"
            android:background="@drawable/main_shape0"
            android:paddingBottom="5dp"
            android:paddingLeft="20dp"
            android:paddingRight="20dp"
            android:paddingTop="5dp"
            android:scaleType="fitXY"
            android:src="@drawable/main_bottonbtn"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"
            android:orientation="vertical">

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn1"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="相片"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn2"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="老师"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn3"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="升级"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn4"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="活动"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn5"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="QR扫描"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn6"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="字典"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn7"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="店"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn8"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="建议"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn9"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="设置"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn10"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="新闻"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

            <com.whale.nangua.omegaenglish.view.TextViewKaiti
                android:id="@+id/main_btn11"
                android:layout_width="match_parent"
                android:layout_height="40dp"
                android:background="@drawable/main_shape_txtbtn"
                android:gravity="center"
                android:text="关于我们"
                android:textColor="@android:color/white"
                android:textSize="30sp"/>

        </LinearLayout>

效果图:

2.逻辑功能实现:

首先,需要在加载的过程中将这个布局文件移动到底部:

main_textmenulayout.setY(screenHeight - 30 * scale);

这里的screenHeight是屏幕高度,30是按钮高度,scale是屏幕像素密度比。

接着,需要得到整个空间的高度main_textmenulayout_HEIGHT:

main_textmenulayout_HEIGHT = 40 * scale * 11 + 30 * scale;

这里也可以改成得到整个空间高度之后再乘以缩放比进行缩放,我这样写是很不科学的,违反了可重用性QAQ。

之后再到按钮的onTouch里进行触摸事件判断就可以了:

        main_dropdownbtn.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                Y = (int) event.getRawY();
                ObjectAnimator animator;
                switch (event.getAction()) {
                    case MotionEvent.ACTION_MOVE:
                        if ((Y <= (screenHeight - 30 * scale)) && (Y >= screenHeight - main_textmenulayout_HEIGHT  )) {
                            main_textmenulayout.setY(Y);
                        }
                        break;
                    case MotionEvent.ACTION_UP:
                        if (Y <= (screenHeight - main_textmenulayout_HEIGHT + 30 * scale)) {
                            break;
                        }

                        int Yposition = (int) (screenHeight - main_textmenulayout_HEIGHT / 2);
                        if (Y <= Yposition) {
                            animator = ObjectAnimator.ofFloat(main_textmenulayout, "translationY", screenHeight - main_textmenulayout_HEIGHT);
                        } else {
                            animator = ObjectAnimator.ofFloat(main_textmenulayout, "translationY", screenHeight - 30 * scale);
                        }
                        animator.setDuration(300);
                        animator.start();
                        break;

                }
                return false;
            }
        });

最后,还有按钮的点击下滑事件,需要在该按钮的onClickListener中的onClick方法中定义:

ObjectAnimator animator = ObjectAnimator.ofFloat(main_textmenulayout, "translationY", screenHeight - 30 * scale);
animator.setDuration(300);
animator.start();

因为是商业外包项目,源码就不提供了,就这样,需要的可以私聊我。

时间: 2024-10-13 05:56:59

Android 自定义仿IOS上拉菜单实现的相关文章

Android中自定义ListView实现上拉加载更多和下拉刷新

ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,GitHub上有一些开源库可以使用,但是本着学习的精神,我做的是使用自定义ListView实现这个功能. 思路:谷歌提供的ListView是不能提供下拉刷新和下拉加载的,所以我们就需要重写ListView.在ListView的头部和尾部加上我们的布局文件(progressbar). 先说上拉加载更多实现

Android 高仿 QQ5.0 侧滑菜单效果 自定义控件来袭【学习鸿洋_视频博客笔记总结】

学习鸿洋博客:http://blog.csdn.net/lmj623565791/article/details/39257409 学习鸿洋视频:慕课网视频 看看Android 高仿 QQ5.0 侧滑菜单效果 自定义控件实现效果: 技术上,继承HorizontalScrollView 加上自定义ViewGroup来实现: 1.onMeasure:决定内部View(子View)的宽和高,以及自己的宽和高 2.onLayout:决定子View的放置位置 3.onTouchEvent[监听动作] 自定

UIAlertController类--sheet上拉菜单1(基本的)

一.效果 二.代码实现 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { [self sheetTest1]; } /** 注意:不能在上拉菜单中添加文本框 如果强行添加了文本框,会报运行时错误: reason: 'Text fields can only be added to an alert controller of style UIAlertControllerStyleAler

仿QQ下拉菜单

<!DOCTYPE html><html><head><meta charset="UTF-8"><meta name="description" content=""><meta name="keywords" content=""><script src="http://libs.baidu.com/jquery/1

iOS下拉菜单效果实现

原文链接: iOS下拉菜单效果实现 简书主页:http://www.jianshu.com/users/37f2920f6848 Github主页:https://github.com/MajorLMJ iOS开发者公会-技术1群 QQ群号:87440292 iOS开发者公会-技术2群 QQ群号:232702419 iOS开发者公会-议事区   QQ群号:413102158

ionic-Javascript:ionic 上拉菜单(ActionSheet)

ylbtech-ionic-Javascript:ionic 上拉菜单(ActionSheet) 1.返回顶部 1. ionic 上拉菜单(ActionSheet) 上拉菜单(ActionSheet)通过往上弹出的框,来让用户选择选项. 非常危险的选项会以高亮的红色来让人第一时间识别.你可以通过点击取消按钮或者点击空白的地方来让它消失. 实例 HTML 代码 <body ng-app="starter" ng-controller="actionsheetCtl&quo

iOS 下拉菜单 FFDropDownMenu自定义下拉菜单样式实战-b

Demo地址:https://github.com/chenfanfang/CollectionsOfExampleFFDropDownMenu框架地址:https://github.com/chenfanfang/FFDropDownMenu 老样子,先附上两张效果图 customMenuStyle.gif customMenuStyle.png 首先自定义一个继承于FFDropDownMenuBasedModel的菜单模型.h文件 #import <FFDropDownMenuBasedMo

Android自定义控件:仿美团下拉菜单及相关代码优化

背景 最近的项目中用到了类似美团中的下拉多选菜单,在实际开发过程中,也发现了一些问题,主要归纳如下: 1.当菜单较为复杂时,如果不能设计好代码逻辑,将造成控件难于维护 2.美团菜单可以连续点击顶部tab,切换不同菜单,而我使用的popupWindow似乎在展开一个菜单时点击其他tab,菜单就会收回. 本文将针对如上两个问题进行一些讨论,最终给出较为合理的解决方案. 程序结构 由于菜单涉及多级多项,如果把UI和其他逻辑堆在一起写,必然会造成代码过于庞大,甚至没有办法扩展,更谈不上及时变更需求. V

Android自定义控件——仿优酷圆盘菜单

尊重作者劳动成果,转载时请标明该文章出自  http://blog.csdn.net/allen315410/article/details/39232535 最近学习的时候,看见一份资料上教怎么写自定义控件,上面的示例用的是优酷早期版本的客户端,该客户端的菜单就是一个自定义的组件(现在的版本就不清楚有没有了,没下载过了),好吧,废话不多说,先上优酷的原型图. 这个自定义组件感官上看是,里外三层设计,每一层上有布置不同的菜单按钮,每一层又设置了进入和退出的动画,来增强用户的体验效果.这种设计非常