求助,安卓有没有能把几个如何连续截图图合成一个

这才是属于 12 月的狂欢,鼓掌!
这是不是传说中的用前笑嘻嘻,用后MMP,突然有点庆幸LTE国内没有通过,可以先学习下国...
入门价就达到 4999 美元的 iMac Pro,我们这就不能像 iPhone X 那样,随便高呼买买买...
这个漏洞如果真的被人利用就麻烦了,苹果必须要重视起来才行啊。
这两个logo设计要是说不像的话,那真要摸下自己的良心了,苹果设计师怎么会弄出这么惨...
AirPods 2的外观、尺寸可能不会发生什么变化,但是大卖那是毫无疑问的。
位于墨尔本的Apple Store将是南半球最大的直营店,也是唯一一家不在美国本土的旗舰店...
1MOER又发新品啦
相比之下,手游的操作有些扎心
网易代理的《坦克世界闪击战》终于是登陆了中国区的App Store,虽然晚了很多,但质量...
这是一个【解谜数学冒险动作SF游戏】,是一个关于多维世界的寓言。
别错过《Inside》,它乃“游戏即第九艺术”的最佳证明,更是独立游戏思想的浓缩。
虽然内容长度有限,但游戏胜在创意无敌,意象深远,剧情在可说和不可说之间,令人回味...
《猫咪收集》团队的全新治愈休闲作,在手机里养一只自己生活、自己旅行的小青蛙。
网易野心勃勃做的一款国产 AVG 手游,一半令人惊艳,一半令人失望。
AirPods 2的外观、尺寸可能不会发生什么变化,但是大卖那是毫无疑问的。
1MOER又发新品啦
苹果在新款 MacBook 上移除 MagSafe 接口的做法并不是那么受欢迎。
在 50 个 iPhone 充电器中,有 49 个都没有通过基本的安全检查。
苹果为迎接假日购物季而在其在线商城中推出了更多的新配件。
看来一切都有商量,那么其他厂商该如何接招呢?
苹果公司今天在其日益增长的配件产品线中加入了一些新的配色选项。
如果苹果推出二代AirPods,你希望能改进哪些方面呢?
您需要通过验证再能继续浏览 3秒后开始验证
威锋旗下产品
Hi~我是威威!
 粤公网安备 11号
新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!Android之批量加载图片OOM问题解决方案 - 一小沫一博客 - CSDN博客
Android之批量加载图片OOM问题解决方案
  一个好的app总少不了精美的图片,所以Android开发中图片的加载总是避免不了的,而在加载图片过程中,如果处理不当则会出现OOM的问题。那么如何彻底解决这个问题呢?本文将具体介绍这方面的知识。
  首先我们来总结一下,在加载图片过程中出现的OOM的场景无非就这么几种:
1、& 加载的图片过大
2、& 一次加载的图片过多
3、& 以上两种情况兼有
  那么为什么在以上场景下会出现OOM问题呢?实际上在API文档中有着明确的说明,出现OMM的主要原因有两点:
1、移动设备会限制每个app所能够使用的内存,最小为16M,有的设备分配的会更多,如24、32M、64M等等不一,总之会有限制,不会让你无限制的使用。
2、在andorid中图片加载到内存中是以位图的方式存储的,在android2.3之后默认情况下使用ARGB_8888,这种方式下每个像素要使用4各字节来存储。所以加载图片是会占用大量的内存。
&&&&&&&& 场景和原因我们都分析完了,下面我们来看看如何解决这些问题。
  首先先来解决大图加载的问题,一般在实际应用中展示图片时,因屏幕尺寸及布局显示的原因,我们没有必要加载原始大图,只需要按照比例采样缩放即可。这样即节省内存又能保证图片不失真,具体实施步骤如下:
1、在不加载图片内容的基础上,去解码图片得到图片的尺寸信息
  这里需要用的BitmapFactory的decode系列方法和BitmapFactory.Options。当使用decode系列方法加载图片时,一定要将Options的inJustDecodeBounds属性设置为true。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeFile(path, options);
