首先总结安卓中的棘手问题:1.手势2.ANR3.只能在主线程修改UI,4.点击冲突/滑动冲突,解决方案干掉其中一个(事件分发)5.内存泄漏(流没关,socket没关,图片处理,集合中放着太多无用对象OOM),6.屏幕适配7.软件盘(华为例子聊天按键),那么图片在安卓触发的问题是什么那,那么就是内存溢出。如何解决这个问题呢?
1.请注意目前在安卓中很少把图片放在drawable中,因为安卓开始运行程序时,会将drawable图片全部加载,这样过大,或者高清都会出现OOM,out of memory;因此很多人把文件放在assets文件夹中,这是一个流文件夹,这个时候就可以做处理了,第一种是剪裁处理(适合高清大图),第二种是:缓存处理,这种处理方式适合大量小图片。处理图片的核心类是Bitmap类,现在介绍这个类。
首先创建一个activty:ImageAcitivty 及相关布局,下面是布局的代码,里面只有一个ImageView的控件,同时里面的控件大小都是match_parent的
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.wj.administrator.mcz.activity.ImageAcitity"> <ImageView android:id="@+id/imageView8" android:layout_width="match_parent" android:layout_height="match_parent" /> </RelativeLayout>
2.接着在activty中我们要开对这个控价加载资源,因为布局中没有给它设置图片,在这里我们还没有assets文件夹,它是在哪里创出来的呢?在Project中的app的src的main路径下去的Directory新建一个assets文件,这样就创好了。先往里面放一张图,复制粘贴就ok。放进去之后图片就变成流。
3.现在在activty中要对这个图片进行加载,但是这个图片是一个流,如何加载呢?在activty中支持Bitmap格式和Drawable的,setImageBitmap和setIamgedrawble的,现在需要一个图片如何处理呢?现在需要的是Bitmap对象,而不是流,这个时候Bitmap有一个图片生成工厂。看具体过程:Bitmap bitmap= BitmapFactory.decodeStream(input);就是这个方法可以用流生产一个bitmap对象,生产好了之后输入流如何拿呢?有一个assets的管理者,asset文件夹管理者,方法为:getassets()
InputStream input=getAssets().open("preview.jpg");调用一个open方法输入图片的名字就可以生产好一个输入流,接着把流放进去就ok了。
下面全部的代码,总的来说在安卓中用bitmap比drawable加载图片用的多些。这样我们利用流拿到了assets文件public class ImageAcitity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_acitity); imageView=(ImageView)findViewById(R.id.imageView8); //获取图片生产工厂对象 // try { InputStream input=getAssets().open("preview.jpg"); Bitmap bitmap= BitmapFactory.decodeStream(input); imageView.setImageBitmap(bitmap); } catch (IOException e) { e.printStackTrace(); } } }3.bitmap的文件剪裁。如何进行剪裁呢,防止OOM,首先是高清大图(剪裁处理),这个时候就是一个比例压缩,要处理流,自己来写压缩剪裁相对比较麻烦,这个时候有一些比较成熟处理图片的三方框架Picasso。这个框架,首先看它的使用方式。前面的代码就可以省略了,什么加载流,什么考虑的图片来源,什么还要考虑比例等等一个Picasso统统解决。squareup公司家的框架,下面这个就是Picasso了,点点点,构建者模式简单吧with()里面填的是context,load()要加载图片的地址,resize()你要裁剪的大小,error()指没有加载成功加载的图片,placeholder()加载过程的图片,centercrop()从中心开始裁了,这样一个框架,加载图,裁剪就简单完成了。
Picasso.with(this) .load("https://p1.ssl.qhmsg.com/dr/270_500_/t01a02677ac1392b923.jpg?size=2592x1944") .resize(100,100) .centerCrop() .error(R.drawable.ani1) .placeholder(R.drawable.dibu8) .into(imageView);//这个就是完整的activty的代码了
public class ImageAcitity extends AppCompatActivity { private ImageView imageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_image_acitity); imageView=(ImageView)findViewById(R.id.imageView8); //获取图片生产工厂对象 // // // try { // InputStream input=getAssets().open("preview.jpg"); // Bitmap bitmap= BitmapFactory.decodeStream(input); // imageView.setImageBitmap(bitmap); // } catch (IOException e) { // e.printStackTrace(); // } Picasso.with(this) .load("https://p1.ssl.qhmsg.com/dr/270_500_/t01a02677ac1392b923.jpg?size=2592x1944") .resize(100,100) .centerCrop() .error(R.drawable.ani1) .placeholder(R.drawable.dibu8) .into(imageView); } }