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
    }
}