Kotlin实现详情页效果

效果图如下:

核心代码:

class MainActivity : AppCompatActivity() {
    private lateinit var pictureAdapter: DetailBannerAdapter
    private lateinit var goodAdapter: GoodAdapter
    private var pictureSize = 0
    private val pic1 = "https://img0.baidu.com/it/u=3026939796,485761977&fm=26&fmt=auto&gp=0.jpg"
    private val pic2 = "https://img0.baidu.com/it/u=3348901843,1771497252&fm=26&fmt=auto&gp=0.jpg"
    private val pic3 = "https://img1.baidu.com/it/u=1854853755,697259050&fm=26&fmt=auto&gp=0.jpg"


    private val image1 =
        "https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=153960715,2502274764&fm=26&gp=0.jpg"
    private val image2 =
        "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=1002886338,3952456142&fm=26&gp=0.jpg"
    private val image3 =
        "https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=1568028465,3811484724&fm=26&gp=0.jpg"
    private val image4 =
        "https://ss0.bdstatic.com/70cFuHSh_Q1YnxGkpoWK1HF6hhy/it/u=3804022019,516515349&fm=26&gp=0.jpg"


    private val picList = mutableListOf<String>()
    private var goodList = mutableListOf<GoodBean>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        StatusBarUtil.immersive(window)
        initData()
        initViewPager()
        appBar.addOnOffsetChangedListener(object : AppBarLayout.OnOffsetChangedListener {
            override fun onOffsetChanged(appBarLayout: AppBarLayout?, verticalOffset: Int) {
                appBarLayout?.post {
                    val offset = abs(verticalOffset) //目的是将负数转换为绝对正数;
                    //标题栏的渐变
                    toolBar.alpha = abs(verticalOffset * 1.0f) / appBarLayout.totalScrollRange
                    tvTitle.alpha = abs(verticalOffset * 1.0f) / appBarLayout.totalScrollRange
//          当前最大高度偏移值除以2 在减去已偏移值 获取浮动 先显示在隐藏

                    if (offset < appBarLayout.totalScrollRange / 2) {
                        toolBar.alpha =
                            (appBarLayout.totalScrollRange / 2 - offset * 1.0f) / (appBarLayout.totalScrollRange / 2)
                    } else if (offset > appBarLayout.totalScrollRange / 2) {
                        toolBar.alpha =
                            (offset - appBarLayout.totalScrollRange / 2) * 1.0f / (appBarLayout.totalScrollRange / 2)
                    }
                }
            }

        })

