美文网首页
Android-Kotlin-Material Design技术

Android-Kotlin-Material Design技术

作者: 何以邀微微 | 来源:发表于2022-02-14 00:05 被阅读0次

1.Material design 定义

Material design 是由google的设计工程师基于优秀的设计原则,结合丰富的创意和科学技术所开发的一套全新的界面设计语言,包含了视觉、运动、互动特效等特性。

2.Toolbar的使用

Toolbar不仅继承了ActionBar的所有功能,而且灵活性很高,可以配合其他控件完成一些Material Design的效果。

创建项目的时候默认会使用ActionBar,这个是在AppTheme中定义的。如果想使用toolbar需要指定不带ActionBar的主题。一般使用Theme.AppCompat.NoActionBar或者Theme.Appcompat.Light.NoActionBar。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        tools:context=".MaterialActivity">

    <androidx.appcompat.widget.Toolbar
            android:id="@+id/toolBar"
            android:layout_width="match_parent"
             android:layout_height="?attr/actionBarSize"
             android:background="@color/colorPrimary"
             android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
             app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
    />

</FrameLayout>

给一个界面的布局文件指定ToolBar,然后在Activity中设置setSupportActionBar(toolBar),就可以显示出来标题了,看起来跟ActionBar下效果一样,但是已经不是ActionBar了,是ToolBar了。

指定ToolBar的文案使用label标签

<activity android:name=".MaterialActivity"
    android:label="美女">

现在看起来很单调,设置一个menu给ToolBar,在Res文件下新建menu文件夹,创建toolbar.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/backup"
          android:icon="@mipmap/ic_backup"
          android:title="Backup"
          app:showAsAction="always"/>

    <item android:id="@+id/delete"
          android:icon="@mipmap/ic_delete"
          android:title="Delete"
          app:showAsAction="ifRoom"/>

    <item android:id="@+id/settings"
          android:icon="@mipmap/ic_settings"
          android:title="settings"
          app:showAsAction="never"/>

</menu>

在activity中重写菜单的两个方法,一个是onCreateOptionsMenu这个是创建菜单,返回上面的菜单就好,另外一个是onOptionsItemSelected这个是菜单点击回调。

override fun onCreateOptionsMenu(menu: Menu?): Boolean {
    menuInflater.inflate(R.menu.toolbar,menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    when(item.itemId){
        R.id.backup -> showToast("backup")
        R.id.delete -> showToast("delete")
        R.id.settings -> showToast("settings")
    }

    return true
}

3.滑动菜单DrawerLayout

DrawerLayout是一个滑动菜单,不用的时候可以隐藏起来,使用的使用把它通过滑动的方式显示出来。节省了屏幕控件又带有非常好的动画效果,是Material Design中的推荐做法。

DrawerLayout 允许有两个直接子控件,第一个是显示的主屏幕的内容,另外一个是子菜单的内容,实例如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".materila.MaterialActivity">

        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolBar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/colorPrimary"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        />

    </FrameLayout>

    <TextView android:layout_width="match_parent"
              android:text="this is menu"
              android:background="#fff"
              android:textSize="29sp"
              android:layout_gravity="start"
              android:layout_height="match_parent"/>

</androidx.drawerlayout.widget.DrawerLayout>

注意这个必须指定: android:layout_gravity="start",这样就可以通过右滑动来显示这个菜单了。由于用户可能不知道有这样一个菜单,一般还需要增加一个导航按钮。

 override fun onCreate(savedInstanceState: Bundle?) {
       ...
        setSupportActionBar(toolBar)
        supportActionBar?.let {
            it.setDisplayHomeAsUpEnabled(true)
            it.setHomeAsUpIndicator(R.mipmap.ic_menu)
        }
    }


    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            android.R.id.home -> {
                drawerLayout.openDrawer(GravityCompat.START)
            }
         ...
        }

        return true
    }
}

这样就设置好了Home导航按钮,以及点击事件,ToolBar最左侧的按钮就是Home按钮,默认的图片是一个返回箭头

4.NavigationView

这个控件非常适合做滑动菜单的内容,效果非常好,实现也非常简单。

<?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/navCall"
                android:icon="@mipmap/nav_call"
                android:title="Call"/>

        <item android:id="@+id/navFriends"
              android:icon="@mipmap/nav_friends"
              android:title="Friends"/>

        <item android:id="@+id/navLocation"
              android:icon="@mipmap/nav_location"
              android:title="Location"/>

        <item android:id="@+id/navMail"
              android:icon="@mipmap/nav_mail"
              android:title="Mail"/>

        <item android:id="@+id/navTask"
              android:icon="@mipmap/nav_task"
              android:title="Tasks"/>
    </group>

