精华内容
下载资源
问答
  • Android实战之悬浮菜单App实现

    千次阅读 2019-10-24 19:27:30
    Android实战之悬浮菜单App实现 该App已经基本完成,图片后续制作完成会上传,现在开始编写整个开发相关的个人学习过程,根据App的整体结构大致分为以下几个部分: ListView与RecyclerView 本次实战使用的...

    Android实战之悬浮球菜单App实现

    该App已经基本完成,图片后续制作完成会上传,现在开始编写整个开发相关的个人学习过程,根据App的整体结构大致分为以下几个部分:

    ListView与RecyclerView

    本次实战使用的RecyclerView,自定义了一个Adapter实现了三个页面的RecyclerView的编写。

    实现悬浮球的桌面显示

    通过WindowMangaer实现悬浮球的拖动,贴边显示。

    Animation动画

    悬浮球在不同位置拥有不同的动画,App内部界面拥有内存信息展示和点击动画,这部分主要介绍部分关键动画的计算以及实现。

    获取桌面应用包名信息

    通过PackageMangager的queryIntentActivity筛选符合条件的应用启动项,并通过Systemflag区分是否为系统应用。

    广播与数据库的设计

    该部分介绍本次使用的广播以及数据库的相关设计。

    内存信息获取以及绘制饼状图显示内存信息

    该部分为计划实现,现已实现内存信息获取和显示,未进行饼状图绘制,后续有时间会完成。

    App展示

    该部分在gif制作完成后会上传,未添加链接的标题为还没有完成文档的部分,相应文档还在编写中。
    主要代码和apk已经上传到github,个人练手写的,所以没有用别的库↓
    https://github.com/ideal-fox/floatingBall-packageViewer

    展开全文
  • Mac悬浮菜单.zip

    2019-12-13 13:08:56
    配合BTT实现悬浮菜单,在这里定义了多个个菜单选项,其中有打开、切换应用的,也有一些小工具,比如查看日历、一键打开自己的博客网站、打开工作相关的窗口、一键隐藏所有APP让桌面整洁、一键启动下班流程和一键启动...
  • FloatMenuSample ...简介:android 悬浮菜单,可在 launcher 或 app 中使用 更多:作者 提 Bug  标签:   [ ] crosg/FloatMenuSample transfer from yiming/FloatMenuSample GIF ...

    FloatMenuSample

    项目地址:crosg/FloatMenuSample 

    简介:android 悬浮窗菜单,可在 launcher 或 app 中使用

    更多:作者   提 Bug   

    标签:

     

    Download ]

    crosg/FloatMenuSample transfer from yiming/FloatMenuSample

    GIF

    展开全文
  • android float menu in app 权限 compatibility & permissions 无权限需求,支持 api 11 ++ for use: 使用示例 see sample 1: mFloatMenu = new FloatLogoMenu.Builder() .withActivity(mActivity) // .with...
  • android底部悬浮菜单栏的设计与实现

    千次阅读 2015-05-08 19:43:03
    android底部悬浮菜单栏的设计与实现最近自己弄了一个项目在做,目前基本功能已经开发完成了,app名称叫做博客集 ,最初的目的有两个,一个是出于自己的需求,有时候需要在手机端阅读一些自己喜欢或者订阅的博客和...

    android底部悬浮菜单栏的设计与实现

    最近自己弄了一个项目在做,目前基本功能已经开发完成了,app名称叫做博客集,最初的目的有两个,一个是出于自己的需求,有时候需要在手机端阅读一些自己喜欢或者订阅的博客和资讯,所以想通过RSS订阅的方式实现在手机端的阅读,另一方面是想在实际的项目开发中学习,这样子可能效果会更好一点。虽然项目已经基本完成,但是还有一些细节的东西需要完善一下,我会在接下来的几篇博客中总结博客集这个项目所用到的一些知识点,算是对前一阶段学习的总结吧,如果有什么讲得不好的地方或者有更好的方案解决的话,请各位不吝赐教啊!!!
    今天主要要分享的内容是博客集项目中用到的底部悬浮菜单栏的设计与实现(主要是用于社交分享时的显示)

    首先我先大体说明以下具体的实现过程

    1.layout文件的设计,可以将底部菜单栏的layout独立出来,加以include标签包含进去(可以实现复用),这里的示例主要是做了一个分享的菜单栏(具体的布局文件见下面的share_dialog_footer_layout.xml或者移步github查看完整代码示例)
    2.在MainActivity.java文件中主要的操作步骤就是对底部菜单栏的layout进行显示和隐藏的操作,主要利用的属性就是View.GONE(隐藏)和View.VISIBLE(显示),点击相应的按钮或者触摸事件控制底部菜单栏的layout的显示与隐藏(具体代码见下面的MainActivity.java或者移步github查看完整代码示例)

    首先先来看一下share_dialog_footer_layout.xml文件的内容:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:gravity="center"
        android:orientation="vertical"
        android:id="@+id/share_main_layout"
        android:visibility="gone"
        android:background="@color/white"
        >
    
        <LinearLayout 
            android:layout_marginTop="10dp"
            android:id="@+id/share_item_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:orientation="horizontal"
            android:weightSum="4"
            >
            <LinearLayout 
                android:layout_margin="5dp"
                android:id="@+id/wechat_session_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView 
                    android:id="@+id/wechat_share_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/logo_wechat_64x64"/>
                <TextView 
                    android:id="@+id/wechat_share_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="好友分享"/>
            </LinearLayout>
    
            <LinearLayout 
                android:layout_margin="5dp"
                android:id="@+id/wechat_favourite_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView 
                    android:id="@+id/wechat_favourite_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/logo_wechatfavorite_64x64"/>
                <TextView 
                    android:id="@+id/wechat_favourite_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="微信收藏"/>
            </LinearLayout>
    
            <LinearLayout 
                android:layout_margin="5dp"
                android:id="@+id/wechat_moments_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView 
                    android:id="@+id/wechat_moments_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/logo_wechatmoments_64x64"/>
                <TextView 
                    android:id="@+id/wechat_moments_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="朋友圈分享"/>
            </LinearLayout>
    
            <LinearLayout 
                android:layout_margin="5dp"
                android:id="@+id/sina_share_layout"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical">
                <ImageView 
                    android:id="@+id/sina_share_view"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/logo_sinaweibo_64x64"/>
                <TextView 
                    android:id="@+id/sina_share_text"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="微博分享"/>
            </LinearLayout>
        </LinearLayout>
    
        <Button 
            android:layout_marginLeft="30dp"
            android:layout_marginRight="30dp"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="10dp"
            android:gravity="center"
            android:id="@+id/cancel_button"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/blue"
            android:text="取消"
            android:textSize="25sp"
            android:textColor="@color/white"/>
    
    </LinearLayout>
    

    在来看一下activity_main.xml文件中的内容:

    <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"
    tools:context="com.example.bottommenulist.MainActivity" >
    
    <RelativeLayout 
        android:id="@+id/header_layout"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@color/blue">
        <ImageView 
            android:layout_alignParentLeft="true"
            android:layout_marginLeft="5dp"
            android:layout_marginTop="8dp"
            android:id="@+id/back_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_arrow_left_white_18dp"/>
        <TextView 
            android:layout_toRightOf="@id/back_image"
            android:layout_marginTop="10dp"
            android:layout_marginBottom="10dp"
            android:id="@+id/back_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="返回"
            android:textSize="25sp"
            android:textColor="@color/white"/>
        <ImageView 
            android:layout_alignParentRight="true"
            android:layout_marginRight="10dp"
            android:layout_marginTop="8dp"
            android:id="@+id/share_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:src="@drawable/ic_share_variant_white_18dp"/>
    
    </RelativeLayout>
    
    <include 
        android:layout_alignParentBottom="true"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        layout="@layout/share_dialog_footer_layout"/>
    

    (注:布局文件的具体实现不详述了,直接看代码就可以看懂了)

    重点说明一下MainActivity.java文件中控制底部菜单栏的显示与隐藏的具体实现原理:

    import android.app.Activity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.view.Window;
    import android.view.View.OnClickListener;
    import android.view.animation.Animation;
    import android.view.animation.AnimationUtils;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    
    /**
     * @author asminer
     *  注意,这里仅仅是做了底部悬浮菜单栏的显示与隐藏的实现示例,
     *  更多的操作可以根据自己的需要添加或者进行相应的修改
     */
    public class MainActivity extends Activity implements OnClickListener{
    
        private ImageView shareView;
        private LinearLayout shareLayout;
        private Button cancelButton;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            requestWindowFeature(Window.FEATURE_NO_TITLE);
            setContentView(R.layout.activity_main);
    
            initView();
        }
    
        /**
         * 初始化View组件
         */
        public void initView(){
            shareView = (ImageView)findViewById(R.id.share_image);
            shareView.setOnClickListener(this);
    
            /**
             * 底部悬浮菜单的layout
             */
            shareLayout = (LinearLayout)findViewById(R.id.share_main_layout);
            cancelButton = (Button)findViewById(R.id.cancel_button);
            cancelButton.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
            case R.id.share_image:
                convertView(shareLayout);
                break;
            case R.id.cancel_button:
                convertView(shareLayout);
                break;
    
            default:
                break;
            }
        }
    
        /**
         * 控制底部悬浮菜单的显示与隐藏,并且设置了相应的动画效果
         * @param view
         */
        public void convertView(View view){
            Animation viewAnimation;
            if(view.getVisibility()==View.VISIBLE){
                System.out.println("view gone...");
                Log.i("share","view gone...");
                viewAnimation = AnimationUtils.loadAnimation(this,R.anim.share_anim_gone);
                view.setVisibility(View.GONE);
            }else{
                System.out.println("view visible...");
                Log.i("share", "view visible...");
                view.setVisibility(View.VISIBLE);
                viewAnimation = AnimationUtils.loadAnimation(this,R.anim.share_anim_show);
            }
            view.startAnimation(viewAnimation);
        }
    
    }
    

    (注:菜单Item的点击事件这里并没有添加,具体如何实现取决于项目的需求,其中显示与隐藏的过程总添加了一些View动画,若对View动画还不熟悉,可以参考我之前写的android View动画初探

    上张图:
    android底部悬浮菜单栏的设计与实现

    这次有关android底部悬浮菜单栏的设计与实现的总结就到此为止了,完整代码请移步github查看吧,接下来还会继续总结在博客集中用到的一些技术知识点,如果各位有兴趣的话,可以下载app来查看(有兴趣的话可以给我一些建议啊,我会不断完善博客集这个app的,如果可以,你们也可以加入进来一起进行开发,一起学习交流.)

    展开全文
  • 动画必须有(一): 属性动画浅谈 githhub传送门 目录 ... FloatingActionButton基础 ... 悬浮按钮是我非常喜欢的, 可以把... 比如日记app里的新建日记, 阅读类app里的喜欢. 稍微处理一下可以将悬浮按钮扩展成悬浮菜...

    动画必须有(一): 属性动画浅谈

    githhub传送门


    目录

    • 前言
    • 效果图
    • FloatingActionButton基础
    • FloatingActionButton实例
    • 最后

    前言

    悬浮按钮是我非常喜欢的, 可以把最关键的功能放入到悬浮按钮中. 比如日记app里的新建日记, 阅读类app里的喜欢. 稍微处理一下可以将悬浮按钮扩展成悬浮菜单, 来看下实现吧! github直接看源码


    效果图

    废话不多说, 先看图, 感兴趣再往下看!

    悬浮菜单


    FloatingActionButton基础

    记得导包.

    compile 'com.android.support:design:26.+'

    可以看看谷歌官方介绍. 你会被瞬间圈粉. 然后是官方文档, 这个文档说了如何调用.

    • 搭配Snackbar
      官方推荐配合Snackbar来使用, 这都不多说了.

    配合Snackbar

    • 显示和隐藏
      然后还有就是悬浮按钮的隐藏和显示函数.
    Button btHide = (Button) findViewById(R.id.bt_hide);
    btHide.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fab.hide();
        }
    });
    
    Button btShow = (Button) findViewById(R.id.bt_show);
    btShow.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            fab.show();
        }
    });

    隐藏和显示

    • 颜色
      可以设置点击颜色app:rippleColor, 以及背景颜色app:backgroundTint. 我将背景色改成蓝色, 点击水波纹扩散变为紫色, 效果图如下:

    设置颜色

    注意看颜色

    • 位置
      当然了, 位置可以随便改, 甚至可以吸附在某个控件之上.
    android:layout_gravity="bottom|left"

    设置位置

    吸附效果如下, 即使滚动也会保持相对的位置:

    app:layout_anchor="@id/toolbar"
    app:layout_anchorGravity="center|bottom"

    吸附并设置位置


    FloatingActionButton实例

    来看看效果图是如何实现的吧.

    • 布局文件
      布局文件是个要点, 里面塞进了两个菜单, 你选一个喜欢的用就好. 一个是扇型的, 一个是线型的.
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    
        <FrameLayout
            android:id="@+id/fl_fan_menu"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:visibility="gone">
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab_left"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_marginBottom="@dimen/twenty_dp"
                android:layout_marginEnd="@dimen/twenty_dp"
                android:src="@mipmap/ic_launcher"
                app:backgroundTint="@color/colorAccent"
                app:elevation="@dimen/zero_dp"
                app:fabSize="mini" />
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab_left_top"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_marginBottom="@dimen/twenty_dp"
                android:layout_marginEnd="@dimen/twenty_dp"
                android:src="@mipmap/ic_launcher"
                app:backgroundTint="@color/colorAccent"
                app:elevation="@dimen/zero_dp"
                app:fabSize="mini" />
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab_top"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_marginBottom="@dimen/twenty_dp"
                android:layout_marginEnd="@dimen/twenty_dp"
                android:src="@mipmap/ic_launcher"
                app:backgroundTint="@color/colorAccent"
                app:elevation="@dimen/zero_dp"
                app:fabSize="mini" />
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab_origin"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="bottom|end"
                android:layout_marginBottom="@dimen/twenty_dp"
                android:layout_marginEnd="@dimen/twenty_dp"
                android:src="@drawable/ic_add"
                app:backgroundTint="@color/colorPrimary"
                app:fabSize="normal" />
        </FrameLayout>
    
        <RelativeLayout
            android:id="@+id/rl_line_menu"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
    
            <RelativeLayout
                android:id="@+id/rl_menu_content"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:visibility="gone">
    
                <LinearLayout
                    android:id="@+id/ll_fun1"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_alignParentBottom="true"
                    android:layout_marginBottom="@dimen/hundred_dp"
                    android:orientation="horizontal">
    
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_toLeftOf="@+id/fab_mini1"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:paddingRight="@dimen/eight_dp"
                        android:text="1"
                        android:textColor="@android:color/white"
                        android:textSize="@dimen/sixteen_sp" />
    
                    <android.support.design.widget.FloatingActionButton
                        android:id="@+id/fab_mini1"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/twenty_six_dp"
                        android:src="@mipmap/ic_launcher"
                        app:backgroundTint="@color/colorPrimary"
                        app:fabSize="mini" />
                </LinearLayout>
    
                <LinearLayout
                    android:id="@+id/ll_fun2"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/ll_fun1"
                    android:layout_marginBottom="@dimen/twenty_dp"
                    android:orientation="horizontal">
    
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_toLeftOf="@+id/fab_mini2"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:paddingRight="@dimen/eight_dp"
                        android:text="2"
                        android:textColor="@android:color/white"
                        android:textSize="@dimen/sixteen_sp" />
    
                    <android.support.design.widget.FloatingActionButton
                        android:id="@+id/fab_mini2"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/twenty_six_dp"
                        android:src="@mipmap/ic_launcher"
                        app:backgroundTint="@color/colorPrimary"
                        app:fabSize="mini" />
                </LinearLayout>
    
                <LinearLayout
                    android:id="@+id/ll_fun3"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/ll_fun2"
                    android:layout_marginBottom="@dimen/twenty_dp"
                    android:orientation="horizontal">
    
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_toLeftOf="@+id/fab_mini2"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:paddingRight="@dimen/eight_dp"
                        android:text="3"
                        android:textColor="@android:color/white"
                        android:textSize="@dimen/sixteen_sp" />
    
                    <android.support.design.widget.FloatingActionButton
                        android:id="@+id/fab_mini3"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/twenty_six_dp"
                        android:src="@mipmap/ic_launcher"
                        app:backgroundTint="@color/colorPrimary"
                        app:fabSize="mini" />
                </LinearLayout>
    
                <LinearLayout
                    android:id="@+id/ll_fun4"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:layout_above="@+id/ll_fun3"
                    android:layout_marginBottom="@dimen/twenty_dp"
                    android:orientation="horizontal">
    
                    <TextView
                        android:layout_width="0dp"
                        android:layout_height="wrap_content"
                        android:layout_gravity="center_vertical"
                        android:layout_toLeftOf="@+id/fab_mini2"
                        android:layout_weight="1"
                        android:gravity="right"
                        android:paddingRight="@dimen/eight_dp"
                        android:text="4"
                        android:textColor="@android:color/white"
                        android:textSize="@dimen/sixteen_sp" />
    
                    <android.support.design.widget.FloatingActionButton
                        android:id="@+id/fab_mini4"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_marginEnd="@dimen/twenty_six_dp"
                        android:src="@mipmap/ic_launcher"
                        app:backgroundTint="@color/colorPrimary"
                        app:fabSize="mini" />
                </LinearLayout>
            </RelativeLayout>
    
            <android.support.design.widget.FloatingActionButton
                android:id="@+id/fab_add"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentBottom="true"
                android:layout_alignParentRight="true"
                android:layout_marginBottom="@dimen/twenty_dp"
                android:layout_marginEnd="@dimen/twenty_dp"
                android:backgroundTint="@color/colorAccent"
                android:src="@drawable/ic_add"
                app:fabSize="normal"
                app:rippleColor="@color/colorPrimaryDark" />
        </RelativeLayout>
    
        <Button
            android:id="@+id/bt_switch"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerInParent="true"
            android:text="@string/switch_menu" />
    </RelativeLayout>
    • normal与mini
      悬浮按钮有两种尺寸, normal和mini. 在xml中加入app:fabSize="mini"就变成mini尺寸的了. 所以在设置动画和位置的时候不是将按钮全部放置在同一位置, 需要修正位置. 修正距离就是(normal-mini)/2, 应该很好理解.
    // 计算偏移值
    int w = View.MeasureSpec.makeMeasureSpec(0,
            View.MeasureSpec.UNSPECIFIED);
    int h = View.MeasureSpec.makeMeasureSpec(0,
            View.MeasureSpec.UNSPECIFIED);
    mFabOrigin.measure(w, h);
    mFabLeft.measure(w, h);
    mOffset = (mFabOrigin.getMeasuredHeight() - mFabLeft.getMeasuredHeight()) / 2;
    
    // 修正位置
    FrameLayout.LayoutParams lParams = (FrameLayout.LayoutParams) mFabLeft.getLayoutParams();
    lParams.setMargins(0, 0, UIUtil.dp2px(20) + mOffset, UIUtil.dp2px(20) + mOffset);
    mFabLeft.setLayoutParams(lParams);
    FrameLayout.LayoutParams ltParams = (FrameLayout.LayoutParams) mFabLeftTop.getLayoutParams();
    ltParams.setMargins(0, 0, UIUtil.dp2px(20) + mOffset, UIUtil.dp2px(20) + mOffset);
    mFabLeftTop.setLayoutParams(ltParams);
    FrameLayout.LayoutParams tParams = (FrameLayout.LayoutParams) mFabTop.getLayoutParams();
    tParams.setMargins(0, 0, UIUtil.dp2px(20) + mOffset, UIUtil.dp2px(20) + mOffset);
    mFabTop.setLayoutParams(tParams);
    • 关于动画
      只要位置算对了, 动画不是特别难, 当然想要像google或者apple的动画那样舒适还是很难的. 没看第一篇的可以回头看看.
    /**
     * 显示扇型菜单
     */
    private void showFanMenu() {
        // 标识符设置是
        mFanMenuOpen = true;
    
        // 按钮1向左移动
        int x = (int) mFabOrigin.getX();
        int y = (int) mFabOrigin.getY();
        ValueAnimator va1 = ValueAnimator.ofInt(x, x - ConstantUtil.FAN_OFFSET);
        va1.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int l = (int) animation.getAnimatedValue();
                int t = (int) mFabLeft.getY();
                int r = mFabLeft.getWidth() + l;
                int b = mFabLeft.getHeight() + t;
                mFabLeft.layout(l, t, r, b);
            }
        });
    
        // 按钮2向左上移动
        ValueAnimator va2x = ValueAnimator.ofInt(x, x - (int) (ConstantUtil.FAN_OFFSET / Math.pow(2, 1.0 / 2)));
        ValueAnimator va2y = ValueAnimator.ofInt(y, y - (int) (ConstantUtil.FAN_OFFSET / Math.pow(2, 1.0 / 2)));
        va2x.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int l = (int) animation.getAnimatedValue();
                int t = (int) mFabLeftTop.getY();
                int r = mFabLeftTop.getWidth() + l;
                int b = mFabLeftTop.getHeight() + t;
                mFabLeftTop.layout(l, t, r, b);
            }
        });
        va2y.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int l = (int) mFabLeftTop.getX();
                int t = (int) animation.getAnimatedValue();
                int r = mFabLeftTop.getWidth() + l;
                int b = mFabLeftTop.getHeight() + t;
                mFabLeftTop.layout(l, t, r, b);
            }
        });
    
        // 按钮3向上移动
        ValueAnimator va3 = ValueAnimator.ofInt(y, y - ConstantUtil.FAN_OFFSET);
        va3.setDuration(500).addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                int l = (int) mFabTop.getX();
                int t = (int) animation.getAnimatedValue();
                int r = mFabTop.getWidth() + l;
                int b = mFabTop.getHeight() + t;
                mFabTop.layout(l, t, r, b);
            }
        });
    
        // 开始动画
        va1.start();
        va2x.start();
        va2y.start();
        va3.start();
    }
    • 切换图标
      然后就是在不同状态切换悬浮按钮的图标, 使用setImageResource方法即可.
    mFabAdd.setImageResource(mLineMenuOpen ? R.drawable.ic_add : R.drawable.ic_close);

    最后

    我本人还是很喜欢google的material design的, 这个悬浮按钮也非常实用. 喜欢记得点赞或者关注我哦, 有意见或者建议评论区见~

    动画必须有(一): 属性动画浅谈

    githhub传送门


    展开全文
  • 布局 &lt;?xml version="1.0" encoding="utf-8"?&gt; &lt;android.support.constraint.ConstraintLayout xmlns:android="... xmlns:app="http://schemas.android....
  • 制作uni-app可拖动【悬浮按钮】,点击【加号图标】后向上展开按钮菜单,如下图 image.png <movable-area>是uni-app自带的,可以到uni-app官网查看文档 image.png image.png 代码部分 html代码 &...
  • android悬浮菜单,可用于显示在launcher或者activity.zip,android 悬浮菜单,可在launcher或app中使用
  • 悬浮菜单的效果用文字描述是:无论是进入在Launcher里还是退出Launcher进入到其它APP里,鼠标滑过右侧区域时显示菜单;鼠标滑离右侧区域时隐藏菜单。 开发中做弹出框的方式有很多种,有Dialog,PopUpWindow,...
  • 本文实例为大家分享了Android悬浮菜单的具体代码,供大家参考,具体内容如下 MainActivity.java代码: package siso.multilistview; import android.os.Build; import android.support.v7.app.AppCompatActivity;...
  • Android 悬浮菜单,可在launcher或app中使用。示例代码:@Override public void onCreate() {  super.onCreate();  mFloatMenu = new FloatMenu.Builder(this)  .floatLoader(R.drawable.yw_anim_...
  • Android滑出菜单悬浮按钮的实现

    千次阅读 2019-06-06 08:45:21
      现在的大部分安卓应用都有用到悬浮按钮和滑出菜单,比如我们手机上的记事本用到了悬浮按钮,qq,网易云音乐等用到了滑出菜单,而且这两个功能用上的话也会让你的app给人的感觉好一点。 效果图如下: 滑动菜单  ...
  • IOS swift  ...仿京东 IOS APP商品详情页 购物车固定底部一栏的菜单,好像页面是用TableViewController 静态表格做的,那么底部是用什么做的,如何实现? 我用表格底部FooterView实现起来好像不理想
  • 人生最重要的不是我们置身何处,而是我们将前往何处。MainActivity.java代码:package siso....import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.view.View;publ
  • FloatBall效果图|Gradle项目根目录的build.gradle:buildscript {allprojects {repositories {jcenter()}}dependencies {classpath 'com.buyi.huxq17:agencyplugin:1.1.2'}}App模块的build.gradle:apply plugin: '...
  • APP启动视频 自定义按钮,图片可调整图文间距SPButton 一款定制性极高的轮播图,可自定义轮播图Item的样式(或只... iOS 筛选菜单 分段选择器 仿微信导航栏的实现,让你的导航栏过渡平滑,赏心悦目。 iOS仿微信...
  • 实现悬浮球的桌面显示 本篇是Android实战之悬浮菜单App实现的分支,做学习记录使用。 本篇介绍悬浮球的桌面显示部分,主要分为WindowManager部分,以及菜单的策略和显示位置的计算。 ...
  • 12.1 Toolbar 修改一下项目的默认主题,指定为不带 ActionBar 的主题 打开 values 文件下的 styles.xml,修改如下: &lt;resources&...AppTheme" parent="Theme.AppCompat.Lig...
  • SubMenu子菜单

    2015-08-09 13:39:16
    当点击每一个页面中的选项菜单时,会在页面中弹出一个悬浮窗口,这就是SubMenu子菜单,子菜单中有标题,例如:文件,还有下面的菜单项组成,并且该菜单项是和文件操作相关的。动态添加子菜单:package ...
  • Android 一款十分简洁、优雅的日记APP

    万次阅读 多人点赞 2017-02-22 00:22:27
    悬浮菜单的实现 日记增删改的实现 一、APP制作的原因说起这个APP的产生还是个悲伤的故事,这个APP是我舍友亲手设计,然后由我开发,打算在他女神生日那天,作为生日礼物送给他的女神的,祝福他吧
  • 现在很多App都支持悬浮桌面的控件,我们可以通过系统菜单长按,或者别的方式来设置,例如自带的备忘录,就可以写完后挂在手机桌面上。 现在我们看看运行效果:在安装应用后,设置桌面悬浮的时候会看到我们刚才安装...
  • 前言 本文的内容主要是解析日记 APP 的制作流程,以及代码的具体...悬浮菜单的实现 日记增删改的实现 先来一波日记的展示吧,虽然内容比较简单,但还是设计的非常用心的,因此这款 APP 还是非常简洁和优雅的 Diary...
  • android安卓app界面UI开发教程 1.九宫格 10.锁屏 11.圆泡泡 12.动画 13.滑动切屏 14.在桌面上生成可移动的悬浮框 15.loading界面 2.多级列表 3.弹出窗口 4.微信聊天样式 5.列表 6.滑动Tab 7.相册 8.ViewFlipper 9....
  • 鼠标右击菜单

    2015-11-16 15:04:04
    Asp.net2.0创建自定义菜单右键 1. 当鼠标悬浮到控件对象上, 右击, 会弹出此自定义控件. 2. 仅当控件支持oncontextmenu事 结合GridView使用的自定义控件,App_code/data.cs文件为数据生成文件PopupMenu_InGridView为...
  • 主要介绍了微信小程序-可移动菜单的实现过程详解,我们可以经常看到手机app里有的菜单栏是悬浮在首页的,用户可以拖动和点击菜单栏进行交互,今天就教大家利用小程序的控件,,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4
收藏数 77
精华内容 30
关键字:

悬浮菜单app