-1
我目前正在尝试创建一个小帮手类,可以使多个图像中的一个图像。它应该采取屏幕的大小,并采取所有图像的相等部分,然后将它们组合成一个单一的图像并排显示所有图像的一小片。如何在Android中有效地结合位图
到目前为止,我的课程成功创建了这样的图像。我创建这个图像后唯一的麻烦是使用RAM的数量。你有什么建议,我可以提高RAM使用后,我创建该图像? (我不想耗尽内存)也许我在创造图像的方式浪费记忆(我打开更好的建议)。 重要的是要知道,我不能将这些图像缓存在磁盘上,因为它们永远不会相同。
我注意到一旦我运行手动GC,RAM使用率从70MiB左右回到15MiB。
private LruCache<Integer, Bitmap> mMemoryCache;
private List<Integer> IDs = new ArrayList<>();
private CombinerTask task;
private void combineImages(boolean useScreenSize){
if(task != null)
task.cancel(true);
task = new CombinerTask(useScreenSize);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
task.execute();
}
}
class CombinerTask extends AsyncTask<Void,Void,Bitmap>{
private boolean useScreenSize;
public CombinerTask(boolean useScreenSize){
this.useScreenSize = useScreenSize;
}
@Override
protected Bitmap doInBackground(Void...voids) {
Bitmap bmOverlay;
if(useScreenSize){
WindowManager wm = (WindowManager) ImageCombiner.getInstance().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
Point size = new Point();
display.getSize(size);
for(int x = 0; x < IDs.size(); x++){
float scaleFactor = (float)size.y/(float)mMemoryCache.get(IDs.get(x)).getHeight();
Bitmap temp = Bitmap.createScaledBitmap(mMemoryCache.get(IDs.get(x)),(int)(mMemoryCache.get(IDs.get(x)).getWidth() * scaleFactor), (int)(mMemoryCache.get(IDs.get(x)).getHeight() * scaleFactor),false);
mMemoryCache.put(IDs.get(x),temp);
}
bmOverlay = Bitmap.createBitmap(size.x,size.y,mMemoryCache.get(IDs.get(0)).getConfig());
}else {
bmOverlay = Bitmap.createBitmap(mMemoryCache.get(IDs.get(0)).getWidth(),mMemoryCache.get(IDs.get(0)).getHeight(),mMemoryCache.get(IDs.get(0)).getConfig());
}
Canvas canvas = new Canvas(bmOverlay);
for(int i = 0; i < IDs.size(); i++){
Bitmap bm = Bitmap.createBitmap(mMemoryCache.get(IDs.get(i)),mMemoryCache.get(IDs.get(i)).getWidth()/3,0,bmOverlay.getWidth()/mMemoryCache.size(),mMemoryCache.get(IDs.get(i)).getHeight());
canvas.drawBitmap(bm,bm.getWidth()*i,0,null);
bm.recycle();
}
canvas = null;
return bmOverlay;
}
@Override
protected void onPostExecute(Bitmap bitmap) {
if(listener != null)
listener.combineFinished(bitmap);
for (int i = 0; i < IDs.size(); i++){
mMemoryCache.get(IDs.get(i)).recycle();
}
mMemoryCache = null;
IDs = null;
}
}
欢迎任何建议。祝你有美好的一天。