</menu>

创建NavMenu

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                xmlns:app="http://schemas.android.com/apk/res-auto"
                android:orientation="vertical"
                android:layout_width="match_parent"
                android:padding="10dp"
                android:background="@color/colorPrimary"
                android:layout_height="180dp">

    <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/iconImage"
            app:civ_border_width="2dp"
            app:civ_border_color="#fff"
            android:layout_width="70dp"
            android:src="@mipmap/nav_icon"
            android:layout_centerInParent="true"
            android:layout_height="70dp"/>

    <TextView
            android:id="@+id/mailText"
            android:layout_width="wrap_content"
            android:layout_alignParentBottom="true"
            android:textColor="#fff"
            android:textSize="14sp"
            android:text="她在滑雪场滑雪呢"
            android:layout_height="wrap_content"/>

    <TextView
            android:id="@+id/userText"
            android:layout_width="wrap_content"
            android:textColor="#fff"
            android:textSize="14sp"
            android:layout_height="wrap_content"
        android:layout_above="@+id/mailText"
              android:text="刘若兮和雪人"
    />

</RelativeLayout>

创建Nav_Header

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >

   ...

    <com.google.android.material.navigation.NavigationView
            android:id="@+id/navView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_gravity="start"
            app:menu="@menu/nav_menu"
            app:headerLayout="@layout/nav_header"
    />

</androidx.drawerlayout.widget.DrawerLayout>

将nav_menu和nav_header添加到NavigationView中。

override fun onCreate(savedInstanceState: Bundle?) {
   ...
    navView.setCheckedItem(R.id.navCall)  //默认选中某个item
    navView.setNavigationItemSelectedListener {
        when(it.itemId){
            R.id.navCall-> showToast("Call")
            R.id.navLocation-> showToast("Location")
        }
        drawerLayout.closeDrawers()
        true
    }
}

设置navicationView的点击事件以及默认选中

5.悬浮按钮FloatingActionButton

这个是底部带阴影的悬浮按钮,具有立体的效果,默认使用colorAccent作为按钮的颜色。

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.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:id="@+id/drawerLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
       >

    <FrameLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".materila.MaterialActivity">

      ...

        <com.google.android.material.floatingactionbutton.FloatingActionButton
                android:id="@+id/fab"
                android:layout_gravity="bottom|end"
                android:layout_margin="15dp"
                android:src="@mipmap/ic_done"
                app:elevation="4dp"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>

    </FrameLayout>

...

</androidx.drawerlayout.widget.DrawerLayout>

在布局文件中添加这个控件,可以通过elcvation这个属性设置高度值,高度值越大投影范围越小。

backgroundTint 通过这个属性可以更改默认背景颜色

fab.setOnClickListener {
    showToast("FAB click")
}

给悬浮按钮设置点击事件

6.SnackBar

这个控件更Toast类似,但是并不是Toast的替代品,它有不同的应用场景,SnackBar给用户提示的同时还可以提供了一个交互的设计。

fab.setOnClickListener {
    Snackbar.make(it,"Data deleted",Snackbar.LENGTH_LONG).setAction("Done"){
        showToast("confirm delete data")
    }.show()
}

可见用法跟Toast类似,增加了一个setAction的方法。SnackBar从底部弹出,并带有动画效果,会自动从底部消失。

7.CoordinatorLayout

上面在弹出SnackBar会遮挡FloatActionButton,这个时候就可以通过使用CoordinatorLayout来解决这个小bug了,CoordinatorLayout这个是FrameLayout的加强版。这个容器扩展了对子控件的事件监听,并自动帮我们做出最合理的响应。

修复FloatActionButton被遮挡的问题,只需要将FrameLayout替换成CoordinatorLayout就可以,替换之后没有任何其他的问题。弹出SnackBar之后,悬浮按钮会自动向上移动。SnackBar消失悬浮按钮会自动的回到原来的位置,整个过程都是带有动画的非常丝滑。

8.MaterialCardView与RecyclerView

MaterialCardView是卡片式布局效果的重要控件,它也是一个FrameLayout,只是额外提供了圆角和阴影效果。

