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

书接上文Android:完成高德地图主页作用(上),我们讲到能不能经过滑动监听玩出新花样,答案是能。但这里不再是经过NestedScrollView增加滑动监听,而是交给我们的BottomSheetBehavior

因为BottomSheetBehavior是在xml中装备,那么我们要怎样拿到它呢?内部提供了from办法:

val bottomSheetBehavior = BottomSheetBehavior.from(scrollView)

拿到BottomSheetBehavior后经过addBottomSheetCallback增加监听。需求完成两个办法:

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中增加查找框等元素:

<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也需求做突变操作。反之,在回收的时候当间隔小于半打开状态需求康复各视图状态。

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展现的作用基本就完成了。只需你的想象力够丰厚,在这里玩出花都可以。

以上就是完成高德地图主页作用的全部内容,希望对我们有所帮助。