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();
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章