Android:实现高德地图首页效果(下)

大家好,我是似曾相识2022。不喜欢唱跳篮球,但对杰伦的Rap情有独钟。

书接上文Android:实现高德地图首页效果(上),咱们讲到能不能通过滑动监听玩出新花样,答案是能。但这里不再是通过NestedScrollView 添加滑动监听,而是交给咱们的BottomSheetBehavior

由于BottomSheetBehavior是在xml中配置,那么我们要怎么拿到它呢?内部提供了from方法:

ini 复制代码
val bottomSheetBehavior = BottomSheetBehavior.from(scrollView)

拿到BottomSheetBehavior 后通过addBottomSheetCallback添加监听。需要实现两个方法:

less 复制代码
public abstract static class BottomSheetCallback {
  //newState 状态变化,也就是隐藏、展开、半展开等状态
  public abstract void onStateChanged(@NonNull View bottomSheet, @State int newState);
  //slideOffset 0-1的一个比例值  代表当前位置高度占比
  public abstract void onSlide(@NonNull View bottomSheet, float slideOffset);
}

看到这里,大家应该知道应该怎么操作了,主要还是集中在onSlide 方法中拿到slideOffset值,根据该值的变化做对应效果展示。

首先,XML中添加搜索框等元素:

ini 复制代码
<com.google.android.material.textfield.TextInputEditText
    android:id="@+id/search_view"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center_vertical"
    android:background="@null"
    android:drawableStart="@drawable/ic_search_grey"
    android:drawablePadding="8dp"
    android:gravity="center_vertical"
    android:hint="搜索关键词"
    android:imeOptions="actionSearch"
    android:maxLines="1"
    android:padding="10dp"
    android:singleLine="true"
    android:textColor="@color/text_color_1"
    android:textSize="15dp" />
    
 <TextView
        android:id="@+id/homeView"
        android:text="渐变"
        android:gravity="center"
        android:background="@drawable/shape_white"
        android:drawableLeft="@drawable/ic_chip_home"
        android:drawablePadding="6dp"
        android:layout_width="wrap_content"
        android:layout_height="30dp"/>

核心逻辑是需要获取当前位置高度,以此来判断是否到达咱们之前设置的半展开高度(注意这里的半展开设置的也是占比值)。当滑动距离大于半展开高度就需要将搜索框向上平移且渐变。同时搜索框下面的homeView也需要做渐变操作。反之,在收回的时候当距离小于半展开状态需要恢复各视图状态。

ini 复制代码
override fun onSlide(bottomSheet: View, slideOffset: Float) {
//在peekHeight位置以上 滑动(向上、向下) slideOffsetbottomSheet.getHeight() 是展开后的高度的比例
  if (slideOffset > 0) { 
     val height = bottomSheet.height
     distance = height * slideOffset
     //搜索栏反向位移
     val halfExpandedRatio = bottomSheetBehavior!!.halfExpandedRatio
     val halfHeight = halfExpandedRatio * height //中间状态的高度
     if (distance > halfHeight) {
         search_view?.translationY = -(distance - halfHeight)
         search_view?.alpha = 1 - slideOffset + halfExpandedRatio
         homeView?.alpha = 1 - slideOffset
        } else {
         search_view?.translationY = 0f
         search_view?.alpha = 1.0f
         homeView?.alpha = 1.0f
        }
        fabContainer?.alpha = 1 - slideOffset
  }
}

到此,咱们gif展示的效果基本就实现了。只要你的想象力够丰富,在这里玩出花都可以。

以上便是实现高德地图首页效果的全部内容,希望对大家有所帮助。

相关推荐
雨白1 小时前
Android 快捷方式实战指南:静态、动态与固定快捷方式详解
android
hqk1 小时前
鸿蒙项目实战:手把手带你实现 WanAndroid 布局与交互
android·前端·harmonyos
LING2 小时前
RN容器启动优化实践
android·react native
恋猫de小郭4 小时前
Flutter 发布官方 Skills ,Flutter 在 AI 领域再添一助力
android·前端·flutter
Kapaseker10 小时前
一杯美式搞懂 Any、Unit、Nothing
android·kotlin
黄林晴10 小时前
你的 Android App 还没接 AI?Gemini API 接入全攻略
android
恋猫de小郭20 小时前
2026 Flutter VS React Native ,同时在 AI 时代 VS Native 开发,你没见过的版本
android·前端·flutter
冬奇Lab21 小时前
PowerManagerService(上):电源状态与WakeLock管理
android·源码阅读
BoomHe1 天前
Now in Android 架构模式全面分析
android·android jetpack
二流小码农1 天前
鸿蒙开发:上传一张参考图片便可实现页面功能
android·ios·harmonyos