您的位置:首页 > 移动开发 > Android开发

Android-Material Design布局之第一曲

2015-11-22 20:38 302 查看

记录下所使用了的东西

使用的Android Studio

DrawerLayout 抽屉布局

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>


想说的话

博客坚持写,今后学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们

若内容有什么地方不对、不清楚,还望吐槽,希望大家能一起成长

来一个:十年以后回首现在,是不是觉得一切跟浮云一样,是否是挥挥衣袖般的洒脱?
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: