弹出、收缩的菜单

Android下拉菜单弹出和收缩效果实现指南 PopupWindow是一种可以在屏幕上显示自定义内容的悬浮窗组件,广泛应用于Android应用中,用于提供额外的信息显示或操作选项。它不会占据屏幕主要部分,使得用户在与主界面交互的同时,也能轻松查看或使用PopupWindow内的内容。菜单项的样式和属性决定了下拉菜单的外观和用户交互体验。以下是一些关键属性::菜单项的宽度,常用值包括和。:菜单项的高度,同上。:菜单项的内边距,为菜单项添加边距可以使内容显得更为清晰。:菜单项的文字颜色。 阅读详情

这里写图片描述

package pic.com.menudemo;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.Toast;

/**
 * Created by a on 2016/7/7.
 */
public class MyMenu extends RelativeLayout implements View.OnClickListener {
    private View view;
    private ImageView confirm;
    private ImageView plus;
    private ImageView edit;
    private ImageView send;

    boolean isOpen = false;
    private float confirmX;
    private float plusX;
    private float sendX;
    private float editX;

    public MyMenu(Context context) {
        this(context, null);
    }

    public MyMenu(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
        setListener();
    }


    private void init() {
        view = LayoutInflater.from(getContext()).inflate(R.layout.my_menu, MyMenu.this);
        confirm = (ImageView) view.findViewById(R.id.confirm);
        plus = (ImageView) view.findViewById(R.id.plus);
        edit = (ImageView) view.findViewById(R.id.edit);
        send = (ImageView) view.findViewById(R.id.send);
//      为了获得控件平均分布的效果,通过xml布局均分好控件,再到代码中获得均分后控件的位置getX
//      不能立刻获取getX,刚开始立马获得的话,全部为0,因为系统还没有把这些view布置好
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    sleep(300);//这里睡的时间要稍微长一点,大于100为宜,否则得不到X位置
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
//               注意getX()得到的是这个View在手机屏幕上的X坐标
//                而TranslationX在首次运行时,永远是0,他表示的是此View离开原始位置的距离
                confirmX = confirm.getX();
                plusX = plus.getX();
                sendX = send.getX();
                editX = edit.getX();
                Log.e("fs:confirmX", confirmX + "");
                Log.e("fs:plusX", plusX + "");
                Log.e("fs:sendX", sendX + "");
                Log.e("fs:editX", editX + "");
                confirm.setX(plusX);//此时,这个view已经离开了原始位置了,所以这是打印的TranslationX不是0,是plusX-confirmX
                send.setX(plusX);
                edit.setX(plusX);
                Log.e("qqq", confirm.getTranslationX() + "");
            }
        }.start();


    }


    private void setListener() {
        confirm.setOnClickListener(this);
        plus.setOnClickListener(this);
        edit.setOnClickListener(this);
        send.setOnClickListener(this);
    }


    @Override
    public void onClick(View v) {
        switch (v.getId()) {


            case R.id.plus:
                if (!isOpen) {

                    confirm.setVisibility(VISIBLE);
                    edit.setVisibility(VISIBLE);
                    send.setVisibility(VISIBLE);
                    plus.animate().rotation(45).setDuration(200).start();
                    Log.e("qqq", confirm.getTranslationX() + "");
//                    注意这里的translationX要回到原始位置
                    ObjectAnimator animatorConfirm = ObjectAnimator.ofFloat(confirm, "translationX", 0);
                    ObjectAnimator animatorEdit = ObjectAnimator.ofFloat(edit, "translationX", 0);
                    ObjectAnimator animatorSend = ObjectAnimator.ofFloat(send, "translationX", 0);

                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.setDuration(200);
                    animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
                    animatorSet.playTogether(animatorConfirm, animatorEdit, animatorSend);
                    animatorSet.start();
                    isOpen = true;
                } else {
                    plus.animate().rotation(0).setDuration(100).start();
//                    注意这里的translationX要运行到plus后面
                    ObjectAnimator animatorConfirm = ObjectAnimator.ofFloat(confirm, "translationX", plusX - confirmX);
                    ObjectAnimator animatorEdit = ObjectAnimator.ofFloat(edit, "translationX", plusX - editX);
                    ObjectAnimator animatorSend = ObjectAnimator.ofFloat(send, "translationX", plusX - sendX);
                    AnimatorSet animatorSet = new AnimatorSet();
                    animatorSet.setDuration(200);
                    animatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
                    animatorSet.playTogether(animatorConfirm, animatorEdit, animatorSend);
                    animatorSet.start();
                    animatorSet.addListener(new AnimatorListenerAdapter() {
                        @Override
                        public void onAnimationEnd(Animator animation) {
                            super.onAnimationEnd(animation);
                            confirm.setVisibility(GONE);
                            edit.setVisibility(GONE);
                            send.setVisibility(GONE);
                        }
                    });
                    isOpen = false;
                }

                break;

            case R.id.edit:
//                这里可以暴露接口,就不写了
                Toast.makeText(getContext(),"edit",Toast.LENGTH_SHORT).show();
                break;

            case R.id.send:
                Toast.makeText(getContext(),"send",Toast.LENGTH_SHORT).show();
                break;
            case R.id.confirm:
                Toast.makeText(getContext(),"confirm",Toast.LENGTH_SHORT).show();
                break;
        }
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}
<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="pic.com.menudemo.MainActivity">


    <ImageView
        android:id="@+id/send"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/bg_circle"
        android:padding="10dp"
        android:src="@drawable/send"
        android:visibility="invisible" />

    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ImageView
        android:id="@+id/edit"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/bg_circle"
        android:padding="10dp"
        android:src="@drawable/edit"
        android:visibility="invisible" />

    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ImageView
        android:id="@+id/confirm"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/bg_circle"
        android:padding="10dp"
        android:src="@drawable/confirm"
        android:visibility="invisible" />

    <View
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1" />

    <ImageView
        android:id="@+id/plus"
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:background="@drawable/bg_circle"
        android:padding="10dp"
        android:src="@drawable/plus"
        android:visibility="visible" />


