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();