RecyclerView是ListView的加强版本。

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.material.card.MaterialCardView
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_margin="6dp"
        app:cardCornerRadius="4dp"
        android:layout_height="wrap_content">
    <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" >
        <ImageView android:id="@+id/girlImage" android:layout_width="match_parent" android:layout_height="100dp" android:scaleType="centerCrop"/>
        <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal"
                  android:layout_margin="5dp"
                  android:textSize="15sp"
                  android:id="@+id/girlName"
        />
    </LinearLayout>

</com.google.android.material.card.MaterialCardView>

创建卡片Item布局

class GirlAdapter(private val context:Context, private val girlList:List<BeautyGirl>): RecyclerView.Adapter<GirlAdapter.GirlHolder>() {

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GirlHolder {
        val view:View = LayoutInflater.from(context).inflate(R.layout.girl_item,parent,false)
        return GirlHolder(view)
    }

    override fun getItemCount(): Int {
        return girlList.size
    }

    override fun onBindViewHolder(holder: GirlHolder, position: Int) {
        val girl= girlList[position]
        holder.girlName.text = girl.name
        Glide.with(context).load(girl.imageId).into(holder.girlImage)
    }

    class GirlHolder(view : View) : RecyclerView.ViewHolder(view){
        var girlImage:ImageView = view.findViewById(R.id.girlImage)
        var girlName:TextView = view.findViewById(R.id.girlName)
    }

}

新建RecyclerView使用的适配器,通过构造方法设置数据

private fun initRecyclerView() {
    val girls= mutableListOf(BeautyGirl("美女1",R.mipmap.g1),BeautyGirl("美女2",R.mipmap.g2),BeautyGirl("美女3",R.mipmap.g3),
        BeautyGirl("美女4",R.mipmap.g4),BeautyGirl("美女5",R.mipmap.g5),BeautyGirl("美女6",R.mipmap.g6))

    val layoutManger=GridLayoutManager(this,2)
    recyclerView.layoutManager=layoutManger
    val adapter=GirlAdapter(this,girls)
    recyclerView.adapter=adapter
}

初始化RecyclerView,并设置数据,这样卡片样式的view就能显示到手机上了,整个列表优雅漂亮。

9.AppBarLayout

在上面展示列表的时候,发现列表遮挡住了ToolBar。传统的解决方法是,让RecyclerView设置marginTop值大小是Toolbar的高度,目前使用的外层容器时CoordinatorLayout,借助AppBarLayout这个控件就能修复这个问题,使用这个控件优势是:AppBarLayout具备了Material Design的设计理念。

<androidx.coordinatorlayout.widget.CoordinatorLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
      >

    <com.google.android.material.appbar.AppBarLayout android:layout_width="match_parent"
                                                     android:layout_height="wrap_content">
        <androidx.appcompat.widget.Toolbar
                android:id="@+id/toolBar"
                android:layout_width="match_parent"
                android:layout_height="?attr/actionBarSize"
                android:background="@color/colorPrimary"
                android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        />
    </com.google.android.material.appbar.AppBarLayout>



    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
    />

...

</androidx.coordinatorlayout.widget.CoordinatorLayout>

改动也不大,只需要将ToolBar移到AppBarLayout里边,然后将RecyclerView指定behavior行为就可以,其中appbar_scrolling_view_behavior在material 库里边。

当RecyclerView滚动的时候AppBarLayout就能收到滑动事件了,这样并没有看到Material Design效果。是因为AppBarLayout收到滑动事件,并没有处理滑动事件。

给ToolBar添加一个app:layout_scrollFlags,并设置值为sroll|enterAlways|snap

scroll表示:当RecyclerView滚动的时候,Toolbar会随着滚动,并实现隐藏。

enterAlways表示:当RecyclerView向下滚动的时候ToolBar会向下滚动并重新显示出来

snap表示:当Toolbar还没有完全隐藏或者显示的时候,会根据当前滚动的距离,自动选择显示还是隐藏。

10.实现下拉刷新SwipeRefreshLayout

列表下拉刷新,有各种各样的实现版本,风格也格式各样,下面介绍使用Google官方提供的SwipeRefreshLayout实现下拉刷新。

implementation 'androidx.swiperefreshlayout:swiperefreshlayout:1.0.0'

增加这个依赖

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        app:layout_behavior="@string/appbar_scrolling_view_behavior"
>

    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layout_behavior="@string/appbar_scrolling_view_behavior"
    />
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

