android RecyclerView CoordinatorLayout 实现上拉联动效果

CoordinatorLayoutCustomerFragment类:
package com.example.androidkotlindemo2.coordinator

import android.os.Bundle
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.fragment.app.Fragment
import com.example.androidkotlindemo2.databinding.*


/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2023/11/5 10:57
 * Description :  
 */
class CoordinatorLayoutCustomerFragment : Fragment() {


    private lateinit var binding : CoordinatorLayoutMain5Binding

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        binding = CoordinatorLayoutMain5Binding.inflate(inflater, container, false)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        var adapter = CoordinatorAdapter1(requireActivity(), getData())
        binding.rv.adapter = adapter

    }

    private fun getData() : List<String>{
        var list = mutableListOf<String>()
        for(i in 0..60){
            list.add("测试 ${i}")
        }
        return list
    }


}

CoordinatorAdapter1类:
package com.example.androidkotlindemo2.coordinator

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.example.androidkotlindemo2.R

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2023/11/11 11:14
 * Description :
 */
class CoordinatorAdapter1(private val context : Context, private val list : List<String>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun getItemCount(): Int = list.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        var view = LayoutInflater.from(context).inflate(R.layout.coordinator_layout_main5_item, parent, false)
        var viewHolder = ViewHolder1(view)
        return viewHolder
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        var holder1 = holder as ViewHolder1
        var name = list[position]
        holder1.nameTextView?.text = name
    }

    internal  class ViewHolder1 : RecyclerView.ViewHolder {

        var nameTextView : TextView? = null

        constructor(itemView: View) : super(itemView) {
            this.nameTextView = itemView.findViewById(R.id.coordinator_item5_name)
        }

    }


}

coordinator_layout_main5.xml布局:

<?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"
    android:fitsSystemWindows="false"
    android:background="#fff">

    <ImageView
        android:id="@+id/scrolling_header"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"
        android:background="@mipmap/base_banner0" />

    <LinearLayout
        android:id="@+id/edit_search"
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:background="@color/colorInitFloatBackground"
        app:layout_behavior="@string/header_float_behavior">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="20dp"
            android:textColor="#90000000"
            android:text="搜索关键字" />
    </LinearLayout>


    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#fff"
        app:layout_behavior="@string/header_scrolling_behavior"
        app:layoutManager="LinearLayoutManager" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

coordinator_layout_main5_item.xml布局:

<?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="wrap_content"
    android:fitsSystemWindows="false"
    android:background="#fff">


        <TextView
            android:id="@+id/coordinator_item5_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginStart="20dp"
            android:textColor="#90000000"
            android:text="名称" />


</androidx.coordinatorlayout.widget.CoordinatorLayout>

strings.xml添加:

<string name="header_float_behavior">com.example.androidkotlindemo2.coordinator.HeaderFloatBehavior</string>
HeaderFloatBehavior类:
package com.example.androidkotlindemo2.coordinator;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;

import androidx.coordinatorlayout.widget.CoordinatorLayout;

import android.animation.ArgbEvaluator;
import android.content.res.Resources;

import com.example.androidkotlindemo2.R;

import java.lang.ref.WeakReference;

/**
 * Author : wn
 * Email : maoning20080809@163.com
 * Date : 2023/11/11 10:44
 * Description :
 */
public class HeaderFloatBehavior extends CoordinatorLayout.Behavior<View> {
    private WeakReference<View> dependentView;
    private ArgbEvaluator argbEvaluator;

    public HeaderFloatBehavior(Context context, AttributeSet attrs) {
        super(context, attrs);

        argbEvaluator = new ArgbEvaluator();
    }

    @Override
    public boolean layoutDependsOn(CoordinatorLayout parent, View child, View dependency) {
        if (dependency != null && dependency.getId() == R.id.scrolling_header) {
            dependentView = new WeakReference<>(dependency);
            return true;
        }
        return false;
    }

