Material Design --FloatingActionButton实战

Material Design --FloatingActionButton(发布)

配置

使用android studio导入

Github地址: futuresimple/android-floating-action-button

刚开始不知道如何导入,以为向eclipse一样,这样导入第三方的包就可以了,想不到android studio使用的是gradles,直接在对应位置添加下方这句话就可以了进行了导入。

Just add the dependency to your build.gradle:

dependencies {
    compile 'com.getbase:floatingactionbutton:1.9.0'
}

使用:

在对应的布局xml,加入。

根布局加入xmlns:fab="http://schemas.android.com/apk/res-auto",指定使用自定义的格式。

添加控件:

<com.getbase.floatingactionbutton.FloatingActionButton
        android:id="@+id/pink_icon"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        fab:fab_icon="@drawable/ic_fab_star"
        fab:fab_colorNormal="@color/pink"
        fab:fab_colorPressed="@color/pink_pressed"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:layout_marginBottom="16dp"/>

通过以上设置,即可显示出来,接着就按普通的btn一样使用。不用想得太复杂。详细的查看github的例子。

参考文章:FloatingActionButton的使用

eclipse 使用

刚开始就讲以上github的全部下载进来,再导入,接着就一堆报错。上网找了,不是缺少这个就缺少那个。只好放弃。然后之前有保存一个Material DeisgnGithub地址,也有这个float button。而且通过eclipse导入,完美没有报错。接下来就用这个。

gitub地址:navasmdc/MaterialDesignLibrary,将整个项目下载下来,进行导入即可。

用的项目不同,那么使用也稍有区别:

根布局:xmlns:materialdesign="http://schemas.android.com/apk/res-auto"

加入控件

<com.gc.materialdesign.views.ButtonFloat
                android:id="@+id/buttonFloat"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentBottom="true"
                android:layout_marginRight="24dp"
                android:background="#1E88E5"
                materialdesign:animate="true"
                materialdesign:iconDrawable="@drawable/ic_action_new" /> 

这里还加入了动画的效果,用的是nineoldandroids.jar来实现的动画效果,不知道我为什么使用了动画效果就错。所以,我这里materialdesign:animate="false",不使用。

使用FloatingActionsMenu弹出多个button

使用FloatingActionMenu嵌套多个floatbutton即可

<com.getbase.floatingactionbutton.FloatingActionsMenu
   android:id="@+id/club_home_fa_settings"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content">
   <com.getbase.floatingactionbutton.FloatingActionButton
       android:id="@+id/detailed_action_update_notice"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       fab:fab_colorNormal="@color/blue_colorPrimary"
       fab:fab_icon="@mipmap/club_icon_activity_now"
       fab:fab_colorPressed="@color/blue_colorPrimaryDark"
       fab:fab_title="@string/float_action_update_notice" />
</com.getbase.floatingactionbutton.FloatingActionsMenu>

实战

如何修改弹出文字的字体颜色以及字体背景

Alt text
Alt text

浮动菜单FloatingActionsMenu提供了一个属性fab:fab_labelStyle进行修改。导入自定义的style

  1. FloatingActionsMenu里面添加
fab:fab_labelStyle="@style/menu_labels_style"
  1. styles.xml添加(只需修改两个样式,一个是字体,另一个是背景)
<style name="menu_labels_style">
  <item name="android:background">@drawable/fab_label_background</item>
  <item name="android:textColor">@color/secondary_text</item>
</style>

解决FloatingActionsMenu的图标不可以改变

经过大量的搜索,最直接的,就是Github里面issues问题,等待作者进行解决。发现里面,其中问题56提供了解决问题的思路。顺着思路

  1. 我们必须先将源码进行clone下来。
  2. 接着找到默认的图标。很明显是出来的。
    我们在类FloatingActionsMenu中的方法createAddButton
 Drawable getIconDrawable() {
        final RotatingDrawable rotatingDrawable = new RotatingDrawable(super.getIconDrawable());
}

可以发现从字面的理解RotatingDrawable旋转资源是通过super.getIconDrawable()进行得到。便在找到了这个类:AddFloatingActionButton

  1. 接下来就是对AddFloatingActionButton进行研究,发现方法:getIconDrawable()正是进行划出了
final Shape shape = new Shape() {
      @Override
      public void draw(Canvas canvas, Paint paint) {
        canvas.drawRect(plusOffset, iconHalfSize - plusHalfStroke, iconSize - plusOffset, iconHalfSize + plusHalfStroke, paint);
        canvas.drawRect(iconHalfSize - plusHalfStroke, plusOffset, iconHalfSize + plusHalfStroke, iconSize - plusOffset, paint);
      }
    };

