afkT / DevUtils

:fire: ( 持续更新,目前含 300+ 工具类 ) DevUtils 是一个 Android 工具库,主要根据不同功能模块,封装快捷使用的工具类及 API 方法调用。该项目尽可能的便于开发人员,快捷、高效开发安全可靠的项目。
Apache License 2.0
1.37k stars 305 forks source link

截图工具类 #20

Closed TrueloveSomeGIRl closed 3 years ago

TrueloveSomeGIRl commented 3 years ago

CapturePictureUtils 截图工具类截图Recyclerview的时候 如果item 里面有自定义view+动画 截图下来动画初始值一直未0 请问这个有没有解决办法 谢谢 image

afkT commented 3 years ago

看描述猜测,应该是存在动画且没绘制导致,你可以这样尝试下解决

CapturePictureUtils#snapshotByRecyclerView_LinearLayoutManager

新建一个类,复制该方法代码,并且进行修改 竖屏 的代码

// ===========
// = 竖向滑动 =
// ===========

for (int i = 0; i < itemCount; i++) {
    RecyclerView.ViewHolder holder = adapter.createViewHolder(recyclerView, adapter.getItemViewType(i));
    adapter.onBindViewHolder(holder, i);
    View childView = holder.itemView;
    WidgetUtils.measureView(childView, recyclerView.getWidth());
    bitmaps[i] = canvasBitmap(childView, config);
    height += childView.getMeasuredHeight();
}

修改为自己的 Adapter 并且新增自定义方法,自定义方法主要的作用是对 holder.itemView 里面的动画 View 进行直接赋值并且不做动画效果,且调用 postInvalidate。

这样就能够实现,截图走无动画且进行绘制,非截图则有动画,你看下这样的思路能否正常截出来

afkT commented 3 years ago

看描述猜测,应该是存在动画且没绘制导致,你可以这样尝试下解决

CapturePictureUtils#snapshotByRecyclerView_LinearLayoutManager

新建一个类,复制该方法代码,并且进行修改 竖屏 的代码

// ===========
// = 竖向滑动 =
// ===========

for (int i = 0; i < itemCount; i++) {
    RecyclerView.ViewHolder holder = adapter.createViewHolder(recyclerView, adapter.getItemViewType(i));
    adapter.onBindViewHolder(holder, i);
    View childView = holder.itemView;
    WidgetUtils.measureView(childView, recyclerView.getWidth());
    bitmaps[i] = canvasBitmap(childView, config);
    height += childView.getMeasuredHeight();
}

修改为自己的 Adapter 并且新增自定义方法,自定义方法主要的作用是对 holder.itemView 里面的动画 View 进行直接赋值并且不做动画效果,且调用 postInvalidate。

这样就能够实现,截图走无动画且进行绘制,非截图则有动画,你看下这样的思路能否正常截出来

例:adapter.xxxMethod(childView, adapter.getItemViewType(i)) 这样就能够知道属于什么 viewType