    @Override
    public boolean onDependentViewChanged(CoordinatorLayout parent, View child, View dependency) {
        Resources resources = getDependentView().getResources();
        final float progress = 1.f -
                Math.abs(dependency.getTranslationY() / (dependency.getHeight() - resources.getDimension(R.dimen.collapsed_header_height)));

        // Translation
        final float collapsedOffset = resources.getDimension(R.dimen.collapsed_float_offset_y);
        final float initOffset = resources.getDimension(R.dimen.init_float_offset_y);
        final float translateY = collapsedOffset + (initOffset - collapsedOffset) * progress;
        child.setTranslationY(translateY);

        // Background
        child.setBackgroundColor((int) argbEvaluator.evaluate(
                progress,
                resources.getColor(R.color.colorCollapsedFloatBackground),
                resources.getColor(R.color.colorInitFloatBackground)));

        // Margins
        final float collapsedMargin = resources.getDimension(R.dimen.collapsed_float_margin);
        final float initMargin = resources.getDimension(R.dimen.init_float_margin);
        final int margin = (int) (collapsedMargin + (initMargin - collapsedMargin) * progress);
        CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) child.getLayoutParams();
        lp.setMargins(margin, 0, margin, 0);
        child.setLayoutParams(lp);

        return true;
    }

    private View getDependentView() {
        return dependentView.get();
    }


}

colors.xml

<color name="colorInitFloatBackground">#b0ffffff</color>
<color name="colorCollapsedFloatBackground">#e4e4e4</color>

dimens.xml

<dimen name="collapsed_header_height">50dp</dimen>
<dimen name="init_float_offset_y">130dp</dimen>
<dimen name="collapsed_float_offset_y">5dp</dimen>
<dimen name="init_float_margin">20dp</dimen>
<dimen name="collapsed_float_margin">5dp</dimen>

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android CoordinatorLayout和BottomSheetBehavior可以实现地图的联动效果。首先,在布局文件中,使用CoordinatorLayout作为根布局,并在其中添加地图视图和BottomSheet视图。 ``` <androidx.coordinatorlayout.widget.CoordinatorLayout ... > <com.google.android.gms.maps.MapView android:id="@+id/mapView" ... /> <LinearLayout android:id="@+id/bottomSheet" ... /> </androidx.coordinatorlayout.widget.CoordinatorLayout> ``` 然后,在代码中,获取地图视图的引用,并设置BottomSheetBehavior。 ``` MapView mapView = findViewById(R.id.mapView); BottomSheetBehavior<View> bottomSheetBehavior = BottomSheetBehavior.from(findViewById(R.id.bottomSheet)); ``` 接下来,我们可以使用地图的监听器来监听地图滑动的事件,并根据地图的状态来控制BottomSheet的展示和隐藏。 ``` mapView.getMapAsync(new OnMapReadyCallback() { @Override public void onMapReady(GoogleMap googleMap) { googleMap.setOnCameraIdleListener(new GoogleMap.OnCameraIdleListener() { @Override public void onCameraIdle() { LatLng mapCenter = googleMap.getCameraPosition().target; // 根据地图的状态判断是否展示BottomSheet if (条件) { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_COLLAPSED); } else { bottomSheetBehavior.setState(BottomSheetBehavior.STATE_HIDDEN); } } }); } }); ``` 以上代码实现了地图滑动时的联动效果。当地图状态满足条件时,BottomSheet会显示在地图视图的底部;否则,BottomSheet会隐藏起来。你可以根据实际需求自定义条件,并实现特定的联动效果。 需要注意的是,为了保证联动效果的正确实现,你还需要正确管理和处理地图视图的生命周期,并在相应的生命周期方法中调用MapView的对应方法,例如onCreate、onStart、onResume、onPause、onStop、onDestroy。 ``` @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... mapView.onCreate(savedInstanceState); } @Override protected void onStart() { super.onStart(); mapView.onStart(); } @Override protected void onResume() { super.onResume(); mapView.onResume(); } @Override protected void onPause() { super.onPause(); mapView.onPause(); } @Override protected void onStop() { super.onStop(); mapView.onStop(); } @Override protected void onDestroy() { super.onDestroy(); mapView.onDestroy(); } ``` 这样,就可以实现地图和BottomSheet的联动效果了。你可以根据具体需求对BottomSheet进行进一步的设置和定制,以满足你的应用场景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六毛六66

你的鼓励是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值