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