进来看看是不是你想要的效果,Android吸顶效果,并有着ViewPager左右切换

*/

override fun onNestedPreScroll(

target: View,

dx: Int,

dy: Int,

consumed: IntArray,

type: Int

) {

if (dy > 0 && scrollY < maxScrollY) {

scrollBy(0, dy)

consumed[1] = dy

}

}

}

布局文件

我按照美团的布局大体写出这样的布局

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout 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”

android:orientation=“vertical”

tools:context=“.MainActivity”>

<LinearLayout

android:id=“@+id/titleBar”

android:layout_width=“match_parent”

android:layout_height=“45dp”

android:gravity=“center_vertical”

android:orientation=“horizontal”

android:paddingLeft=“18dp”

android:paddingRight=“18dp”>

<EditText

android:layout_width=“0dp”

android:layout_height=“35dp”

android:layout_marginEnd=“12dp”

android:layout_marginRight=“12dp”

android:layout_weight=“1”

android:background=“@drawable/edit_style”

android:paddingLeft=“12dp”

android:paddingRight=“12dp” />

<TextView

android:layout_width=“wrap_content”

android:layout_height=“35dp”

android:background=“@drawable/button_style”

android:gravity=“center”

android:paddingLeft=“15dp”

android:paddingRight=“15dp”

android:text=“搜索”

android:textColor=“#333333”

android:textStyle=“bold” />

<com.cyn.mt.CoordinatorScrollview

android:id=“@+id/coordinatorScrollView”

android:layout_width=“match_parent”

android:layout_height=“match_parent”>

<LinearLayout

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:orientation=“vertical”>

<LinearLayout

android:id=“@+id/titleLinerLayout”

android:layout_width=“match_parent”

android:layout_height=“wrap_content”

android:orientation=“vertical” />

<com.google.android.material.tabs.TabLayout

android:id=“@+id/tabLayout”

android:layout_width=“match_parent”

android:layout_height=“wrap_content” />

<androidx.viewpager.widget.ViewPager

android:id=“@+id/viewPager”

android:layout_width=“match_parent”

android:layout_height=“wrap_content” />

</com.cyn.mt.CoordinatorScrollview>


Fragment

加入,在Fragment中放入RecyclerView,提供给ViewPager使用,这里代码就不贴了,可以直接下源码!源码在文章末尾!


主要代码(重点来了)

coordinatorScrollView最大滑动距离即是titleLinerLayout的高度,所以实现titleLinerLayout的post方法,来监听titleLinerLayout的高度,由于这一块布局常常是通过网络请求后加载,所以,网络请求完毕后要再次实现post设置coordinatorScrollView最大滑动距离,如第80行代码和第90行代码,在这里,我并不推荐使用多次回调监听的方法!使用post只用调用一次,如果使用多次监听View变化的方法,应该在最后一次网络请求完毕后将此监听事件remove掉!

package com.cyn.mt

import android.content.res.Resources

import android.os.Bundle

import android.os.Handler

import android.util.DisplayMetrics

import android.view.LayoutInflater.from

import android.view.View

import androidx.appcompat.app.AppCompatActivity

import androidx.fragment.app.Fragment

import kotlinx.android.synthetic.main.activity_main.*

import kotlinx.android.synthetic.main.title_layout.view.*

class MainActivity : AppCompatActivity() {

//屏幕宽

var screenWidth = 0

//屏幕高

var screenHeight = 0

//tabLayout的文本和图片

private val tabTextData = arrayOf(“常用药品”, “夜间送药”, “隐形眼镜”, “成人用品”, “医疗器械”, “全部商家”)

private val tabIconData = arrayOf(

R.mipmap.tab_icon,

R.mipmap.tab_icon,

R.mipmap.tab_icon,

R.mipmap.tab_icon,

R.mipmap.tab_icon,

R.mipmap.tab_icon

)

private var fragmentData = mutableListOf()

override fun onCreate(savedInstanceState: Bundle?) {

super.onCreate(savedInstanceState)

setContentView(R.layout.activity_main)

initView()

initData()

}

private fun initView() {

//获取屏幕宽高

val resources: Resources = this.resources

val dm: DisplayMetrics = resources.displayMetrics

screenWidth = dm.widthPixels

screenHeight = dm.heightPixels

//状态栏沉浸

StatusBarUtil.immersive(this)

//titleBar填充

StatusBarUtil.setPaddingSmart(this, titleBar)

//状态栏字体颜色设置为黑色

StatusBarUtil.darkMode(this)

//动态设置ViewPager高度

coordinatorScrollView.post {

val layoutParams = viewPager.layoutParams

layoutParams.width = screenWidth

layoutParams.height = coordinatorScrollView.height - tabLayout.height

viewPager.layoutParams = layoutParams

}

}

private fun initData() {

//我模拟在头部动态添加三个布局,就用图片代替了,要设置的图片高度都是我提前算好的,根据屏幕的比例来计算的

val titleView1 = getTitleView(screenWidth * 0.42F, R.mipmap.title1)

val titleView2 = getTitleView(screenWidth * 0.262F, R.mipmap.title2)

titleLinerLayout.addView(titleView1)

titleLinerLayout.addView(titleView2)

//设置最大滑动距离

titleLinerLayout.post {

coordinatorScrollView.setMaxScrollY(titleLinerLayout.height)

}

//用于请求网络后动态添加子布局

Handler().postDelayed({

val titleView3 = getTitleView(screenWidth * 0.589F, R.mipmap.title3)

titleLinerLayout.addView(titleView3)

//再次设置最大滑动距离

titleLinerLayout.post {

coordinatorScrollView.setMaxScrollY(titleLinerLayout.height)

}

}, 200)

//添加TabLayout

for (i in tabTextData.indices) {

tabLayout.addTab(tabLayout.newTab())

tabLayout.getTabAt(i)!!.setText(tabTextData[i]).setIcon(tabIconData[i])
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

img

img

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)

重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

高级进阶篇——高级UI,自定义View(部分展示)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

  • 面试题部分合集
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!

/03/13/H4lCoPEF.jpg" />

重要知识点

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。

[外链图片转存中…(img-22Kyf1bO-1712219529668)]

高级进阶篇——高级UI,自定义View(部分展示)

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-Jb26gdS1-1712219529668)]

  • 面试题部分合集
    [外链图片转存中…(img-Av8FnFJU-1712219529668)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!
  • 27
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值