RecycleView自定义悬浮头部
先简单说一下我的问题场景:使用RecycleView的ItemDecoration引用自定义布局文件来实现悬浮头部,但是悬浮头部的背景色(在布局文件中直接设置的background)会出现色差,具体表现为设置的16位颜色值与界面上显示的颜色值不一样(如红的不够,蓝灰色又偏黑等等真机颜色与设计图颜色严重不符)
1.如何使用自定义布局文件来实现悬浮头部
private int mGroupHeight = 48;
View groupView = typeListener.getView(position);
if (groupView == null) return;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
groupView.setLayoutParams(layoutParams);
groupView.setDrawingCacheEnabled(true);
groupView.measure(View.MeasureSpec.makeMeasureSpec(right,View.MeasureSpec.EXACTLY),View.MeasureSpec.makeMeasureSpec(mGroupHeight, View.MeasureSpec.EXACTLY));
groupView.layout(left,0-mGroupHeight,right,0);
Bitmap bitmap = groupView.getDrawingCache();
c.drawBitmap(bitmap,left,top - mGroupHeight,null);
另外给出我的悬浮头部的布局文件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:background="@color/global_content"
android:layout_height="28dp">
<TextView
android:id="@+id/psh_tv_type"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="12dp"
android:text="@string/g_symbol"
android:textColor="@color/global_text_3"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="112dp"
android:gravity="right"
android:text="@string/g_bid"
android:textColor="@color/global_text_3"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="12dp"
android:gravity="right"
android:text="@string/g_change_percent"
android:textColor="@color/global_text_3"
android:textSize="11sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<View
style="@style/horization_line_style"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
mGroupHeight是悬浮头部的高度,是在当前类中写死的,我给的是48(int类型的)
如果想要设置高度为48dp,可以使用如下函数mGroupHeight = ((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, mGroupHeight, Utils.getContext().getResources().getDisplayMetrics()));
typeListener.getView(position)返回的是布局文件对应的view
@Override
public View getView(int position) {
View view=getLayoutInflater().inflate(R.layout.layout_product_header_advance,null,false);
((TextView) view.findViewById(R.id.pha_tv_type)).setText(headText);
return view;
}
2.悬浮头部背景色差问题
绘制view布局的时候要使用view自带的绘制方法(重点!!!!!)
c.drawBitmap(bitmap,left,top - mGroupHeight,mPaint);这个函数绘制出来的是有色差的,不要使用这个函数
另外给出在itemdecoration里绘制的函数名onDrawOver(@NonNull Canvas c, @NonNull RecyclerView parent, @NonNull RecyclerView.State state)
正确的绘制代码应该是这个
View groupView = typeListener.getView(position);
if (groupView == null) return;
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT);
groupView.setLayoutParams(layoutParams);
groupView.measure(View.MeasureSpec.makeMeasureSpec(right,View.MeasureSpec.EXACTLY),View.MeasureSpec.makeMeasureSpec(mGroupHeight, View.MeasureSpec.EXACTLY));
groupView.layout(left,0-mGroupHeight,right,0);
//Translate the canvas so the view is drawn at the proper coordinates
c.save();
c.translate(left,top - mGroupHeight);
//Draw the View and clear the translation
groupView.draw(c);
c.restore();