RecyclerView、CardView、Snackbar、TextInputLayout、FloatingActionButton、TabLayout、NavigationView、CoordinateLayout、CollapsingToolbarLayout、自定义Behavior
1.RecycleView
用来替代ListView和GridView
优点:
①.Adapter对ViewHolder进行封装
②.根据setLayoutManager可以实现ListView,横向ListView,GridView
③.根据item布局文件高度可以实现瀑布流
缺点:
①.需要自己实现分割线,继承ItemDecoration,实现onDraw()和getItemOffsets方法,启动onDraw是绘制分割线,getItemOffsets方法是设置分割线的size。
②.自定义点击事件,写接口并在Activity中实现即可。
③.需要自己实现动画。
2.CardView:卡片布局,继承FrameLayout
特性:
①.设置卡片圆角半径 cardCornerRadius
②.设置阴影半径 cardElevation
③.设置内容padding contentPadding
3.Snackbar:可点击的Toast
Snackb常用的格式如下:
Snackbar.make(activity_main,"标题",Snackbar.LENGTH_LONG).setAction("点击事件",new OnClickListener(){})
注意点:
①.make的第一个参数是Snakebar的父控件,用于确定位置。
②.setAction用于设置一个点击事件。
③.和CoordinatorLayout配合使用,在Snackbar超时之前可以滑动删除。
4.TextInputLayout:交互更加多样化的EditText
特性:
①.再输入时候设置的hint会浮在上方。
②.可以通过setError等方法设置输入错误的提示及提示语
③.注意TextInputLayout内部只能接收一个元素,并且这个元素是EditText
5.FloatingActionButton:有阴影的圆形Button
特性:
①.可以设置正常形态的阴影和点击形态的阴影。
②.与CoordinatorLayout配合使用Snakebar可以上顶FloatingActionButton。
6.TabLayout:实现多个标题栏动态滑动效果
注意:需要用AppBarLayout将Toolbar和TabLayout封装成一个整体。
7.Drawerlayout实现侧边栏滑动
8.NavigationView实现侧边栏
分成两部分:第一部分头部布局headerLayout,第二部分菜单栏menu
9.CoordnatorLayout实现Toolbar隐藏和显示
①.通过layout_scrollFlags="scroll|enterAlways"实现toolbar的显示隐藏
②.通过FloatingActionButton中的behavior检测Snackbar的添加实现Snackbar可以将FloatingActionButton上移。
10.CollapsingToolbarLayout:与CoordinatorLayout配合实现Toolbar折叠效果
①.CollapsingToolbarLayout将Toolbar和Image封装成一个整体
②.CollapsingToolbarLayout中的layout_scrollFlags是控制滑动的。
③.CollapsingToolbarLayout中的子控件的layout_collapseMode是子控件控制滑动的
11.自定义Behavior
CoordinatorLayout最经典的设计就是Behavior,我们可以自定义Behavior来实现自己的组件和滑动的交互,有两种方式实现:
①.定义的View监听CoordinatorLayout内的滑动状态。如下:
/**
* Created by Administrator on 2017/11/8 0008.
*
* 第一种自定义behavior方法 根据CoordinatorLayour变化
*/
class MyBehavior : CoordinatorLayout.Behavior<View> {
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
private var directionChange: Int = 0
//表示此次滑动是否要关心
override fun onStartNestedScroll(coordinatorLayout: CoordinatorLayout?, child: View?, directTargetChild: View?, target: View?, nestedScrollAxes: Int): Boolean {
return nestedScrollAxes != 0 && ViewCompat.SCROLL_AXIS_VERTICAL != 0
}
//表示如何处理滑动
override fun onNestedPreScroll(coordinatorLayout: CoordinatorLayout?, child: View?, target: View?, dx: Int, dy: Int, consumed: IntArray?) {
if (dy < 0 && directionChange > 0 || directionChange < 0 && dy > 0) {
if (child != null) {
child.animate().cancel()
}
directionChange = 0
}
directionChange += dy
if (child != null) {
if (directionChange > child.height && child.visibility == View.VISIBLE) {
hide(child)
} else if (directionChange < 0 && child.visibility == View.GONE) {
show(child)
}
}
}
fun hide(child: View) {
val animation: ViewPropertyAnimator = child.animate().translationY(child.height.toFloat()).setInterpolator(FastOutLinearInInterpolator()).setDuration(200)
animation.setListener (object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
child.visibility = View.GONE
}
})
animation.start()
}
@RequiresApi(Build.VERSION_CODES.KITKAT)
fun show(child: View) {
val animation: ViewPropertyAnimator = child.animate().translationY(0.0f).setInterpolator(FastOutLinearInInterpolator()).setDuration(200)
animation.setListener (object : AnimatorListenerAdapter() {
override fun onAnimationEnd(animation: Animator?) {
child.visibility = View.VISIBLE
}
})
animation.start()
②.定义的view监听其他view的滑动状态
/**
* Created by Administrator on 2017/11/8 0008.
*
* 第二种自定义behavior方法 根据指定view变化而变化
*/
class MyBehaviorTwo : CoordinatorLayout.Behavior<View> {
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
private var directionChange: Int = 0
//关心的类
override fun layoutDependsOn(parent: CoordinatorLayout?, child: View?, dependency: View?): Boolean {
return dependency is AppBarLayout
}
//关心的类的变化
override fun onDependentViewChanged(parent: CoordinatorLayout?, child: View?, dependency: View?): Boolean {
var translation: Float = abs(dependency!!.y)
if (child != null) {
child.translationY = translation
}
return true
}
}