Снимок экрана полноразмерного RecyclerView приводит к тому, что последний элемент рисуется сверху - PullRequest
0 голосов
/ 01 июня 2019

Проблема

Я написал код для создания полноразмерных скриншотов RecyclerView который почти работает, но каким-то образом последний элемент списка отображается поверх списка.

enter image description here

Я сильно подозреваю, что ошибка возникает в этом блоке кода, где происходит прорисовка каждого элемента списка

  int viewHolderTopPadding = 0;
  for (int i = 0; i < itemCount; i++) {
        recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
        viewHolder.itemView.draw(canvas);
        canvas.drawBitmap(recyclerViewBitmap,0f, viewHolderTopPadding, null);
        viewHolderTopPadding += measuredItemHeight;
    }

Но если я использую устаревший подход для сохранения видов в растровые изображения, то он работает правильно:

for (int i = 0; i < itemCount; i++) {
        recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
        viewHolder.itemView.setDrawingCacheEnabled(true);
        viewHolder.itemView.buildDrawingCache();
        canvas.drawBitmap(viewHolder.itemView.getDrawingCache(), 0f, viewHolderTopPadding, null);
        viewHolderTopPadding += measuredItemHeight;
        viewHolder.itemView.setDrawingCacheEnabled(false);
        viewHolder.itemView.destroyDrawingCache();
    }

Остальной код

private Bitmap generateLongBitmap(RecyclerView recyclerView) {

    int itemCount = recyclerView.getAdapter().getItemCount();
    RecyclerView.ViewHolder viewHolder = recyclerView.getAdapter().createViewHolder(recyclerView, 0);

    //Measure the sizes of list item views to find out how big itemView should be
    viewHolder.itemView.measure(View.MeasureSpec.makeMeasureSpec(recyclerView.getWidth(), View.MeasureSpec.EXACTLY), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));

    // Define measured widths/heights
    int measuredItemHeight = viewHolder.itemView.getMeasuredHeight();
    int measuredItemWidth = viewHolder.itemView.getMeasuredWidth();

    //Set width/height of list item views
    viewHolder.itemView.layout(0, 0, measuredItemWidth, measuredItemHeight);

    //Create the Bitmap and Canvas to draw on
    Bitmap recyclerViewBitmap = Bitmap.createBitmap(recyclerView.getMeasuredWidth(), measuredItemHeight * itemCount, Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(recyclerViewBitmap);

    //Draw RecyclerView Background:
    if(recyclerView.getBackground() !=null){
        Drawable drawable = recyclerView.getBackground().mutate();
        drawable.setBounds(measuredItemWidth,measuredItemHeight * itemCount,0,0);
        drawable.draw(canvas);
    }

    //Draw all list item views
    int viewHolderTopPadding = 0;
    for (int i = 0; i < itemCount; i++) {
        recyclerView.getAdapter().onBindViewHolder(viewHolder, i);
        viewHolder.itemView.draw(canvas);
        canvas.drawBitmap(recyclerViewBitmap,0f, viewHolderTopPadding, null);
        viewHolderTopPadding += measuredItemHeight;
    }
    return recyclerViewBitmap;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...