捕获视图到位图返回旧图像

时间:2015-10-19 21:59:53

标签: android android-layout screenshot android-view android-bitmap

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

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

的其他屏幕上,两者都可以正常工作

如何始终获得全新快照?

1 个答案:

答案 0 :(得分:1)

禁用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);
        }
    }
};

有用的帖子:Efficient "Screenshots" of a View?