将RecyclerView添加到SwipeRefreshLayout,注意将前面提到的behavior添加到SwipeRefreshLayout上面,这样就自动拥有了下拉刷新的功能了。

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
   ...
    swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary)
    swipeRefreshLayout.setOnRefreshListener {
        refreshGirls()
    }
}

    fun refreshGirls(){
        thread {
            Thread.sleep(2000)
            runOnUiThread{
                initGirls()
                adapter.setData(girls)
                swipeRefreshLayout.isRefreshing=false
            }
        }
    }

增加具体的刷新代码逻辑

11.折叠标题栏CollapsingToolbarLayout

CollapsingToolbarLayout是一个作用于Toolbar基础上的布局文件,可以让toolbar的效果变的丰富多彩,这个控件不能独立存在,只能作为AppBarLayout的子布局,而AppBarLayout又必须是CoordinatorLayout的子布局。

创建一个详情页面,布局文件如下

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".materila.GirlDetailActivity">
    <com.google.android.material.appbar.AppBarLayout android:id="@+id/appBar"
                                                     android:layout_width="match_parent"
                                                     android:layout_height="250dp">
        <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsingToolBar"
                                                                    android:layout_width="match_parent"
                                                                    android:layout_height="match_parent"
                                                                    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                                                                    app:contentScrim="@color/colorPrimary"
                                                                    app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <ImageView
                    android:id="@+id/girlImage"
                    android:layout_width="match_parent"
                    android:scaleType="centerCrop"
                    android:layout_height="match_parent"
                    app:layout_collapseMode="parallax"
            />

            <androidx.appcompat.widget.Toolbar
                    android:id="@+id/toolBar"
                    android:layout_width="match_parent"
                    android:layout_height="?actionBarSize"
                    app:layout_collapseMode="pin"
            />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

    <androidx.core.widget.NestedScrollView android:layout_width="match_parent"
                                           android:layout_height="match_parent"
                                           app:layout_behavior="@string/appbar_scrolling_view_behavior">
        <LinearLayout android:layout_width="match_parent"
                      android:layout_height="wrap_content"
                      android:orientation="vertical">
            <com.google.android.material.card.MaterialCardView android:layout_width="match_parent"
                                                               android:layout_height="wrap_content"
                                                               android:layout_margin="15dp" app:cardCornerRadius="4dp">
                <TextView android:id="@+id/content"
                          android:layout_width="wrap_content"
                          android:layout_height="wrap_content"
                          android:layout_margin="10dp"
                />
            </com.google.android.material.card.MaterialCardView>
        </LinearLayout>

    </androidx.core.widget.NestedScrollView>

    <com.google.android.material.floatingactionbutton.FloatingActionButton android:layout_width="wrap_content"
                                                                           android:layout_height="wrap_content"
                                                                           android:layout_margin="16dp"
                                                                           android:src="@mipmap/ic_comment"
                                                                           app:layout_anchor="@id/appBar"
                                                                           app:layout_anchorGravity="bottom|end"
    />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

1.最外层的容器是CoordinatorLayout,由于AppBarLayout父容器必须是CoordinatorLayout

2.toolBar部分最外层是AppBarLayout,里边是CollapsingToolBarLayout,CollapsingToolBarLayout这个控件设置了 3.app:contentScrim="@color/colorPrimary" 这个表示在趋于折叠状态或者折叠之后的颜色

4.exitUntilCollapsed:表示当collapsingToolBarLayout随着折叠之后就保留在界面上了,不再移出屏幕

5.app:layout_collapseMode="parallax" 这个表示折叠过程中的样式,设置为parallax表示折叠过程中产生一定的错位效果,错位视觉差。

6.NestedScrollView相比于ScrollView增加了嵌套响应滚动事件,并给这个控件指定了一个布局行为,内部只允许一个子控件

7.最后添加了一个悬浮按钮,

  • layout_anchor:指定一个锚点,这里锚点是AppBarLayout
  • app:layout_anchorGravity="bottom|end" :相对于锚点所在的位置
class GirlDetailActivity : AppCompatActivity() {

    companion object{
        const val GIRL_NAME="girl_name"
        const val GIRL_IMAGE="girl_image"
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_gril_detail)
        val girlName=intent.getStringExtra(GIRL_NAME)?:""
        val girlImageId=intent.getIntExtra(GIRL_IMAGE,0)
        setSupportActionBar(toolBar)
        supportActionBar?.setDisplayHomeAsUpEnabled(true)
        collapsingToolBar.title=girlName
        Glide.with(this).load(girlImageId).into(girlImage)
        content.text = initContent(girlName)

    }

    private fun initContent(girlName:String): String =girlName.repeat(500)

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            android.R.id.home->{
                finish()
                return true
            }
        }
        return super.onOptionsItemSelected(item)
    }

}

