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 ...
随机推荐
- Eclipse 项目中有红色感叹号,怎么办?
/** * JDK1.5中增加了自动拆装箱的语言特性,在基本类型和包装类型之间可以相互地转换和运算. * 大家也都知道Java中==运算符是比较两个对象间的引用是否相同.在自动拆装箱与“==”运算符之 ...
- wordpress 首页调用文章 不同样式的方法
<?php $count = 1; $display_categories = array(1); foreach ($display_categories as $category) { ?& ...
- 爬虫:selenium + phantomjs 解决js抓取问题(一)
selenium模块主要用来做测试,模拟键盘.鼠标来操作浏览器. phantomjs 就像一个无界面的浏览器一样. 两个结合能很好的解决js抓取的问题. 测试代码: #coding=utf-8 fro ...
- C#实现Excel的导入导出
Excel作为日常使用工具,在开发过程中经常会用到其导入导出功能.经过一个小的练习,学习了下导入导出功能. 导出篇: 从数据库查询到所要导出的数据,以xml的形势保存下来,最后输出excel的格式,保 ...
- 关于SqlHelper
在 SqlHelper 类中实现的方法包括: ExecuteNonQuery.此方法用于执行不返回任何行或值的命令.这些命令通常用于执行数据库更新,但也可用于返回存储过程的输出参数. Exec ...
- No matching provisioning profile found: Your build settings specify a provis...
解决办法: (1)右键.xcodeproj文件,显示包内容--->找到project.pbxproj文件打开--->查找“PROVISIONING_PROFILE"---> ...
- 使用strace 工具跟踪系统调用和信号
使用strace来执行程序,它会记录程序执行过程中调用,接收到的信号,通过查看记录结果,就可以知道程序打开哪些文件,进行哪些读写,映射哪些内存,向系统申请多少内存等信息 strace 移植 下载str ...
- css3实现头像旋转功能(超easy!!!)
简单好玩的头像旋转功能 html结构 <body> <img src="https://a-ssl.duitang.com/uploads/item/201604/29/2 ...
- 近期编程问题——epoll failed:bad file descriptor
出现问题:epoll_wait:Bad file descriptor 原因:IO时间的socket描述符在epoll_ctl处理前就关闭了. 解决方法:不要在epoll_ctl之前关闭socket描 ...
- [make]makefile使用积累
[注]:文中所指手册皆为GNU make Version 4.1 1.make的一般特性 1.1.Makefiles的构成 Makefiles包含五种元素: 显式规则(explicit rules), ...