</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="pic.com.menudemo.MainActivity">

    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="larg_text" />

    <pic.com.menudemo.MyMenu
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true" />
</RelativeLayout>
Android带有动画效果可弹出并收回的一组按钮菜单 实现起来很简单,看到代码之后我相信你就可以随心所欲地做出带有酷炫的动画效果的按钮菜单了。环境:Android Studio 立即下载

相关推荐

Android封装popwindow类(下拉菜单弹出和收缩效果)

popwindow 实现下拉菜单的弹出和收缩效果 http://blog.youkuaiyun.com/jdsjlzx/article/details/52000107资源

android 扇形弹出菜单,ArcMenu 自己封装的扇形弹出菜单库

ArcMenu自己封装的扇形弹出菜单库。Gradle dependency build.gradlerepositories { mavenCentral() mavenLocal() }...dependencies {compile 'com.github.CCCCoder:ArcMenu:v1.0'}Example Usage:你可以根据你的需要添加各个子项的iconposition:位置在...

weixin_42109639的博客 257

Android 带有弹出收缩动画的扇形菜单实例

最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下。 效果如下 public class MainActivity extends AppCompatActivity implements View.OnClickListener { private ImageView imgPublish; private TextView textView1; private TextView textView2; private boolean isMenuOpen = false; private List textViews =

android顶部菜单伸缩,安卓顶部菜单(OptionsMenu)

就是 ActionBar 右上角三个点点,点开有一个菜单。1、在 res 的 menu 下创建一个 Menu 资源文件。android:id = "@+id/itpow_query"android:title= "查看"/>2、在 Activity 中响应菜单如果多个 Activity 中均涉及,就放在一个基类中。// 显示菜单@Overridepublic boolean onCreate...

weixin_39654067的博客 244

Ollama模型路径迁移实战:Windows/Mac/Linux三系统保姆级教程(附常见问题排查)

本文提供了一份详细的Ollama模型路径迁移教程,涵盖Windows、macOS和Linux三大操作系统。针对默认安装路径占用系统盘空间的问题,文章指导用户如何安全移动模型文件、配置环境变量、重启服务,并附有迁移后的验证步骤与常见问题排查方法,帮助用户高效管理本地AI模型存储。

gray5的博客 545

/proc/sys/vm/max_map_count耗尽时,调用glibc 2.11.3 free()导致程序crash,问题追踪和解决

1. 问题 在客户环境下,当我们的程序消耗较大内存时,会偶尔crash。 通过gdb分析,程序core dump在malloc/free函数内。 当把/proc/sys/vm/max_map_count 从65530增加到131070,程序再也不crash。 相关命令 echo 131073 > /proc/sys/vm/max_map_count 2.  core

万大胖博客,苦并快乐着 4430

Android 自定义扇形菜单 带动画

Android扇形菜单 本文原创,转载请注明出处 就随便放几张图吧 链接 https://github.com/zcy2280497150/SectorMenuDemo 运行时候弹出来的动画效果还是不错的 基于https://www.jianshu.com/p/4518da430a01实现 ...

qq_23915507的博客 719

[Unity_Plastic SCM小技巧] 使用 UnityYAMLMerge 工具合并场景和预制件文件

首先YAMLMerge工具其实并不局限于PlasticSCM,git也可以,它是内置在Editor内的一个更加智能的版本控制工具,只不过正常不会启用,他的目录在C:\Program Files\Unity\Editor\Data\Tools\UnityYAMLMerge.exe(Unity Editor安装目录),MAC上:/Applications/Unity/Unity.app/Content...

unityofficial的博客 1146

Android CircularFloatingActionMenu (1)

Android CircularFloatingActionMenu (1) Android CircularFloatingActionMenu在github上项目主页地址:https://github.com/oguzbilgener/CircularFloatingActionMenu Android CircularFloatingActionMenu要实现的效果如动态图所示:

Zhang Phil 7009

unity打包流程整理-Windows/Mac/Linux平台

1.Platform(平台)功能: 选择目标构建的目标平台选项PC, Mac & Linux Standalone: 适用于 Windows、Mac 和 Linux 平台2.Target Platform(目标平台)功能: 选择具体的操作系统版本选项Windows: 针对 Windows 操作系统Mac: 针对 macOS 操作系统Linux: 针对 Linux 操作系统3.Architecture(架构)功能: 选择应用程序的目标处理器架构选项x86: 针对 32 位系统。

weixin_42333247的博客 5141

腾讯云TDSQL MySQL版 - 开发指南兼容性

语言结构 分布式实例支持所有 MySQL 使用的文字格式,包括: String Literals Numeric Literals Date and Time Literals Hexadecimal Literals Bit-Value Literals Boolean Literals NULL Values String Literals String Literals 是一个 bytes 或者 characters 的序列,两端被单引号'或者双引号"包围,TDSQL MySQL版

weixin_43872058的博客 911

android 上下收缩动画,Android 带有弹出收缩动画的扇形菜单实例

最近试着做了个Android 带有弹出收缩动画的扇形菜单,留个笔记记录一下。效果如下public class MainActivity extends AppCompatActivity implements View.OnClickListener {private ImageView imgPublish;private TextView textView1;private TextView ...

weixin_42509267的博客 454

DDR5 的 PI: DIMM 上 PMIC,正在制造一批“新型 EMI 问题”

DDR5 的 PI,不再只是“供电设计”,而是一次“噪声管理设计”。电压稳定本地调节高频噪声EMI 风险系统不确定性DDR5 真正难的地方,不是跑起来,而是——在最差条件下,它还能不能一直跑。而 DIMM 上那颗 PMIC,正是你绕不开的关键角色。

weixin_43199439的博客 184

popwindow实现下拉菜单弹出和收缩效果

别的不多说先上图吧 以前做这样的功能,我都是自定义一个LinerLayout,然后控制它的隐藏和显示,还需要添加弹出和隐藏的动画效果。另外还需要处理点击空白处和返回该键下拉菜单自动关闭。今天在eoe上无意看到popwindow也能实现这样的功能,而且根本不需要处理动画效果和空白处、返回键点击自动关闭的功能。哎,看来我真的out了,直接上代码: 这里是自定义的PopMen

duanyu218的专栏 4698

TIA博途WINCC的触摸屏VB脚本入门指南(嵌入式)

通过编写事件处理程序,您可以响应触摸屏元素的各种事件,并实现自定义的功能。本文将为您提供TIA博途WINCC触摸屏VB脚本的入门指南,帮助您了解基本的脚本编写和嵌入式开发。假设我们有一个名为"Button1"的按钮元素,当用户点击该按钮时,触发相应的事件处理程序,并在触摸屏上显示一条消息。然后回到触摸屏界面编辑器,在按钮元素的属性窗口中找到"按下"事件,并选择刚才创建的脚本文件作为事件处理程序。现在,当用户点击按钮时,触摸屏将执行相应的事件处理程序,并显示一条消息框,内容为"按钮被点击了!

CodeSageX的博客 4423

【天气雷达】双偏振产品-差分传播相移KDP详解

双偏振产品-差分传播相移KDP详解。

珞瑜的博客 2662

android 上下收缩动画,Android 带有弹出收缩动画的扇形菜单

扇形菜单动画.gifpublic class MainActivity extends AppCompatActivity implements View.OnClickListener {private ImageView imgPublish;private TextView textView1;private TextView textView2;private boolean isMenu...

weixin_39628498的博客 230

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

android 随手记 popwindow实现下拉菜单弹出和收缩效果

别的不多说先上图吧 以前做这样的功能,我都是自定义一个LinerLayout,然后控制它的隐藏和显示,还需要添加弹出和隐藏的动画效果。另外还需要处理点击空白处和返回该键下拉菜单自动关闭。今天在eoe上无意看到popwindow也能实现这样的功能,而且根本不需要处理动画效果和空白处、返回键点击自动关闭的功能。哎,看来我真的out了,直接上代码: 这里是自定义的PopMen

android小天地 3495

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

PyQt5超好看的登录器模板(圆角无边框阴影)--附带使用教程

对应源码以及演示视频链接PyQt精美现代化风格登录器_哔哩哔哩_bilibili 对应使用教程PyQt登录器模板使用教程(登录后转主程序)_哔哩哔哩_bilibili 登录成功后跳转主界面 主界面能实现弹出式菜单通过动画完成菜单的收缩以及弹出 对应菜单栏链接Qt实现弹出式导航栏_哔哩哔哩_bilibili ...

qq_62095154的博客 2222

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

android 扇形悬浮按钮,android 利用FloatActionButton悬浮按钮实现扇形折叠与隐藏

android 利用FloatActionButton悬浮按钮实现扇形折叠与隐藏首先请看效果图: 来看看布局代码:因为,我们用floatactionbutton,点击要弹出菜单,弹出的过程和收缩的过程要进行一些动画操作,再此,我将动画封装为工具类。package com.example.myfloatactionbutton;import android.content.Context;impor...

weixin_42510360的博客 511

jQuery实例——折叠菜单

点击一级菜单,会弹出二级菜单,并且其他一级菜单会收缩。同时,点击的一级菜单箭头方向会向下 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>折叠菜单</title> <style> * { margin: 0; padding: 0; } .nav { lis.

jwz934738949的博客 1825

Js+DVML:很酷实用的右键弹出菜单

网页特效代码|JsCode.CN|---Js+DVML:很酷实用的右键弹出菜单v/:*{behavior:url(#default#VML);}.menulist{position:static;PADDING-TOP:6;LETTER-SPACING:8;HEIGHT:20;TEXT-ALIGN:center;margin-bottom:-2}var menutime1=null,showobj

Bndy.Net 655

android 弹出菜单环形,『Android自定义View实战』实现一个小清新的弹出式圆环菜单...

前言Android表现快捷菜单的形式有很多种,比如使用PopupWindow弹出来的小弹窗,类似QQ的侧拉功能菜单,以及之前讲过的弧形菜单( Android 自定义弧形旋转菜单栏——卫星菜单),这次要实现的是一个比较酷炫的菜单效果,虽然适合使用的场景可能不如前几种,但是整体动画效果还是蛮不错的,如下:YRoundelMenu.gif实现思路由于我们是作为一个菜单的形式,所以可以采用继承ViewGr...

weixin_30471581的博客 783
上一篇: 如何在图片上写文字
下一篇: Android Studio 如何关联源码(关联你想要的任何版本的源码)
Android_Study_OK
博客等级 码龄11年 91粉丝 128原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值