BoomMenu
介绍:
BoomMenu可以让你的菜单按钮 ... 瞬间爆炸!
运行效果:
使用说明:
是否觉得这种菜单按钮有点无聊?
要不,试试这个:
BoomMenu可以让你的菜单按钮 ... 瞬间爆炸!
Gradle and Maven
添加 "compile 'com.nightonke:boommenu:1.0.3'" 到app模块中的build.gradle即可:
dependencies {
...
compile 'com.nightonke:boommenu:1.0.3'
...
}
或者通过 maven:
<dependency>
<groupId>com.nightonke</groupId>
<artifactId>boommenu</artifactId>
<version>1.0.2</version>
<type>pom</type>
</dependency>
Note
-
使用了 dmytrodanylyk-ShadowLayout 来为按钮产生阴影效果。
-
BoomMenuButton现在还没可以用于listview中,因为bitmap回收处理没有弄好。但是这并不影响在ActionBar或者FloatingActionButton里面使用。如果有人知道这个bug怎么解决,请提交你的代码,万分感谢!
Demo
你可以在这个demo中选择绝大部分的BoomMenuButton的选项来查看其不同的效果。当你查看demo的MainActivity的时候,不用担心里面过长的代码,很多代码都是为了处理RadioGroup的逻辑。
通过链接下载:
Usage
Easy to Use in 3 Steps
查看demo中的一个 简单示例 ,你就会发现,其实只需要三步即可使用:
1.添加BoomMenuButton到xml中:
<com.nightonke.boommenu.BoomMenuButton
android:id="@+id/boom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_margin="20dp"
app:boom_inActionBar="false"
app:boom_button_color="@color/colorPrimary"
app:boom_button_pressed_color="@color/colorPrimary"
/>
**2.**在onCreate()方法中findView:
boomMenuButton = (BoomMenuButton)findViewById(R.id.boom);
**3.**在onWindowFocusChanged()方法中初始化BoomMenuButton:
@Override
onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
boomMenuButton.init(
subButtonDrawables, // 子按钮的图标Drawable数组,不可以为null
subButtonTexts, // 子按钮的文本String数组,可以为null
subButtonColors, // 子按钮的背景颜色color二维数组,包括按下和正常状态的颜色,不可为null
ButtonType.HAM, // 子按钮的类型
BoomType.PARABOLA, // 爆炸类型
PlaceType.HAM_3_1, // 排列类型
null, // 展开时子按钮移动的缓动函数类型
null, // 展开时子按钮放大的缓动函数类型
null, // 展开时子按钮旋转的缓动函数类型
null, // 隐藏时子按钮移动的缓动函数类型
null, // 隐藏时子按钮缩小的缓动函数类型
null, // 隐藏时子按钮旋转的缓动函数类型
null // 旋转角度
);
}
Use in Action Bar
如何在ActionBar中使用BoomMenuButton:
1.自定义一个ActionBar的layout,比如custom_actionbar.xml:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/transparent">
<com.nightonke.boommenu.BoomMenuButton
android:id="@+id/boom"
android:layout_width="56dp"
android:layout_height="match_parent"
android:layout_alignParentStart="true"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:background="?android:actionBarItemBackground"
app:boom_inActionBar="true"
/>
<TextView
android:id="@+id/title_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:textAllCaps="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:textColor="#fff"
android:layout_toRightOf="@+id/boom"
android:layout_toEndOf="@+id/boom"
/>
</RelativeLayout>
2.在onCreate()方法中应用你的自定义ActionBar:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ActionBar mActionBar = getSupportActionBar();
mActionBar.setDisplayShowHomeEnabled(false);
mActionBar.setDisplayShowTitleEnabled(false);
LayoutInflater mInflater = LayoutInflater.from(this);
mCustomView = mInflater.inflate(R.layout.custom_actionbar, null);
TextView mTitleTextView = (TextView) mCustomView.findViewById(R.id.title_text);
mTitleTextView.setText(R.string.app_name);
boomMenuButtonInActionBar = (BoomMenuButton) mCustomView.findViewById(R.id.boom);
boomMenuButtonInActionBar.setOnSubButtonClickListener(this);
boomMenuButtonInActionBar.setAnimatorListener(this);
mActionBar.setCustomView(mCustomView);
mActionBar.setDisplayShowCustomEnabled(true);
((Toolbar) mCustomView.getParent()).setContentInsetsAbsolute(0,0);
}
3.在onWindowFocusChanged()方法中初始化BoomMenuButton。就像在简单使用中介绍的一样。
Use in Floating Action Button
如何在FloatingActionButton中使用?与上述类似,稍微修改一下xml文件:
<com.nightonke.boommenu.BoomMenuButton
android:id="@+id/boom"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:boom_inActionBar="false"
app:boom_button_color="@color/colorPrimary"
app:boom_button_pressed_color="@color/colorPrimary"
/>
参数 | 类型 | 干啥的 |
app:boom_inActionBar | boolean | 真,表示应用在ActionBar中 |
app:boom_button_color | color | BoomMenuButton的背景色,仅仅在FloatingActionButton中有效 |
app:boom_button_pressed_color | color | BoomMenuButton的按下背景颜色,仅仅在点击效果为Normal时有效 |
Hamburger Button and Circle Button
在BMB(BoomMenuButton)中有两种子按钮类型,Hamburger和circle。你可以使用 ButtonType.HAM 和 ButtonType.CIRCLE来初始化BMB。
Number of Sub Buttons
对于HAM类型,可以有1到4个自按钮。对于CIRCLE类型,可以有1到9个子按钮。
Boom Types
当前版本中提供了5种展开的类型,它们是 BoomType.LINE, BoomType.PARABOLA_2 , BoomType.HORIZONTAL_THROW,BoomType.PARABOLA_2 和 BoomType.HORIZONTAL_THROW_2。 Demo中提供了这5中方式的效果,你可以在初始化的时候设置展开类型,或者通过setter:
setBoomType(newBoomType);
Place Types
当前版本有32种对子按钮的排列方式。你可以使用 PlaceType.CIRCLE_X_X 和PlaceType.HAM_X_X (前一个X代表子按钮数量,后一个代表排列方式)来初始化BMB。
更多信息请查看 PlaceType.class
Ease Types
对6种展开或隐藏的子动画有30种缓动函数可以使用。你可以设置移动、缩放、旋转动画的缓动效果当初始化BMB的时候,如果设置为null则表明使用默认值。当然,也可以通过setter来设置:
setShowMoveEaseType(showMoveEaseType);
setShowScaleEaseType(showScaleEaseType);
setShowRotateEaseType(showRotateEaseType);
setHideMoveEaseType(hideMoveEaseType);
setHideScaleEaseType(hideScaleEaseType);
setHideRotateEaseType(hideRotateEaseType);
更多信息,请查看 Ease Type Package。 或者查看之前我写的 开源库 (缓动效果是一样的)。
Boom Animation Duration
通过 setDuration(duration) (ms为单位)来设置展开或隐藏的延时。 默认值为 800ms。
Animation Start Delay
通过 setDelay(delay) 来设置每两个子按钮之间动画的延时(ms为单位)。 比如,如果延时设为0,那么所有子按钮都会同时展开或隐藏,默认值为100ms。
Rotation Degree
你可以设置子按钮展开或隐藏时的旋转角度。但是注意,只对圆形的子按钮有效,因为对于长方形的子按钮来说,旋转时其阴影效果很难绘制。默认值为720度。你可以在初始化的时候设置或者通过setter setRotateDegree(rotateDegree) 来设置。
Auto Dismiss
当点击一个子按钮的时候,默认BMB是会隐藏所有子按钮的。如果你不想这样,你可以用 setAutoDismiss(autoDismiss) 把自动隐藏值设为false。
Cancelable
当子按钮全部展开后,点击除了子按钮的区域,BMB会执行隐藏所有子按钮的动画。如果你不想这样,可以用过setCancelable(cancelable) 来吧cancelable值设为false。 但是要记得把某个子按钮的点击事件中用BMB的dismiss()函数来隐藏子按钮,否则BMB会无法隐藏。
Show Order and Hide Order
设置展开或隐藏时的子按钮顺序,可以通过 OrderType.DEFAULT, OrderType.REVERSE 和OrderType.RANDOM。 用settersetShowOrderType(showOrderType) 和 setHideOrderType(hideOrderType) 来设置相应的值。
Sub Buttons Click Listener
boomMenuButton.setOnSubButtonClickListener(new BoomMenuButton.OnSubButtonClickListener() {
@Override
public void onClick(int buttonIndex) {
// 返回被点击的子按钮下标
}
});
Animation Listener
boomInfo.setAnimatorListener(new BoomMenuButton.AnimatorListener() {
@Override
public void toShow() {
// 当BMB即将开始执行展开动画
}
@Override
public void showing(float fraction) {
// 展开动画正在进行,fraction表示进度
}
@Override
public void showed() {
// 展开动画刚刚结束
}
@Override
public void toHide() {
// BMB即将开始执行隐藏动画
}
@Override
public void hiding(float fraction) {
// 隐藏动画正在进行,fraction表示进度
}
@Override
public void hided() {
// 隐藏动画刚刚结束
}
});
Click Effects
使用 setClickEffectType(clickEffectType) 来为所有按钮(包括BMB自身)设置点击效果。 用ClickEffectType.RIPPLE 来设置波纹效果(只在Android 5.0或其后有效) 或 ClickEffectType.NORMAL 来设置普通点击效果。
Sub Button Texts Color
用 setTextViewColor(int color) 来为所有的子按钮设置文本颜色。或者通过 setTextViewColor(int[] colors) 来为子按钮分别设置文本颜色。
Dim Types
使用DimType来设置背景的暗淡效果。注意到在demo中,当点击FloatingActionButton时,背景并不会暗淡,但是点击ActionBar中的BMB时,背景会变暗淡。有10个值可以来设置暗淡效果:
public enum DimType {
DIM_0(Color.parseColor("#00000000")),
DIM_1(Color.parseColor("#11000000")),
DIM_2(Color.parseColor("#22000000")),
DIM_3(Color.parseColor("#33000000")),
DIM_4(Color.parseColor("#44000000")),
DIM_5(Color.parseColor("#55000000")),
DIM_6(Color.parseColor("#66000000")),
DIM_7(Color.parseColor("#77000000")),
DIM_8(Color.parseColor("#88000000")),
DIM_9(Color.parseColor("#99000000"));
public int value;
DimType(int value) {
this.value = value;
}
}
用 setDimType(DimType dimType) 来设置BMB的暗淡效果。比如,你可以使用boomMenuButton.setDimType(DimType.DIM_0); 来保持背景的明亮。
Shadow of Sub Buttons and Boom Button
你可以设置子按钮和BMB的阴影偏移效果。用 setSubButtonShadowOffset(float xOffset, float yOffset) (pixel为单位)来设置子按钮的阴影偏移效果,用 setBoomButtonShadowOffset(float xOffset, float yOffset) 来设置BMB的阴影偏移效果。
Get States and Dismiss
通过以下函数来获得BMB当前的状态:
boolean isClosed();
boolean isClosing();
boolean isOpen();
boolean isOpening();
用 boolean dismiss() 来强制执行BMB的隐藏效果。返回真如果BMB可以执行隐藏动画,返回假如果当前BMB不可执行隐藏动画(因为BMB正在执行展开、隐藏动画或正处于未展开的状态)。
Get Sub Views of Sub Button
如果想对子按钮的子控件稍加修改,可以调用:
ImageView\[\] getImageViews();
TextView\[\] getTextViews();