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. 这种方式通常在上传头像中用得比较常见
ImageLoader框架的使用、调用系统相册显示图片并裁剪显示、保存图片的两种方式的更多相关文章
- IOS 调用系统相册或照相机tab按钮显示中文
- iOS调用系统相册、相机 显示中文标题
解决手机语言已经设置显示中文 在调用系统相册.相机界面 时显示英文问题, 在 info.plist里面添加Localized resources can be mixed YES 表 ...
- iOS 调用系统相册 相机 时,显示中文标题
解决手机语言已经设置显示中文 在调用系统相册.相机界面 时显示英文问题, 在 info.plist里面添加Localized resources can be mixed YES 表示是否允许应用程序 ...
- ios调用系统相册、相机 显示中文标题、本地化多语言支持
因为调用系统相册.相机需要显示中文,所以搞了半天才知道是在Project->info->Custom ios Target Properties 添加 Localizations 并加入C ...
- Android 调用系统相机拍照保存以及调用系统相册的方法
系统已经有的东西,如果我们没有新的需求的话,直接调用是最直接的.下面讲讲调用系统相机拍照并保存图片和如何调用系统相册的方法. 首先看看调用系统相机的核心方法: Intent camera = new ...
- Swift—调用系统相册和相机
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 24.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...
- Android调用系统相册和拍照的Demo
最近我在群里看到有好几个人在交流说现在网上的一些Android调用系统相册和拍照的demo都有bug,有问题,没有一个完整的.确实是,我记得一个月前,我一同学也遇到了这样的问题,在低版本的系统中没问题 ...
- APP调用系统相册,使用3DTouch重压,崩溃
崩溃:app调用系统相册,使用3DTouch重压,崩溃 问题描述 app调用系统相册,使用3DTouch重压,一般的app都会崩溃. 解决方法 写个分类即可 @implementation UICol ...
- 在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题
在调用系统相册时,UIIMagePickerController使用中偷换StatusBar颜色的问题 此时解决办法是 #pragma mark - UIImagePickerController D ...
随机推荐
- Bootstrap <基础三十二>模态框(Modal)插件
模态框(Modal)是覆盖在父窗体上的子窗体.通常,目的是显示来自一个单独的源的内容,可以在不离开父窗体的情况下有一些互动.子窗体可提供信息.交互等. 如果您想要单独引用该插件的功能,那么您需要引用 ...
- ICML历年Best Papers
作者:我爱机器学习原文链接:ICML历年Best Papers ICML (Machine Learning)(1999-2016) 2016 Dueling Network Architecture ...
- .netcore跨平台 之 windows上编译,ubuntu上运行
1 下载并安装netcore sdk 下载地址 https://github.com/dotnet/cli 选取合适的版本下载安装即可 打开 CMD ,输入dotnet,出现以下信息说明已安装好 ...
- Hollister Outlet Store
(link to hollisterco site), It's a major try. After a photographer's viewpoint, Which roughly splend ...
- elasticsearch相关文章
http://blog.csdn.net/laigood12345/article/category/1113868
- util-linux编译unknown architecture 'BSD_LABELSECTOR' undeclared错误
------------------------------------------------------------------------------ In :: fdiskbsdlabel.h ...
- Puppet安装及部署
本篇博客主要介绍Puppet的安装部署,后续会更新其他相关内容 一.简介 二.环境介绍 三.安装Puppet 四.配置Puppet-dashboard 五.配置Puppet Kick 一.简介 Pup ...
- 例子:Database - Linq to sql
DataContext类型(数据上下文)是System.Data.Linq命名空间下的重要类型,用于把查询句法翻译成SQL语句,以及把数据从数据库返回给调用方和把实体的修改写入数据库. DataCon ...
- java数据结构_附12_图、顶点和边的定义(双链存储)
图--双链式存储结构 顶点 和 边 的定义 1.Vertex.java 2.Edge.java 3.AbstractGraph.java 1. public class Vertex {private ...
- jquery.get()
1.获取当前jquery对象匹配到的dom元素 2.语法: jqueryObject.get([index]) //jQueryObject[index]等价于jQueryObject.get(ind ...