• ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式


    ImageLoader虽然说是一个相对于比较老的一个框架了 ,但是总的来说,还是比较好用的,今天我就总结了一下它的用法。还有调用系统相册并裁剪,以及,通过sharedpreference和文件存储来保存及拿取图片

    这些,我就都结合在了一起  写了个demo.

    main_activity.xml

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.ehsure.imageloadertest.MainActivity">
    <Button
    android:id="@+id/main_photo_bt"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="调用系统相册"
    android:onClick="showImg"
    />


    <ImageView
    android:id="@+id/iv_main_img"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" />


    </LinearLayout>

    MainActivty.class

    public class MainActivity extends Activity {
    ImageView imageView;
    private String updateLogoPath;
    private String userName;
    private String userPhone;
    private String userToken;
    private long userId;
    private String imgPath;
    private File image;
    private String newName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    imageView = (ImageView)findViewById(R.id.iv_main_img);
    /*
    (这一段都是说明ImageLoader的用法)
    */
    try{
    String newUrl = "http://ww4.sinaimg.cn/large/90bd89ffjw1eqvmd6o8r6j20go0p5ju2.jpg";
    ImageLoader imageloader=ImageLoader.getInstance();
    /*
    1.这个是最简单的显示方法
    */
    //使用默认的ImageLoaderConfiguration
    ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this.getApplicationContext());
    //初始化ImageLoader的配置
    imageloader.init(configuration);
    //加载图片
    imageloader.displayImage(newUrl, imageView);
    /*
    2.这个是使用自定义的配置来达到自己想要显示的效果
    */
    //使用自定义的configuration
    // ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(getApplicationContext())
    // .threadPriority(Thread.NORM_PRIORITY - 2)//设置线程优先级
    // .threadPoolSize(4)//线程池内加载的数量,推荐范围1-5内。
    // .denyCacheImageMultipleSizesInMemory()//当同一个Uri获取不同大小的图片缓存到内存中时只缓存一个。不设置的话默认会缓存多个不同大小的图片
    // .memoryCacheExtraOptions(480, 800)//内存缓存文件的最大长度
    // .memoryCache(new LruMemoryCache(10 * 1024 * 1024))//内存缓存方式,这里可以换成自己的内存缓存实现。(推荐LruMemoryCache,道理自己懂的)
    // .memoryCacheSize(10 * 1024 * 1024)
    // .discCache(new UnlimitedDiscCache(createSavePath())) //内存缓存的最大值
    // .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
    // .imageDownloader(new BaseImageDownloader(getApplicationContext(), 5 * 1000, 30 * 1000))//设置连接时间5s,超时时间30s
    // .writeDebugLogs()
    // .build();
    //// 初始化ImageLoader的配置
    // imageloader.init(configuration);
    // //加载图片
    // imageloader.displayImage(newUrl, imageView,setImageOptionsConfig());
    }catch (Exception e){
    e.printStackTrace();
    }
    }

    /**
    * 配置图片加载时候的配置,在实际开发中可以对这些参数进行一次封装。
    */
    public DisplayImageOptions setImageOptionsConfig(){
    DisplayImageOptions options = new DisplayImageOptions.Builder()
    .showImageOnLoading(R.mipmap.ic_launcher)//设置图片在下载期间显示的图片
    .showImageForEmptyUri(R.mipmap.ic_launcher)//设置图片Uri为null或是错误的时候显示的图片
    .showImageOnFail(R.mipmap.ic_launcher)//设置图片加载/解码过程中错误时显示的图片
    .cacheInMemory(true)//设置下载的图片是否缓存在内存中
    .cacheOnDisc(true)//设置下载的图片是否缓存在SD卡中
    .considerExifParams(true)//是否考虑JPEG图像的旋转,翻转
    .imageScaleType(ImageScaleType.IN_SAMPLE_INT)//设置图片以如何的编码方式显示
    .bitmapConfig(Bitmap.Config.ARGB_8888)//设置图片的解码类型
    .resetViewBeforeLoading(true)//设置图片在下载前是否重置和复位
    .displayer(new SimpleBitmapDisplayer())//不设置的时候是默认的
    //.displayer(new RoundedBitmapDisplayer(20))//是否为圆角,弧度是多少
    //displayer()还可以设置渐入动画
    .build();
    return options;
    }

    /*
    下面这这一段是指如何调用系统相册,并裁剪显示
    */

    public void showImg(View view){
    switch (view.getId()) {
    case R.id.main_photo_bt:
    //这里是跳转到系统相册页面
    Intent intent = new Intent(
    Intent.ACTION_PICK,
    android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    startActivityForResult(intent, 0);
    break;
    }
    }


    /*
    * 开始图片裁剪
    */
    private void startPhotoZoom(Uri uri, int size) {
    Intent intent = new Intent("com.android.camera.action.CROP");
    intent.setDataAndType(uri, "image/*");
    // crop为true是设置在开启的intent中设置显示的view可以剪裁
    intent.putExtra("crop", "true");

    // aspectX aspectY 是宽高的比例
    intent.putExtra("aspectX", 1);
    intent.putExtra("aspectY", 1);

    // outputX,outputY 是剪裁图片的宽高
    intent.putExtra("outputX", size);
    intent.putExtra("outputY", size);
    intent.putExtra("return-data", true);
    startActivityForResult(intent, 1);
    }


    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // TODO Auto-generated method stub
    super.onActivityResult(requestCode, resultCode, data);
    if (requestCode == 0) {
    if (resultCode == Activity.RESULT_OK && data != null) {
    //这里是从图库拿到图片之后调用系统的裁剪方法
    startPhotoZoom(data.getData(),150);
    }
    }else if(requestCode==1){
    if(data!=null){
    Bundle bundle = data.getExtras();
    if(bundle!=null){
    //这是最终从图库拿到的并且已经裁剪的图片
    Bitmap bitmap = data.getParcelableExtra("data");
    imageView.setImageBitmap(bitmap);
    }
    }
    }
    }

    /*
    这里是通过sharedpreference和文件存储来保存及拿取图片的
    */

    /*
    * 创建图片缓存在手机的文件
    */
    public File createFile(Bitmap bitmap){
    String path = "";
    if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
    path = Environment.getExternalStorageDirectory().getPath() + "/imageLoaderTest";
    } else {
    path = "/imageLoaderTest";
    }
    File file = new File(path);
    if(!file.exists()){
    file.mkdir();
    }
    path = path+"/"+getPhotoFileName();
    file = new File(path);
    Bitmap.CompressFormat cf = Bitmap.CompressFormat.JPEG;
    try {
    OutputStream os = new FileOutputStream(file);
    boolean flag =bitmap.compress(cf, 100, os);
    if(flag==true){
    return file;
    }
    } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    return null;

    }


    // 使用系统当前日期加以调整作为照片的名称
    private String getPhotoFileName() {
    Date date = new Date(System.currentTimeMillis());
    SimpleDateFormat dateFormat = new SimpleDateFormat("'IMG'_yyyyMMdd_HHmmss");
    return dateFormat.format(date) + ".jpg";
    }

    /* 将bitmap转换成字节
    */
    public String bitmapToString(Bitmap bitmap) {
    String str = null;
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.PNG, 1, outputStream);
    byte[] bytes = outputStream.toByteArray();
    str = Base64.encodeToString(bytes, Base64.DEFAULT);
    return str;
    }

    /*
    * 将字符串转换为bitmap
    */
    public Bitmap stringToBitmap(String str) {
    byte[] bytes = Base64.decode(str, Base64.DEFAULT);
    Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
    return bitmap;
    }
    }
     
    其中
    getPhotoFileName 和 stringToBitmap这两个方法实现的是bitmap和String间的互转,开发者拿到bitmap可将其转换成String存入SharedPreference,拿取的时候也可通过拿到的String将其转成bitmap.

    这种方式通常在上传头像中用得比较常见



  • 相关阅读:
    接口和抽象类
    JNI
    Serializable Parcelable
    android keystore 生成以及作用
    svn 服务器搭建
    java 8种基本数据类型
    Android NDK
    android adb命令行
    对称加密AES和DES加密、解密
    .net中的数据库连接字符串
  • 原文地址:https://www.cnblogs.com/carrie124/p/carrie_imageLoader.html
Copyright © 2020-2023  润新知