material design 笔记2
一.沉浸
1.什么是沉浸?传统的手机状态栏是呈现出黑色条状的,有的和手机主界面有很明显的区别。这一样就在一定程度上牺牲了视觉宽度,界面面积变小。沉浸式是APP界面图片延伸到状态栏, 应用本身沉浸于状态栏,所以如果第三方的软件没有为状态栏分配图片,那么自然就是黑色。顶端的状态栏和下面的虚拟按键都隐藏,需要的时候从边缘划出。
当启用该模式,应用程序的界面将占据整个屏幕,系统自动将隐藏系统的状态栏和导航栏,让应用程序内容可以在最大显示范围呈现,增加大屏体验,而当需要查看通知的时候只需要从顶部向下滑动就能呼出通知栏。
沉浸模式实际上有两种:
一种叫“沉浸模式”,状态栏和虚拟按钮会自动隐藏、应用自动全屏,这种模式下,应用占据屏幕的全部空间, 只有当用户从屏幕的上方边沿处向下划动时, 才会退出沉浸模式, 用户触摸屏幕其它部分时, 不会退出该模式, 这种模式比较适用于阅读器、 杂志类应用。
另外一种叫“黏性沉浸模式”,让状态栏和虚拟按钮半透明,应用使用屏幕的全部空间, 当用户从屏幕的上方边沿处向下滑动时,也不会退出该模式, 但是系统界面 (状态栏、 导航栏) 将会以半透明的效果浮现在应用视图之上 , 只有当用户点击系统界面上的控件时, 才会退出黏性沉浸模式。
2.Android 实现沉浸
android从4.4开始,开始支持UI使用StatusBar与NavigationBar的范围。
所以要进行下面的配置:
在value中的styles.xml中设置
<!-- Base application theme. -->
<style name="AppTheme.Base" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
</style>
<style name="AppTheme" parent="AppTheme.Base"></style>
在value-v19中的styles.xml中设置(为了兼容4.4)
<style name="AppTheme" parent="AppTheme.Base">
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowTranslucentNavigation">true</item>
</style>
在value-v21中的styles.xml中设置
<style name="AppTheme" parent="AppTheme.Base">
<!--透明状态栏-->
<item name="android:windowTranslucentStatus">true</item>
<!--透明导航栏-->
<item name="android:windowTranslucentNavigation">true</item>
<!--使状态栏,导航栏可绘制-->
<item name="android:windowDrawsSystemBarBackgrounds">true</item>
</style>
二.布局控件
1.CardView、RecyclerView
Android L(5.0)中新增了两个控件分别是CardView,RecyclerView,RecyclerView这个控件是一个可以装载大量的视图集合,并且可以非常效率的进行回收和滚动。当你list中的元素经常动态改变时可以使用RecyclerView控件。
RecyclerView非常容易使用,它提供了如下两个功能:
为每个条目位置提供了layout管理器(RecyclerView.setLayoutManager)
为每个条目设置了操作动画(RecyclerView.setItemAnimator)
CardView
CardView继承自FrameLayout,允许你在card视图中显示信息. CardView也可以设置阴影和圆角。
CardView在API 21以下的圆角效果处理
2.com.android.support:design
a.TextInputLayout 提示输入内容
登录时可以提示。
比如:
<android.support.design.widget.TextInputLayout
android:id="@+id/input_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:counterTextAppearance="@style/counterTextAppearance"
app:errorTextAppearance="@style/errorTextAppearance"
app:hintTextAppearance="@style/hintTextAppearance">
<AutoCompleteTextView
android:id="@+id/tv_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/login_user_name_hint"
android:imeOptions="actionNext"
android:maxLength="20"
android:maxLines="1"
android:singleLine="true"
android:textSize="@dimen/NormalTextSize" />
</android.support.design.widget.TextInputLayout>
<android.support.design.widget.TextInputLayout
android:id="@+id/input_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:counterTextAppearance="@style/counterTextAppearance"
app:errorTextAppearance="@style/errorTextAppearance"
app:hintTextAppearance="@style/hintTextAppearance"
app:passwordToggleEnabled="true">
<EditText
android:id="@+id/tv_password"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/login_user_name_password"
android:imeActionId="@+id/login"
android:imeActionLabel="@string/action_sign_in"
android:imeOptions="actionDone"
android:inputType="textPassword"
android:maxLength="20"
android:maxLines="1"
android:singleLine="true"
android:textSize="@dimen/NormalTextSize" />
</android.support.design.widget.TextInputLayout>
注意:
app:counterTextAppearance="@style/counterTextAppearance"
app:errorTextAppearance="@style/errorTextAppearance"
app:hintTextAppearance="@style/hintTextAppearance">
可以自己在style中定义 暗示文字、提示文字、错误文字、以及的颜色 大小等风格。
<!-- 登录相关-->
<style name="errorTextAppearance" parent="@style/TextAppearance.Design.Error">
<item name="android:textSize">18sp</item>
</style>
<style name="counterTextAppearance" parent="@style/TextAppearance.Design.Counter">
<item name="android:textColor">@color/colorPrimaryDark</item>
<item name="android:textSize">20sp</item>
</style>
<style name="hintTextAppearance" parent="@style/TextAppearance.Design.Hint">
<item name="android:textColor">@color/colorPrimaryDark</item>
<item name="android:textSize">20sp</item>
</style>
b.TabLayout
一般与ViewPager配合 fragment一起使用
<android.support.design.widget.TabLayout
android:id="@+id/tabLayout"
android:layout_width="match_parent"
android:layout_height="@dimen/tabLayout_hight"
android:background="@color/colorPrimary"
app:tabGravity="fill"
app:tabIndicatorColor="@color/black_overlay"
app:tabIndicatorHeight="@dimen/tabIndicatorHeight"
app:tabMode="fixed"
app:tabSelectedTextColor="@color/black"
app:tabTextAppearance="@style/TabLayoutTextStyle"
app:tabTextColor="@color/tablayout_select" />
<ViewPager
android:id="@+id/viewPager"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1" />
其中 app:tabMode 两种模式 scrollable 可滚动的; 卷动; 可卷动的;fixed 固定的,不变的;
app:tabGravity 两种 center 聚集在中间, fill充满整个bar平均分。
TabLayout在布局底部是自带一条滚动条的,为了实现块状切换的效果,可以把 app:tabIndicatorHeight 属性设置为0dp,去掉滚动条
app:tabIndicatorHeight="0dp"
每个tab添加分割线
mViewPager = (ViewPager) findViewById(R.id.viewPager);
mTabLayout = (TabLayout) findViewById(R.id.tabLayout);
LinearLayout linearLayout = (LinearLayout) mTabLayout.getChildAt(0);
linearLayout.setShowDividers(LinearLayout.SHOW_DIVIDER_MIDDLE);
linearLayout.setDividerDrawable(ContextCompat.getDrawable(this,
R.drawable.layout_divider_vertical));
在drawable 下边定义layout_divider_vertical
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/black"/>
<size android:width="1dp"/>
</shape>
更改TabLayout选中的背景色
在drawable文件夹下建立选中效果的文件 tab_background_selected.xml和没选中的效果文件tab_background_unselected.xml color不同而已。
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="@color/colorPrimaryDark"/>
</shape>
在drawable文件夹下建立文件 tab_background_selector.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/tab_background_selected" android:state_selected="true" />
<item android:drawable="@drawable/tab_background_unselected" android:state_focused="false" android:state_pressed="false" android:state_selected="false" />
</selector>
最后在Style 中新建 Base.Widget.Design.TabLayout 复写
<style name="Base.Widget.Design.TabLayout" parent="android:Widget">
<item name="tabBackground">@drawable/tab_selector</item>
</style>
继续整理 2017年10月17日 19:22:56
AppBarLayout
用AppBarLayout可以让包含在其中的子控件能响应被标记了ScrollingViewBehavior的的滚动事件(要与CoordinatorLayout 一起使用),利用它我们可以很容易的去实现视差滚动效果。
CoordinatorLayout
协调(Coordinate)其他组件, 实现联动.
掌握 Coordinator Layout
AppbarLayout 严重依赖于CoordinatorLayout,必须用于CoordinatorLayout 的直接子View。
layout_scrollFlags有5种动作,分别是 scroll,enterAlways,enterAlwaysCollapsed,exitUntilCollapsed,snap。
- scroll ,子View 添加layout_scrollFlags属性 的值scroll 时,这个View将会随着可滚动View(如:ScrollView,以下都会用ScrollView 来代替可滚动的View )一起滚动,就好像子View 是属于ScrollView的一部分一样。
2.enterAlways ,子View 添加layout_scrollFlags属性 的值有enterAlways 时, 当ScrollView 向下滑动时,子View 将直接向下滑动,而不管ScrollView 是否在滑动。注意:要与scroll 搭配使用,否者是不能滑动的。
- enterAlwaysCollapsed , enterAlwaysCollapsed 是对enterAlways 的补充,当ScrollView 向下滑动的时候,滑动View(也就是设置了enterAlwaysCollapsed 的View)下滑至折叠的高度,当ScrollView 到达滑动范围的结束值的时候,滑动View剩下的部分开始滑动。这个折叠的高度是通过View的minimum height (最小高度)指定的。要配合scroll|enterAlways 一起使用.
4.exitUntilCollapsed, 当ScrollView 滑出屏幕时(也就时向上滑动时),滑动View先响应滑动事件,滑动至折叠高度,也就是通过minimum height 设置的最小高度后,就固定不动了,再把滑动事件交给 scrollview 继续滑动。
5.snap,意思是:在滚动结束后,如果view只是部分可见,它将滑动到最近的边界。比如,如果view的底部只有25%可见,它将滚动离开屏幕,而如果底部有75%可见,它将滚动到完全显示。
CollapsingToolbarLayout、
让Toolbar可伸缩,在伸缩的时候决定ToolBar是移除屏幕和固定在最上面。
属性意义
1)contentScrim:当Toolbar收缩到一定程度时的所展现的主体颜色。即Toolbar的颜色。
2)title:当titleEnable设置为true的时候,在toolbar展开的时候,显示大标题,toolbar收缩时,显示为toolbar上面的小标题。
3)scrimAnimationDuration:该属性控制toolbar收缩时,颜色变化的动画持续时间。即颜色变为contentScrim所指定的颜色进行的动画所需要的时间。
4)expandedTitleGravity:指定toolbar展开时,title所在的位置。类似的还有expandedTitleMargin、collapsedTitleGravity这些属性。
5)collapsedTitleTextAppearance:指定toolbar收缩时,标题字体的样式,
层级:
<android.support.design.widget.CoordinatorLayout...>
<android.support.design.widget.AppBarLayout...>
<android.support.design.widget.CollapsingToolbarLayout...>
<!-- your collapsed view -->
<View.../>
<android.support.v7.widget.Toolbar.../>
</android.support.design.widget.CollapsingToolbarLayout>
</android.support.design.widget.AppBarLayout>
<!-- Scroll view -->
<android.support.v7.widget.RecyclerView.../>
</android.support.design.widget.CoordinatorLayout>
FloatingActionButton
浮动按钮
app:borderWidth=""------------------边框宽度,通常设置为0 ,用于解决Android 5.X设备上阴影无法正常显示的问题
app:backgroundTint=""---------------按钮的背景颜色,不设置,默认使用theme中colorAccent的颜色
app:rippleColor=""--------------------点击的边缘阴影颜色
app:elevation=""----------------------边缘阴影的宽度
app:pressedTranslationZ="16dp"-----点击按钮时,按钮边缘阴影的宽度,通常设置比elevation的数值大
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"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="org.mobiletrain.drawerlayout.MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="主页面"/>
</LinearLayout>
<android.support.design.widget.NavigationView
android:id="@+id/navigation_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="left"
android:fitsSystemWindows="true"
app:headerLayout="@layout/header_layout"
app:menu="@menu/main"></android.support.design.widget.NavigationView>
</android.support.v4.widget.DrawerLayout>
1.android:layout_gravity="left"属性表示该View是左边的滑出菜单,这个属性的含义不用多说,这是DrawerLayout使用方式中的知识点。
2.app:headerLayout="@layout/header_layout"表示引用一个头布局文件,这个头就是我们在上面看到的那个背景图片,包括背景图片上面的显示用户名的控件等等。
3.app:menu="@menu/main"表示引用一个menu作为下面的点击项
Snackbar
SnackBar通过在屏幕底部展示简洁的信息,为一个操作提供了一个轻量级的反馈,并且在Snackbar中还可以包含一个操作,在同一时间内,仅且只能显示一个 Snackbar,它的显示依赖于UI,不像Toast那样可以脱离应用显示。它的用法和Toast很相似,唯一不同的就是它的第一个参数不是传入Context而是传入它所依附的父视图,但是他比Toast更强大。
未实际应用,参考
参考http://www.jianshu.com/p/cd1e80e64311/
网友评论