通过Canvas进行画出充满的矩形。形成一个字。

  1. 找到后的第一感觉就是进行继承相应的类,然后进行重写相应的方法。即:getIconDrawable()方法。但是原作者既然使用默认的修饰符,而不是public,这样的情况,只有当前包的类才能进行重写该方法,无解,只能自己去修改源代码。
  2. 在当前AddFloatingActionButton添加一下方法。我们通过canvas将图片画进去。
public Drawable getBitmapDrawable(final int resIcon) {

  final Shape shape = new Shape() {
    @Override
    public void draw(Canvas canvas, Paint paint) {
      Bitmap iconbit = BitmapFactory.decodeResource(getResources(), resIcon) ;//将图片资源转成Bitmap
      canvas.drawBitmap(iconbit,0,0,paint);//使用canvas进行画出
    }
  };
  ShapeDrawable drawable = new ShapeDrawable(shape);

  final Paint paint = drawable.getPaint();
  paint.setColor(mPlusColor);
  paint.setStyle(Style.FILL);
  paint.setAntiAlias(true);

  return drawable;
}
  1. 在类FloatingActionsMenu添加一个属性,专门得到图片的资源
 private int mResIcon=-1;
  1. 然后再方法:getIconDrawable()进行修改,将
final RotatingDrawable rotatingDrawable = new RotatingDrawable(super.getIconDrawable());

改成

RotatingDrawable rotatingDrawable;
if(mResIcon!=-1){
  rotatingDrawable = new RotatingDrawable(getBitmapDrawable(mResIcon));
}
else{
  rotatingDrawable = new RotatingDrawable(super.getIconDrawable());
}

进行设置mResIcon,默认是十字,但有图标的时候,进行改变。

  1. 相应的,我们需要提供相应的xml的属性,我们在res/values/attrs.xml加入
<declare-styleable name="FloatingActionsMenu">
        <attr name="fab_bitmap" format="reference"/>
</declare-styleable>
  1. 在类FloatingActionsMenu的方法init(Context context, AttributeSet attributeSet)加入
mResIcon=attr.getResourceId(R.styleable.FloatingActionsMenu_fab_bitmap, -1);//得到图片资源,否则默认为-1

设置完成

解决自定义修改FloatingActionsMenu的旋转的角度

默认为135

  1. 我们需要提供相应的xml的属性,我们在res/values/attrs.xml加入
<declare-styleable name="FloatingActionsMenu">
<attr name="fab_rotation" format="float"/>
</declare-styleable>
  1. 在类FloatingActionsMenu加入以下属性,并进行赋值
private static final float EXPANDED_PLUS_ROTATION = 90f + 45f;//rorate
private float rotate=EXPANDED_PLUS_ROTATION;//设置的角度

并通过get或者set进行修改,导致可以通过动态进行修改

public float getRotate() {
  return rotate;
}

public void setRotate(float rotate) {
  this.rotate = rotate;
}
  1. 在类FloatingActionsMenu里的init()添加
rotate=attr.getFloat(R.styleable.FloatingActionsMenu_fab_rotation,EXPANDED_PLUS_ROTATION);
  1. 最后在有EXPANDED_PLUS_ROTATION的地方,进行替换成getRotate()即可。
  2. getIconDrawable里面的
final ObjectAnimator collapseAnimator = ObjectAnimator.ofFloat(rotatingDrawable, "rotation", getRotate(), COLLAPSED_PLUS_ROTATION);
final ObjectAnimator expandAnimator = ObjectAnimator.ofFloat(rotatingDrawable, "rotation", COLLAPSED_PLUS_ROTATION, getRotate());

项目地址

我已经将项目进行fork,然后提交,并申请与原作者进行合并了。
地址:https://github.com/Trity93/android-floating-action-button

最新自己更新的项目地址:FloatingActionButton

学习资料

CircularFloatingActionMenu 源码解析

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 原文地址:http://www.android100.org/html/201606/06/241682.html...
    AFinalStone阅读 906评论 0 1
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,398评论 25 707
  • 文/邮件人啊 都说时光匆匆了无痕 没想到他会跑的这么快 我快连他转身的影子都看不到了 我特别恐慌特别害怕像是老板...
    邮件大叔阅读 233评论 0 1
  • 一個人終於另一個人走在一起 那你是誰 家在哪 現在又在哪 我在想你 知道嗎 我在念你 聽到嗎 如果是捉迷藏 那你早...
    淺笑大大阅读 283评论 3 0
  • 猫叔说:不去做,然并卵! 不去做,那就没有任何意义,不会产生任何改变。而要更好的行动,晨读里分享了三点: 1.过多...
    如白Gabrielle阅读 208评论 0 7