Android-Material Design布局之第一曲
2015-11-22 20:38
302 查看
记录下所使用了的东西
使用的Android StudioDrawerLayout 抽屉布局
NavigationView 配合抽屉使用的菜单分头部分和菜单部分
ActionBarDrawerToggle 用于监听抽屉
Toolbar 最上边的标题栏
AppBarLayout 包裹住标题栏,否则会下方内容会盖在Toolbar的上边
CollapsingToolbarLayout 设置标题的过渡样式用到
CoordinatorLayout 其design子控件的动画效果都要放在这里面才能
NestedScrollView 和Toolbar配合使用,实现上滑动是隐藏Toolbar
过去看教学视频
最终要实现的效果图
Android Design Support Library的导入
方法一: 项目app目录下build.gradle文件中添加:compile ‘com.android.support:design:23.1.1’,如下图:方法二: 项目右击 —> F12 —> app —> Dependencies —> +—> Library —> 选包 —> ok,如下图:
创建导航抽屉,菜单使用NavigationView
Navigation分为两部分:头部分和菜单部分(如最终效果抽屉上面头部绿颜色区域和下面白色菜单区域)
头部分
最外层是一个垂直线性布局添加了一个ImageView、两个TextView
代码简单就不详解了
菜单部分
写在menu文件夹中,格式和弹出菜单格式一样代码如下:
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android"> <group android:checkableBehavior="single"> <item android:id="@+id/nav_camera" android:icon="@drawable/ic_menu_camera" android:title="拍照" /> <item android:id="@+id/nav_gallery" android:icon="@drawable/ic_menu_gallery" android:title="图片库" /> <item android:id="@+id/nav_slideshow" android:icon="@drawable/ic_menu_slideshow" android:title="视频库" /> <item android:id="@+id/nav_manage" android:icon="@drawable/ic_menu_manage" android:title="设置" /> </group> <item android:title="其他"> <menu> <item android:id="@+id/nav_share" android:icon="@drawable/ic_menu_share" android:title="分享" /> <item android:id="@+id/nav_send" android:icon="@drawable/ic_menu_send" android:title="发送" /> </menu> </item> </menu>
抽屉布局使用NavigationView代码
<?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.DrawerLayout 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"
不让内容拉伸到状态栏
android:fitsSystemWindows="false" >
Toolbar在下方分解
<include layout="@layout/bar" android:layout_width="match_parent" android:layout_height="match_parent" /> <android.support.design.widget.NavigationView android:id="@+id/nav_view" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_gravity="start"
不让内容拉伸到状态栏
android:fitsSystemWindows="false"
添加头部布局
app:headerLayout="@layout/nav_header_main"
添加菜单
app:menu="@menu/activity_main_drawer"/> </android.support.v4.widget.DrawerLayout>
最后在Activity中添加事件监听
NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } //获得抽屉控件 DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); //关闭抽屉 drawer.closeDrawer(GravityCompat.START); return true; } });
最后去掉了标题栏
在styles.xml的应用样式中添加了
<item name="windowActionBar">false</item> <item name="windowNoTitle">true</item> <item name="android:windowActionBar">false</item> <item name="android:windowNoTitle">true</item>
现在的效果如果所示
添加一个Toolbar的布局bar.xml
使用了android.support.v7.widget.Toolbar 标题栏
android.support.design.widget.AppBarLayout 向上滑动时隐藏标题栏,
android.support.v4.widget.NestedScrollView 使底部超出范围后可以滑动
android.support.design.widget.CoordinatorLayout 最外层布局,design下的控件动画效果都依赖于这个控件
布局如下
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout 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">
③用AppBarLayout嵌套住Toolbar才能使NestedScrollView包裹住的内容处于Toolbar的下方
<android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
①首先添加一个Toolbar
- app:layout_collapseMode=”pin”:确保Toolbar在view折叠的时候仍然被固定在屏幕的顶部
- app:popupTheme:设置主题样式(在styles.xml中添加<style name=”AppTheme.PopupOverlay” parent=”ThemeOverlay.AppCompat.Light” />)
- app:layout_scrollFlags:设置标题栏的滑动的状态(scroll:可滑动;enterAlwaysCollapsed:下边内容拉到最顶时,才能下拉到标题栏;exitUntilCollapsed:和 android:minHeight=”10dp”连用,表示有10dp是不能隐藏的,不写minHeight时默认标题不隐藏)
<android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/AppTheme.PopupOverlay" app:layout_scrollFlags="scroll|enterAlwaysCollapsed"/> </android.support.design.widget.AppBarLayout>
②若需要隐藏Toolbar就和NestedScrollView连用
<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <include layout="@layout/content_main" /> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout>
将Toolbar和抽屉布局在Activity中联系起来
详细代码
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); setSupportActionBar(toolbar);//设置标题栏 NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view); navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.nav_camera) { // Handle the camera action } else if (id == R.id.nav_gallery) { } else if (id == R.id.nav_slideshow) { } else if (id == R.id.nav_manage) { } else if (id == R.id.nav_share) { } else if (id == R.id.nav_send) { } DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); drawer.closeDrawer(GravityCompat.START); return true; } }); //常和抽屉布局一起使用 //可以监听DrawerLayout的状态,添加后通过点击左上角图标也可显示或关闭抽屉 //参数二:抽屉布局;参数三:标题栏;参数四和参数五:抽屉打开和关闭的描述 ActionBarDrawerToggle toggle = new ActionBarDrawerToggle( this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); //为抽屉设置toggle监听 drawer.setDrawerListener(toggle); //设置了这个才能显示左上角图标,该图标可以根据抽屉状态的变化过程而变化 toggle.syncState(); } /** * * 单独获取Back键的按下事件 * 当抽屉是打开的时候就关闭 */ @Override public void onBackPressed() { DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout); if (drawer.isDrawerOpen(GravityCompat.START)) { drawer.closeDrawer(GravityCompat.START); } else { super.onBackPressed(); } } //创建一个菜单搜索按钮,main.xml样式在下面 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return super.onCreateOptionsMenu(menu); } //设置菜单按钮监听 @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_search) { return true; } return super.onOptionsItemSelected(item); } }
搜索按钮,main.xml的内容为
<?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/action_search" android:actionViewClass="android.widget.SearchView" android:title="搜索" android:icon="@drawable/ic_search_24dp" app:showAsAction="ifRoom" /> </menu>
联合标题栏的显示效果
最后就是添加上图片到标题的过渡
就在Toolbar的外层套了一个CollapsingToolbarLayout然后在其中添加一个ImageView
代码如下:
<?xml version="1.0" encoding="utf-8"?> <android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:fitsSystemWindows="true" tools:context="com.zn.mediaplayer.MainActivity"> <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="300dp" android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">
在Toobar外层套了一个CollapsingToolbarLayout
将Toobar的layout_scrollFlags属性添加到CollapsingToolbarLayout的属性里
app:contentScrim=”#CAE7D9”:当图片隐藏,显示标题栏时候的背景颜色
app:expandedTitleMarginStart=”120dp”:设置显示的字体距离左侧120dp
<android.support.design.widget.CollapsingToolbarLayout android:id="@+id/collapsing" android:layout_width="match_parent" android:layout_height="match_parent" app:contentScrim="#CAE7D9" app:expandedTitleMarginStart="120dp" app:layout_scrollFlags="scroll|enterAlwaysCollapsed">
添加的过渡图片
android:scaleType=”fitXY”:按上下比例缩放
app:layout_collapseMode=”parallax”:当向上推动时图片的压缩模式(pin:图片直直的就上去了,如状态栏向上隐藏的动作;parallax:图片和上推状态会有相对的向下偏移,具体不好描述,自己体验( ̄┰ ̄*);)
app:layout_collapseParallaxMultiplier=”0.5”:这个就是设置上一个属性的偏移度
<ImageView android:layout_width="match_parent" android:layout_height="match_parent" android:scaleType="fitXY" android:src="@mipmap/mm" app:layout_collapseMode="parallax" app:layout_collapseParallaxMultiplier="0.5" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" app:layout_collapseMode="pin" app:popupTheme="@style/AppTheme.PopupOverlay" /> </android.support.design.widget.CollapsingToolbarLayout> </android.support.design.widget.AppBarLayout> <android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent" app:layout_behavior="@string/appbar_scrolling_view_behavior"> <include layout="@layout/content_main" /> </android.support.v4.widget.NestedScrollView> </android.support.design.widget.CoordinatorLayout>
最后在Activity中设置标题和字体颜色
CollapsingToolbarLayout collapsing = (CollapsingToolbarLayout) findViewById(R.id.collapsing); //设置标题显示的字 collapsing.setTitle("XUJIAJI"); //设置在还未划上标题栏的时候显示的字体颜色 collapsing.setExpandedTitleColor(0xff94E46D);
我要吐槽
放大镜矢量图形可以在as中直接创建,真方便(~ ̄▽ ̄)~去掉标题栏的时候有加android的和没加的,如果不写不加android的在android5.0上没效果(。・・)ノ
ActionBarDrawerToggle用的是v7包下的,v4包下的不仅已经过时了,还没那么高大上<( ̄v ̄)/
将图片的app:layout_collapseParallaxMultiplier调到1以上,效果很明显,不信你试试。。。。
主题样式需要继承Theme.AppCompat.的样式,如:
<style name="AppBaseTheme" parent="Theme.AppCompat.Light.DarkActionBar"></style>
想说的话
博客坚持写,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们若内容有什么地方不对、不清楚,还望吐槽,希望大家能一起成长
来一个:十年以后回首现在,是不是觉得一切跟浮云一样,是否是挥挥衣袖般的洒脱?
相关文章推荐
- Android4.4实现状态栏沉浸
- Android margin 与 padding的区别
- Android中SQLite数据库查看及导入导出
- Android官方文档阅读之旅——Introduction to Android
- Android 和 iOS 图片资源对标
- Android Volley完全解析(一),初识Volley的基本用法
- Android数据库--Sqlcipher的使用(二)
- android 4.4 Launcher2源码分析--Workspace滑动
- Android Studio安装与使用最详细的图解教程
- 作百度地图定位时,location.getAddrStr()获取到的值一直为空的问题
- Android开发手记(31) 使用MediaRecorder录音
- Android Crash监测工具Bugly初体验
- android开发总的:activity全屏设置,主题设置,透明度设置及模式设置等基础知识
- Android日志工具Log(android.util.Log)
- Android之开发常用小功能(持续更新中。。。)
- Android TextView跑马灯效果与设置文字阴影
- Android平台关于时间和日期的相关类和方法(Date/Time)
- Android——我的第一个Android程序(Hello world!)
- [Android--Tool]android studio的Terminal工具中无法输入
- 融云 Android SDK 照相,图片选择器方案分析