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>