关于安卓图片的处理

       首先总结安卓中的棘手问题: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);

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值