将视图捕获到位图 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;
}
我也试过在第二个函数的不同地方加上buildDrawingCache
和destroyDrawingCache
在 rootView
我有一个 FrameLayout
里面有一个 RecyclerView
。有时在滚动此 RecyclerView
并要求快照后,我会得到一个滚动位置较旧的图像。我对这两个功能都有这种效果。
有趣的是,两者在另一个屏幕上都工作正常,其中 rootView
是 DrawerLayout
,它还包含 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?
我需要将视图捕获到位图。这就是我尝试这样做的方式:
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;
}
我也试过在第二个函数的不同地方加上buildDrawingCache
和destroyDrawingCache
在 rootView
我有一个 FrameLayout
里面有一个 RecyclerView
。有时在滚动此 RecyclerView
并要求快照后,我会得到一个滚动位置较旧的图像。我对这两个功能都有这种效果。
有趣的是,两者在另一个屏幕上都工作正常,其中 rootView
是 DrawerLayout
,它还包含 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?