将视图捕获到位图 returns 旧图像

Capturing View to Bitmap returns old image

我需要将视图捕获到位图。这就是我尝试这样做的方式:

private Bitmap getBitmapFromView1(View rootView) {
    Bitmap b = Bitmap.createBitmap(rootView.getWidth(),
        rootView.getHeight(),
        Bitmap.Config.ARGB_8888);
    Canvas c = new Canvas(b);
    rootView.draw(c);
    return b;
}

private Bitmap getBitmapFromView2(View rootView) {
    rootView.setDrawingCacheEnabled(true);
    Bitmap bm = Bitmap.createBitmap(rootView.getDrawingCache());
    rootView.setDrawingCacheEnabled(false);

    return bm;
}

我也试过在第二个函数的不同地方加上buildDrawingCachedestroyDrawingCache

rootView 我有一个 FrameLayout 里面有一个 RecyclerView。有时在滚动此 RecyclerView 并要求快照后,我会得到一个滚动位置较旧的图像。我对这两个功能都有这种效果。

有趣的是,两者在另一个屏幕上都工作正常,其中 rootViewDrawerLayout,它还包含 RecyclerView

如何始终获取最新快照?

RecyclerView 禁用硬件加速有帮助。我将它添加到 OnScrollListener 以避免滚动延迟。似乎有效。

private RecyclerView.OnScrollListener mSwitchAccelerationListener = new RecyclerView.OnScrollListener() {
    @Override
    public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
        super.onScrollStateChanged(recyclerView, newState);

        if (newState == RecyclerView.SCROLL_STATE_IDLE) {
            mRecyclerView.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
        } else {
            mRecyclerView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
        }
    }
};

有用post:Efficient "Screenshots" of a View?