【开源】material-menu
material-menu
- https://github.com/balysv/material-menu
介绍:
Android L drawer指示图标的动画效果,该库提供了两种对MaterialMenuDrawable封装,可以方便的应用到actionbar、NavigationDrawer 以及任意的自定义layout中。运行效果:
![]()
使用说明:
MaterialMenuView
绘制icon的view,提供了一些改变其状态的方法,同时还可以通过下列属性自定义:
|
1
2
3
4
5
6
|
app:mm_color="color" // Color of drawableapp:mm_transformDuration="integer" // Transformation animation durationapp:mm_pressedDuration="integer" // Pressed circle animation durationapp:mm_scale="integer" // Scale factor of drawableapp:mm_strokeWidth="integer" // Stroke width of icons (can only be 1, 2 or 3)app:mm_rtlEnabled="boolean" // Enabled RTL layout support (flips all drawables) |
MaterialMenuIcon
取代ActionBar icon的控件
api
MaterialMenu共有四种状态
BURGER, ARROW, X, CHECK
改变drawable state 带有动画并且有圆形按下的效果:
|
1
|
MaterialMenu.animatePressedState(IconState state) |
改变drawable state 带有动画,但没有圆形按下效果
|
1
|
MaterialMenu.animateState(IconState state) |
不带任何效果:
|
1
|
MaterialMenu.setState(IconState state) |
主动触发动画效果:
|
1
|
MaterialMenu.setTransformationOffset(AnimationState state, float value) |
其中AnimationState可以为BURGER_ARROW, BURGER_X, ARROW_X, ARROW_CHECK, BURGER_CHECK, X_CHECK ,value在0到2之间。
自定义
|
1
2
3
4
5
6
7
8
9
10
|
// change colorMaterialMenu.setColor(int color)// change transformation animation durationMaterialMenu.setTransformationDuration(int duration)// change pressed animation durationMaterialMenu.setPressedDuration(int duration)// change transformation interpolatorMaterialMenu.setInterpolator(Interpolator interpolator)// set RTL layout supportMaterialMenu.setRTLEnabled(boolean enabled) |
actionbar中的运用
取决于你用的是何种actionbar,不同的actionbar使用不同的MaterialMenuIcon,分别是: MaterialMenuIcon, MaterialMenuIconCompat 和MaterialMenuIconSherlock
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); materialMenu = new MaterialMenuIcon(this, Color.WHITE, Stroke.THIN);}protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); materialMenu.syncState(savedInstanceState);}protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); materialMenu.onSaveInstanceState(outState);}public boolean onOptionsItemSelected(MenuItem item) { if (item.getId() == android.R.id.home) { // Handle your drawable state here materialMenu.animatePressedState(newState); }} |
在ToolBar中
完全把它当作一个标准的drawable来用,不过你需要自己处理icon state
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private MaterialMenuDrawable materialMenu;protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Handle your drawable state here materialMenu.animatePressedState(newState); } }); materialMenu = new MaterialMenuDrawable(this, Color.WHITE, Stroke.THIN); toolbar.setNavigationIcon(materialMenu); materialMenu.setNeverDrawTouch(true);} |
或者MaterialMenuIconToolbar
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
private MaterialMenuIconToolbar materialMenu;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.toolbar); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); setSupportActionBar(toolbar); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // Handle your drawable state here materialMenu.animatePressedState(newState); } }); materialMenu = new MaterialMenuIconToolbar(this, Color.WHITE, Stroke.THIN) { @Override public int getToolbarViewId() { return R.id.toolbar; } }; materialMenu.setNeverDrawTouch(true);}@Overrideprotected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); materialMenu.syncState(savedInstanceState);}@Override protected void onSaveInstanceState(Bundle outState) { materialMenu.onSaveInstanceState(outState); super.onSaveInstanceState(outState);} |
在自定义的布局中
直接将MaterialMenuView添加到布局中,注册一个OnClickListener处理icon的变换。
详细使用请查看 source of Demo
与NavigationDrawer 的交互
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
private DrawerLayout drawerLayout;private boolean isDrawerOpened;private MaterialMenuIcon materialMenu;@Overrideprotected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); materialMenu = new MaterialMenuIcon(this, Color.WHITE, Stroke.THIN); // or retrieve from your custom view, etc drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); drawerLayout.setDrawerListener(new DrawerLayout.SimpleDrawerListener() { @Override public void onDrawerSlide(View drawerView, float slideOffset) { materialMenu.setTransformationOffset( MaterialMenuDrawable.AnimationState.BURGER_ARROW, isDrawerOpened ? 2 - slideOffset : slideOffset ); } @Override public void onDrawerOpened(View drawerView) { isDrawerOpened = true; } @Override public void onDrawerClosed(View drawerView) { isDrawerOpened = false; } @Override public void onDrawerStateChanged(int newState) { if(newState == DrawerLayout.STATE_IDLE) { if(isDrawerOpened) menu.setState(MaterialMenuDrawable.IconState.ARROW) else menu.setState(MaterialMenuDrawable.IconState.BURGER) } } });}@Overrideprotected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); isDrawerOpened = drawerLayout.isDrawerOpen(Gravity.START); // or END, LEFT, RIGHT materialMenu.syncState(savedInstanceState);}@Overrideprotected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); materialMenu.onSaveInstanceState(outState);} |
Circle pressed state
为了让本库的圆形按下效果起作用,你必须先屏蔽了actionbar本身的背景:
|
1
2
3
4
5
6
7
8
9
10
11
|
<style name="AppTheme" parent="android:Theme.Holo.Light.DarkActionBar"> <item name="android:actionBarItemBackground">@null</item> <item name="android:actionButtonStyle">@style/ActionButtonStyle</item> <item name="android:actionOverflowButtonStyle">@style/OverflowButtonStyle</item></style><style name="ActionButtonStyle" parent="android:Widget.Holo.ActionButton"> <item name="android:background">@drawable/action_bar_item_background</item></style><style name="OverflowButtonStyle" parent="android:Widget.Holo.ActionButton.Overflow"> <item name="android:background">@drawable/action_bar_item_background</item></style> |
posted on 2015-04-01 15:53 wasdchenhao 阅读(464) 评论(0) 收藏 举报

浙公网安备 33010602011771号