2、根据获取的图片的尺寸和要展示在界面的尺寸计算缩放比例。
public int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
// Raw height and width of image
final int height = options.outH
final int width = options.outW
int inSampleSize = 1;
if (height & reqHeight || width & reqWidth) {
if (width & height) {
inSampleSize = Math.round((float) height / (float) reqHeight);
inSampleSize = Math.round((float) width / (float) reqWidth);
return inSampleS
3、根据计算的比例缩放图片。
//计算图片的缩放比例
options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
options.inJustDecodeBounds = false;
Bitmap bitmap= BitmapFactory.decodeFile(path, options);
  根据缩放比例,会比原始大图节省很多内存,效果图如下:
  下面我们看看如何批量加载大图,首先第一步还是我们上面所讲到的,要根据界面展示图片控件的大小来确定图片的缩放比例。在此我们使用gridview加载本地图片为例,具体步骤如下:
1、通过系统提供的contentprovider加载外部存储器中的所有图片地址
private void loadPhotoPaths(){
Cursor cursor= getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, null);
while(cursor.moveToNext()){
String path = cursor.getString(cursor.getColumnIndex(MediaColumns.DATA));
paths.add(path);
cursor.close();
2、自定义adapter,在adapter的getview方法中加载图片
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView = LayoutInflater.from(this.mContext).inflate(R.layout.grid_item_layout, null);
holder = new ViewHolder();
holder.photo=(ImageView)convertView.findViewById(R.id.photo);
convertView.setTag(holder);
holder=(ViewHolder)convertView.getTag();
final String path = this.paths.get(position);
holder.photo.setImageBitmap(imageLoader.getBitmapFromCache(path));
return convertV
  通过以上关键两个步骤后,我们发现程序运行后,用户体验特别差,半天没有反应,很明显这是因为我们在主线程中加载大量的图片,这是不合适的。在这里我们要将图片的加载工作放到子线程中进行,改造自定义的ImageLoader工具类,为其添加一个线程池对象,用来管理用于下载图片的子线程。
private ExecutorS
private ImageLoader(Context mContxt) {
executor = Executors.newFixedThreadPool(3);
//加载图片的异步方法,含有回调监听
public void loadImage(final ImageView view,
final String path,
final int reqWidth,
final int reqHeight,
final onBitmapLoadedListener callback){
final Handler mHandler = new Handler(){
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
Bitmap bitmap = (Bitmap)msg.
callback.displayImage(view, bitmap);
executor.execute(new Runnable() {
public void run() {
Bitmap bitmap = loadBitmapInBackground(path, reqWidth,
reqHeight);
putBitmapInMemey(path, bitmap);
Message msg = mHandler.obtainMessage(1);
mHandler.sendMessage(msg);
  通过改造后用户体验明显好多了,效果图如下:
  虽然效果有所提升,但是在加载过程中还存在两个比较严重的问题:
1、& 图片错位显示
2、& 当我们滑动速度过快的时候,图片加载速度过慢
  经过分析原因不难找出,主要是因为我们时候holder缓存了grid的item进行重用和线程池中的加载任务过多所造成的,只需要对程序稍作修改,具体如下:
  Adapter中:
holder.photo.setImageResource(R.drawable.ic_launcher);
holder.photo.setTag(path);
imageLoader.loadImage(holder.photo,
DensityUtil.dip2px(80),
DensityUtil.dip2px(80),
new onBitmapLoadedListener() {
public void displayImage(ImageView view, Bitmap bitmap) {
String imagePath= view.getTag().toString();
if(imagePath.equals(path)){
view.setImageBitmap(bitmap);
  ImageLoader中:
executor.execute(new Runnable() {
public void run() {
String key = view.getTag().toString();
if (key.equals(path)) {
Bitmap bitmap = loadBitmapInBackground(path, reqWidth,
reqHeight);
putBitmapInMemey(path, bitmap);
Message msg = mHandler.obtainMessage(1);
mHandler.sendMessage(msg);
  为了获得更好的用户体验,我们还可以继续优化,即对图片进行缓存,缓存我们可以分为两个部分内存缓存磁盘缓存,本文例子加载的是本地图片所有只进行了内存缓存。对ImageLoader对象继续修改,添加LruCache对象用于缓存图片。
private ImageLoader(Context mContxt) {
executor = Executors.newFixedThreadPool(3);
//将应用的八分之一作为图片缓存
ActivityManager am=(ActivityManager)mContxt.getSystemService(Context.ACTIVITY_SERVICE);
int maxSize = am.getMemoryClass()*;
mCache = new LruCache&String, Bitmap&(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
//存图片到缓存
public void putBitmapInMemey(String path,Bitmap bitmap){
if(path==null)
if(bitmap==null)
if(getBitmapFromCache(path)==null){
this.mCache.put(path, bitmap);
public Bitmap getBitmapFromCache(String path){
return mCache.get(path);
  在loadImage方法中异步加载图片前先从内存中取,具体代码请。
&  总结一下解决加载图片出现OOM的问题主要有以下方法:
1、& 不要加载原始大图,根据显示控件进行比例缩放后加载其缩略图。
2、& 不要在主线程中加载图片,主要在listview和gridview中使用异步加载图片是要注意处理图片错位和无用线程的问题。
3、& 使用缓存,根据实际情况确定是否使用双缓存和缓存大小。
  小伙伴们看懂了嘛?想要自己测试的,可以点击“”运行测试哦!
本文版权归和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
相关文章推荐博客分类:
终于从连续两月每周加班hour30+的地狱里挺过来了。尽管很辛苦,现在回头看看还是挺爽的。趁着这段闲暇,打算把之前工作中的遇到的问题、学到的经验和一些感悟总结整理一下。
之前遇到一个问题需要一些图片资源,去找UI部门要资源却告知要自己搞定。。。不给资源有要求那么多,无力吐槽啊!只好一边用半生不熟的PS,一边用代码来完成任务。当然借此机会也熟悉了Android对图片的处理。
Android对图片的操作和展示主要使用Bitmap、BitmapDrawable、Canvas等几个关键类,文档给出了详细的使用方法,在此不再赘述。
下面是将两张图片拼接城一张的代码(横向拼接)。
* 将两张位图拼接成一张(横向拼接)
* @param first
* @param second
private Bitmap add2Bitmap(Bitmap first, Bitmap second) {
int width =first.getWidth() + second.getWidth();
int height = Math.max(first.getHeight(), second.getHeight());
Bitmap result = Bitmap.createBitmap(width, height, Config.ARGB_8888);
Canvas canvas = new Canvas(result);
canvas.drawBitmap(first, 0, 0, null);
canvas.drawBitmap(second, first.getWidth(), 0, null);
浏览 10801
浏览: 17172 次
这个是连接而不是拼接吧,拼接要考虑重合
你直接调用Adapter的notifyDataSetChang ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 连续截图工具 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信