        tvTitle.text = "不小心步入你的温柔圈套"
    }

    private fun initData() {
        picList.clear()
        picList.apply {
            add(pic1)
            add(pic2)
            add(pic3)
        }
        pictureSize = picList.size
        goodList.clear()
        goodList.apply {
            add(GoodBean("太阳有点烧", "不只是否我太上脑", image1, "100"))
            add(GoodBean("心跳 往上冒", "阻止不了地在舞蹈", image2, "200"))
            add(GoodBean("不小心步入了你温柔圈套", "不知道 不明了还能否逃跑", image3, "300"))
            add(GoodBean("碰巧不需要你过多的打扰", "我只要 你一个微笑就好", image4, "400"))
            add(GoodBean("你在我指尖发梢 环绕", "你在跟我玩闹 chill out", image1, "500"))
            add(GoodBean("你不在乎我要 多少", "呼吸你的味道 刚好", image2, "600"))
            add(GoodBean("你在我脑海围绕 奔跑", "让我的心燃烧 失焦", image3, "700"))
            add(GoodBean("你让我的心跳 停掉", "感觉有点微妙 不好", image4, "800"))
        }

        goodAdapter = GoodAdapter()
        recyclerview.apply {
            adapter = goodAdapter
            layoutManager = LinearLayoutManager(this@MainActivity)
        }

        goodAdapter.setNewData(goodList)
        Handler().postDelayed({
            recyclerview.visibility = View.VISIBLE
            iv_checking_progress.visibility = View.INVISIBLE
            iv_hotel_tips.visibility = View.INVISIBLE
            tvTip.visibility = View.INVISIBLE
        }, 500)
    }

    private fun initViewPager() {
        pictureAdapter = DetailBannerAdapter(this, listOf())
        viewPagerHotel.adapter = pictureAdapter
        viewPagerHotel.addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
            private var canJump = false
            override fun onPageScrollStateChanged(state: Int) {
                if (state == ViewPager.SCROLL_STATE_SETTLING) {
                    if (canJump) {
                        viewPagerHotel.post {
                            viewPagerHotel.currentItem = 5
                        }
                    }

                }
            }

            override fun onPageScrolled(
                position: Int, positionOffset: Float, positionOffsetPixels: Int
            ) {
                canJump = if (position == 5) {
                    positionOffsetPixels > 50
                } else {
                    false
                }
            }

            override fun onPageSelected(position: Int) {
                tvCurrentPicturePosition.text = "${position + 1}/$pictureSize"
            }

        })

        pictureAdapter.setNewData(picList)
    }
}
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.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">

    <com.google.android.material.appbar.AppBarLayout
        android:id="@+id/appBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#FFF4F6FC">

        <include layout="@layout/layout_hotel_info_header"/>

        <LinearLayout
            android:id="@+id/llFilter"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#fff"
            android:orientation="vertical"
            app:layout_scrollFlags="scroll|exitUntilCollapsed">

            <androidx.constraintlayout.widget.ConstraintLayout
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="@dimen/padding_common_h">

                <TextView
                    android:id="@+id/tvTotalNight"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/padding_common"
                    android:background="@drawable/bg_total_night"
                    android:gravity="center"
                    android:includeFontPadding="false"
                    android:paddingStart="@dimen/padding_common"
                    android:paddingEnd="@dimen/padding_common"
                    android:textColor="#FF8D94A9"
                    android:textSize="13sp"
                    app:layout_constraintBottom_toBottomOf="@+id/tvCheckInTime"
                    app:layout_constraintStart_toEndOf="@+id/tvCheckInTime"
                    app:layout_constraintTop_toTopOf="@+id/tvCheckInTime"
                    android:text="共1晚" />

                <TextView
                    android:id="@+id/tvCheckIn"
                    android:layout_width="67dp"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="开始"
                    android:textSize="12sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

                <TextView
                    android:id="@+id/tvCheckOut"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:includeFontPadding="false"
                    android:text="结束"
                    android:textSize="12sp"
                    app:layout_constraintBottom_toTopOf="@+id/tvCheckOutTime"
                    app:layout_constraintEnd_toEndOf="@+id/tvCheckOutTime"
                    app:layout_constraintStart_toStartOf="@+id/tvCheckOutTime"
                    app:layout_constraintTop_toTopOf="parent" />

                <TextView
                    android:id="@+id/tvCheckInTime"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="2dp"
                    android:fontFamily="sans-serif-medium"
                    android:includeFontPadding="false"
                    android:textColor="#292929"
                    android:textSize="17sp"
                    app:layout_constraintStart_toStartOf="parent"
                    app:layout_constraintTop_toBottomOf="@+id/tvCheckIn"
                    android:text="10月23日" />


                <TextView
                    android:id="@+id/tvCheckOutTime"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/padding_common"
                    android:layout_marginTop="2dp"
                    android:fontFamily="sans-serif-medium"
                    android:textColor="#292929"
                    android:textSize="17sp"
                    app:layout_constraintBottom_toBottomOf="@id/tvCheckInTime"
                    app:layout_constraintStart_toEndOf="@+id/tvTotalNight"
                    app:layout_constraintTop_toTopOf="@+id/tvCheckInTime"
                    android:text="10月24日" />

                <TextView
                    android:id="@+id/tv_change_date"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:drawableEnd="@drawable/ic_arrow_grey_right"
                    android:text="修改日期"
                    android:textColor="#FF8D94A9"
                    android:textSize="12sp"
                    app:layout_constraintBottom_toBottomOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintTop_toTopOf="parent" />

            </androidx.constraintlayout.widget.ConstraintLayout>

            <LinearLayout
                android:id="@+id/ll_fast_filter"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="vertical"
                android:visibility="visible"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent">

                <View
                    android:id="@+id/lineTime"
                    android:layout_width="match_parent"
                    android:layout_height="0.5dp"
                    android:layout_marginStart="8dp"
                    android:background="#FFF4F6FC" />

                <RelativeLayout
                    android:id="@+id/rlFilter"
                    android:layout_width="match_parent"
                    android:layout_height="40dp"
                    android:visibility="gone">

                    <androidx.recyclerview.widget.RecyclerView
                        android:id="@+id/rvFastFilter"
                        android:layout_width="match_parent"
                        android:layout_height="30dp"
                        android:layout_centerVertical="true"
                        android:paddingStart="@dimen/padding_common_h"
                        android:paddingEnd="@dimen/padding_common_h"
                        tools:listitem="@layout/item_hotel_fast_filter" />

                    <RelativeLayout
                        android:layout_width="86dp"
                        android:layout_height="match_parent"
                        android:layout_alignParentEnd="true"
                        android:background="#fff"
                        android:visibility="gone">

                        <TextView
                            android:id="@+id/tvFilter"
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_centerInParent="true"
                            android:gravity="center"
                            android:includeFontPadding="false"
                            android:text="筛选"
                            android:textColor="#292929" />

                        <ImageView
                            android:layout_width="wrap_content"
                            android:layout_height="wrap_content"
                            android:layout_centerVertical="true"
                            android:layout_toEndOf="@id/tvFilter"
                            android:src="@drawable/ic_sort_unselected_black" />
                    </RelativeLayout>

                </RelativeLayout>
            </LinearLayout>

        </LinearLayout>

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

    <include
        layout="@layout/layout_hotel_info_content" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

源码地址:https://download.csdn.net/download/jingerlovexiaojie/18553988

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值