Handling large/high resolution images
16lz
2021-01-26
Google TV devices have higher display resolution. If you provide low resolution or small p_w_picpaths in your layouts, they will appear pixelated, fuzzy, or grainy. This is not a good experience for the user. Instead, use high resolution p_w_picpaths. Remember, though, that downloading and storing high-resolution p_w_picpaths may cause "out of memory" errors. To avoid these errors, follow these tips:
- Load p_w_picpaths only when they're displayed on the screen. For example, are displaying multiple p_w_picpaths in a
GridView
,ListView
orGallery
, only load an p_w_picpath when its getView() is called. - Call
recycle()
on Bitmaps that are no longer needed. - Use WeakReferences for storing references to Bitmap objects in a in memory collection.
- If you fetch the p_w_picpaths from the network, use AsyncTask to fetch them all at once or as needed. Never do network transactions on the main ("UI") thread. Instead, if possible, fetch all the p_w_picpaths at once on a background thread, and store them on the sdcard.
- Scale down very large p_w_picpaths to a more appropriate size as you download them; otherwise, downloading the p_w_picpath may cause an "out of memory" error. Here is sample code that does this scaling while downloading:
- // Get the source p_w_picpath's dimensions
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true; // this does not download the actual p_w_picpath, just downloads headers.
- BitmapFactory.decodeFile(IMAGE_FILE_URL, options);
- int srcWidth = options.outWidth; // actual width of the p_w_picpath.
- int srcHeight = options.outHeight; // actual height of the p_w_picpath.
- // Only scale if the source is big enough. This code is just trying to fit a p_w_picpath into a certain width.
- if(desiredWidth > srcWidth)
- desiredWidth = srcWidth;
- // Calculate the correct inSampleSize/scale value. This helps reduce memory use. It should be a power of 2.
- int inSampleSize = 1;
- while(srcWidth / 2 > desiredWidth){
- srcWidth /= 2;
- srcHeight /= 2;
- inSampleSize *= 2;
- }
- float desiredScale = (float) desiredWidth / srcWidth;
- // Decode with inSampleSize
- options.inJustDecodeBounds = false; // now download the actual p_w_picpath.
- options.inDither = false;
- options.inSampleSize = inSampleSize;
- options.inScaled = false;
- options.inPreferredConfig = Bitmap.Config.ARGB_8888; // ensures the p_w_picpath stays as a 32-bit ARGB_8888 p_w_picpath.
- // This preserves p_w_picpath quality.
- Bitmap sampledSrcBitmap = BitmapFactory.decodeFile(IMAGE_FILE_URL, options);
- // Resize
- Matrix matrix = new Matrix();
- matrix.postScale(desiredScale, desiredScale);
- Bitmap scaledBitmap = Bitmap.createBitmap(sampledSrcBitmap, 0, 0,
- sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);
- sampledSrcBitmap = null;
- // Save
- FileOutputStream out = new FileOutputStream(LOCAL_PATH_TO_STORE_IMAGE);
- scaledBitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
- scaledBitmap = null;
更多相关文章
- 代码中设置drawableleft
- android 3.0 隐藏 系统标题栏
- Android开发中activity切换动画的实现
- Android(安卓)学习 笔记_05. 文件下载
- Android中直播视频技术探究之—摄像头Camera视频源数据采集解析
- 技术博客汇总
- android 2.3 wifi (一)
- AndRoid Notification的清空和修改
- Android中的Chronometer