这里是详情页面的代码逻辑,设置了collapsingToobar的标题等,启动了HomeButton重写了menu的点击事件

class GirlAdapter(private val context:Context): RecyclerView.Adapter<GirlAdapter.GirlHolder>() {

    private   val mGirlList:MutableList<BeautyGirl> =ArrayList()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): GirlHolder {
        val view:View = LayoutInflater.from(context).inflate(R.layout.girl_item,parent,false)
        val holder=GirlHolder(view)
        holder.itemView.setOnClickListener {
            val position=holder.adapterPosition
            val girl=mGirlList[position]
            val intent= Intent(context,GirlDetailActivity::class.java).apply {
                putExtra(GirlDetailActivity.GIRL_NAME,girl.name)
                putExtra(GirlDetailActivity.GIRL_IMAGE,girl.imageId)
            }
            context.startActivity(intent)
        }
        return holder
    }

    fun setData(girlList:MutableList<BeautyGirl>?){
        mGirlList.clear()
        girlList?.let { mGirlList.addAll(it) }
        notifyDataSetChanged()
    }

    override fun getItemCount(): Int {
        return mGirlList.size
    }

    override fun onBindViewHolder(holder: GirlHolder, position: Int) {
        val girl= mGirlList[position]
        holder.girlName.text = girl.name
        Glide.with(context).load(girl.imageId).into(holder.girlImage)
    }

    class GirlHolder(view : View) : RecyclerView.ViewHolder(view){
        var girlImage:ImageView = view.findViewById(R.id.girlImage)
        var girlName:TextView = view.findViewById(R.id.girlName)
    }
   }

增加了RecyclerView的点击事件,并将参数传递给了详情页面,这样详情页面的标题栏就有折叠的效果,非常漂亮。

12.背景图跟系统状态栏视觉不搭配的问题

详情页面的背景图片跟系统状态栏看起来总是不搭配,可以通过设置android:fitsSystemWindows="true",设置为true表示该控件出现了系统状态栏里边。

注意CoordinatorLayout、AppBarLayout、CollapsingToolbarLayout以及ImageView都需要设置

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true"
        tools:context=".materila.GirlDetailActivity">
    <com.google.android.material.appbar.AppBarLayout android:id="@+id/appBar"
                                                     android:layout_width="match_parent"
                                                     android:fitsSystemWindows="true"
                                                     android:layout_height="250dp">
        <com.google.android.material.appbar.CollapsingToolbarLayout android:id="@+id/collapsingToolBar"
                                                                    android:layout_width="match_parent"
                                                                    android:layout_height="match_parent"
                                                                    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
                                                                    app:contentScrim="@color/colorPrimary"
                                                                    android:fitsSystemWindows="true"
                                                                    app:layout_scrollFlags="scroll|exitUntilCollapsed">
            <ImageView
                    android:id="@+id/girlImage"
                    android:layout_width="match_parent"
                    android:scaleType="centerCrop"
                    android:layout_height="match_parent"
                    app:layout_collapseMode="parallax"
                    android:fitsSystemWindows="true"
            />

            <androidx.appcompat.widget.Toolbar
                    android:id="@+id/toolBar"
                    android:layout_width="match_parent"
                    android:layout_height="?actionBarSize"
                    app:layout_collapseMode="pin"
            />

        </com.google.android.material.appbar.CollapsingToolbarLayout>

    </com.google.android.material.appbar.AppBarLayout>

...

</androidx.coordinatorlayout.widget.CoordinatorLayout>

除此之外还需要将系统状态栏设置为透明状态,给这个详情页面指定下面这个属性即可,齐刘海等屏幕都有效果,但是需要Android5.0或者以上的系统才可以。

<style name="girlActivityTheme" parent="AppTheme">
    <item name="android:statusBarColor">@android:color/transparent</item>
</style>

这样系统状态栏跟背景图片就融合到一起了,解决了背景图片跟系统状态栏颜色不搭配的问题。

相关文章

网友评论

      本文标题:Android-Kotlin-Material Design技术

      本文链接:https://www.haomeiwen.com/subject/vftclrtx.html