最近有这样一个需求,点击App的广告轮播图,展示对应的广告详情图(并且详情图要原图展示)。当时在想这需求也太没难度了吧。当拿到美工美眉切好的图,真的有点崩溃,一张老长老长的图。但也没办法,说是领导要求广告必须要这么详细。为了测试内存是否溢出,先写了个小Demo。其具体的主要代码如下:

package com.example.testcontactqq;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;public class MainActivity extends Activity {private ImageView mImage;private Context context;private Bitmap bitmap;private OverScrollView mScrollView;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}/*** 初始化控件*/private void initView(){context = MainActivity.this;mImage = (ImageView) findViewById(R.id.imageView);mScrollView =  (OverScrollView) findViewById(R.id.contact_QQ);bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.content);mImage.setImageBitmap(bitmap);}}

由于图片比较长,所以最外层加入一个自定义的 Over ScrollView包裹,便于使其能上下滚动。在OverScrollView中加入一展示长图的ImageView。其运行效果图如下所示。

效果图

观察运行效果发现,啥都没有。为什么会这样呢?猜想会不会是因为内存溢出或是图片太长展示不出来。查找Log发现并没有报OOM异常,所以OOM就不存在了。紧接着换一张短点的图片,发现能正常展示。由此推测图片太长了一个ImageView展示不出来。为什么会如此呢?查阅相关资料发现ImageView有一个阈值,超过阈值则ImageView不能显示图片,这也很好理解,相当于人类体质都有一个极限,我们是不能超过自己的极限的。对于这种情况该怎么解决呢?想想能不能将这张图片分多个ImageView分别展示,最后将所有的ImageView拼接起来,这样一张图片就能完美的展示了。下面就让我们见证这一设想的可行性如何。

第一步:配置相应的布局及实体类。

其具体的代码如下所示。

activity_main.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"tools:context="${relativePackage}.${activityClass}" ><com.example.testcontactqq.OverScrollViewandroid:id="@+id/contact_QQ"android:layout_width="match_parent"android:layout_height="wrap_content"></com.example.testcontactqq.OverScrollView>
</RelativeLayout>

ImageBean文件:

package com.example.testcontactqq;import android.graphics.Bitmap;/*** 图片实体类* @author jamy**/
public class ImageBean {//对应图片在List中的下标public String index = null;  //对应List中的bitmap对象public Bitmap bitmap = null; }

第二步:进行相应代码编写

MainActivity.java:

package com.example.testcontactqq;import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;import android.app.ActionBar.LayoutParams;
import android.app.Activity;
import android.content.Context;
import android.content.res.AssetManager;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.Gravity;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;public class MainActivity extends Activity {private Context context;private Bitmap bitmap;private OverScrollView mScrollView;private LinearLayout mContainerLayout;private List<ImageBean> mList;private int XCount=0;  //X方向上切割数private int YCount=3;  //Y方向上切割数@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initView();}/*** 初始化控件*/private void initView(){context = MainActivity.this;mScrollView =  (OverScrollView) findViewById(R.id.contact_QQ);addLinearLayout();
//      InputStream is=null;
//      try {
//          is = getAssets().open("content.png");
//      } catch (IOException e) {
//          e.printStackTrace();
//      }
//      bitmap = BitmapFactory.decodeStream(is);bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.content);mList = splitBitmap(bitmap,XCount,YCount);Log.d("JAMY",mList.size()+"-------size>");addImageViews(XCount, YCount);}/*** 添加ScrollView第一层子LinearLayout*/private void addLinearLayout(){mContainerLayout = new LinearLayout(context);mContainerLayout.setOrientation(LinearLayout.VERTICAL);mContainerLayout.setGravity(Gravity.CENTER_HORIZONTAL);mContainerLayout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,LayoutParams.MATCH_PARENT));mScrollView.addView(mContainerLayout);}/*** 按需将一bitmap分成多块* @param V_pice  水平方向上的切割塊数* @param H_pice  竖直方向上的切割塊数*/private void addImageViews(int xCount,int yCount){if(xCount == 0 && yCount == 0){return;}for(int i = 0;i <= yCount;i++){if(i!=0 && i==yCount){break;}LinearLayout row = new LinearLayout(context);row.setOrientation(LinearLayout.VERTICAL);row.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT,0 , 1));mContainerLayout.addView(row);for(int j = 0;j <= xCount;j++){if(j!=0 && j==xCount){break;}LinearLayout col = new LinearLayout(context);col.setOrientation(LinearLayout.HORIZONTAL);col.setGravity(Gravity.CENTER_HORIZONTAL);col.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT, 1));ImageView imageView = new ImageView(context);imageView.setAdjustViewBounds(true);String index = i+j+""; Log.d("JAMY",index+"----LocalIndex---->");Log.d("JAMY",mList.get(Integer.parseInt(index)).index+"----LayoutIndex---->");Log.d("JAMY",mList.get(Integer.parseInt(index)).bitmap+"----bitmap---->");imageView.setScaleType(ScaleType.FIT_CENTER);imageView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));  imageView.setImageBitmap(mList.get(Integer.parseInt(index)).bitmap);col.addView(imageView);row.addView(col);}}}/*** * @param bitmap 切割的bitmap* @param xCount x方向上切割的数目* @param yCount y方向上切割的数目* @return*/public  List<ImageBean> splitBitmap(Bitmap bitmap, int xCount, int yCount) {List<ImageBean> pieces = new ArrayList<ImageBean>(xCount*yCount);  int width = bitmap.getWidth();  int height = bitmap.getHeight();Log.d("JAMY","Width:"+width+"   height:"+height);int pieceWidth=0;  int pieceHeight=0; if(xCount == 0 && yCount == 0){return null;}else if(xCount==0 && yCount!=0){//只竖直方向进行切割pieceWidth = width;pieceHeight = height / yCount;  }else if(yCount==0 && xCount!=0){ //只水平方向进行切割pieceWidth = width / xCount;  pieceHeight = height;  }else{pieceWidth = width / xCount;  pieceHeight = height / yCount;  }for (int i = 0; i <= yCount; i++) { if(i!=0 && i==yCount){break;}for (int j = 0; j <= xCount; j++) {  if(j!=0 && j==xCount){break;}ImageBean piece = new ImageBean();  piece.index = i+j+"";  int xValue = j * pieceWidth;  int yValue = i * pieceHeight;  piece.bitmap = Bitmap.createBitmap(bitmap, xValue, yValue,  pieceWidth, pieceHeight);  Log.d("JAMY","xValue:"+xValue+"  yValue:"+yValue+"  pieceWidth:"+pieceWidth+"  pieceHeight:"+pieceHeight);pieces.add(piece);  }  }  return pieces;  }  }
     
效果图
由此ImageView显示长图的问题以及解决方法就介绍到这。下面我们简单做些总结:
1. 最好不要用一个ImageView显示一张太长图片,很可能造成ImageView超过阈值。
2.在ImageView加载图片之前,要对其进行的压缩,本demo中由于时间匆忙,暂时没有对图片进行处理。
这就是本人对ImageView显示不了长图的一些解决办法,可能您有其他的更好解决办法,欢迎和大家一起交流学习。

ImageView你不知道的一些问题相关推荐

  1. ImageView 常用属性的分析

    最近在图片上犯了迷糊,在礼拜天抽出时间把属性一个一个 试了一遍,在这里和大家分享一下 ImageView的属性: android:src 用于显示图片 android:maxWidth="& ...

  2. Android应用系列:完美运行GIF格式的ImageView(附源码)

    前言 我们都知道ImageView是不能完美加载Gif格式的图片,如果我们在ImageView中src指定的资源是gif格式的话,我们将会惊喜的发觉画面永远停留在第一帧,也就是不会有动画效果.当然,经 ...

  3. Android控件之ImageView探究

    ImageView控件是一个图片控件,负责显示图片. 以下模拟手机图片查看器 目录结构 main.xml布局文件 <?xml version="1.0" encoding=& ...

  4. 镜像处理坐标 android,Android应用开发之Android重写ImageView实现图片镜像效果的代码教程...

    本文将带你了解Android应用开发之Android重写ImageView实现图片镜像效果的代码教程,希望本文对大家学Android有所帮助. 前两天朋友问我一个问题,如何实现从手机系统相册加载一张图 ...

  5. android imageview 的常用属性,android imageview scaletype属性

    android imageview scaletype属性并不是很常用,以至于到现在我才注意到,但是在某些应用中,这是一个很重要的属性,比如相册应用. ImageView的Scaletype决定了图片 ...

  6. python3.9.0 print_关于 Python 3.9,那些你不知道的事

    原标题:关于 Python 3.9,那些你不知道的事 作者 | Ayushi Rawat 编译 | 高卫华 题图 | 视觉中国 Python一直在满足社区需求,并且将成为未来使用最多的语言. Pyth ...

  7. 对象----《你不知道的JS》

    最近在拜读<你不知道的js>,而此篇是对于<你不知道的js>中对象部分的笔记整理,希望能有效的梳理,并且深入理解对象 一.语法 对象两种定义形式:声明(文字)形式.构造形式 声 ...

  8. [转帖]什么是光纤的波长?看看有哪些是你不知道的!

    什么是光纤的波长?看看有哪些是你不知道的! FS https://www.feisu.com/bbs/e-1640.html 2017-07-01 00:00:001084 我们平时最熟悉的光当然是我 ...

  9. 激发企业大“智慧” | 深度赋能AI全场景 揭秘你不知道的移动云

    2020年是人工智能技术发展的关键年.疫情之下,世界见证了人工智能在抗击疫情中发挥的积极作用:今年4月,国家发改委正式将人工智能确定为新基建的重要领域之一.在历史机遇下,AI已实现"质变和量 ...

最新文章

  1. mass Framework event模块 v4
  2. 为什么服务器虚拟化,为什么要进行服务器虚拟化
  3. jQuery HTML 添加和删除元素
  4. C++开发秋招笔试题
  5. Postman:ResponseHeader存在多个Set-Cookie时,教你获取Cookie值
  6. 2020-06-24 电子书网站http://www.itjiaocheng.com/mianfei/
  7. 华为HCNA好考吗?
  8. arcgis裁剪多个shp文件_ArcGIS批量裁剪矢量数据
  9. python第七天作业
  10. 追梦之路-For the dream
  11. c语言商场收款程序,c语言 如何用switch语句编写一个有关商场购物金额优惠的选择程式...
  12. 教你一分钟实现动态模糊效果
  13. 近期整活之相关软件之安装说明
  14. ip地址的作用及分类
  15. Java.Net互操作技术介绍
  16. PVE+集客AC+K2T-AP
  17. 良好的协同管理,是数字时代的成功前提
  18. Oracle 修改字符集(AL32UTF8 转换成UTF8字符集)
  19. 2021年焊工(技师)考试题库及焊工(技师)最新解析
  20. Day_01 HTML

热门文章

  1. 【SDCC 2016·杭州站】9月23日互联网应用架构实战专场精彩回顾
  2. 不良贷款清收 到底难不难
  3. 七夕祭(贪心、难点)
  4. 美埃科技科创板上市:半年营收5.7亿募资近10亿 市值51亿
  5. 时区 : America/Mexico_City 中文:美国中部时间(墨西哥城) 的夏令时
  6. js验证前台验证用户名只能是汉字
  7. 服务器网络性能调优工具
  8. 我把废旧 Android 手机改造成了 Linux 服务器,Android开发学习视频
  9. 如何用一部手机进行人体全身三维扫描
  10. java拦截器继承类_struts2的拦截器(5):继承MethodFilterInterceptor抽象类实现拦截方法的拦截器 | 学步园...