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 ...
随机推荐
- Android中Service和Activity之间的通信
启动Service并传递数据进去: Android中通过Intent来启动服务会传递一个Intent过去. 可以在Intent中通过putExtra()携带数据 Intent startIntent ...
- php ob_start()、ob_end_flush和ob_end_clean()多级缓冲
ob_start() 和 ob_end_flush() 是一对很好的搭档,可以实现对输出的控制.当成一对出现理解起来就没什么问题,但是当他们两个各自出现次数增加时,就比较难理解了. <?php ...
- C++ 11 lambda
转载:http://www.cnblogs.com/kedebug/p/3224561.html lambda 表达式的简单语法如下:[capture] (parameters) -> retu ...
- list内容按长度等分
这里需要导入 from more_itertools import chunked chunked(iterable, n) 将一个可迭代对象等分成n个list,第n个list的长度可能小于之前的. ...
- Kindle使用的一些方法
最大的好处就是方便,买书便宜,到手我就买了六部书,十块钱不到,以纸书的价格一本都买不到,能够买一些一直想读一下,但又担心读不下去的书.而且买了之后完全不用担心书柜收纳不下了.另外很轻便,放在包里上下班 ...
- OC基本数据存储方式
/** 一,数据存储 常用方式(5种) 1,XML属性列表 -- 保存在Doucuments文件夹 2,偏好设置(NSUserDefault)-- Library/Preference 需要配合wri ...
- 一篇介绍java与js操作cookie的
http://blog.csdn.net/xuweilinjijis/article/details/8651188
- C语言程序设计第10堂作业
一.本次课主要内容: 本次课程学习数组,一种最基本的构造类型,它是一组相同类型数据的有序集合.数组中的元素在内存中连续存放,每个元素都属于同一种数据类型,用数组名和下标可以唯一地确定数组元素: (1) ...
- android 透明度
透明度百分比对应的十六进制: (说明:百分比计算出来会有小数,按照常规的四舍五入处理,详情请往下查看) 百分比:0% HEX: 00 百分比:1% HEX: 30 百分比:2% HEX: 50 百分比 ...
- GnuRadio Hacking②:使用SDR嗅探北欧芯片无线键盘鼠标数据包
0×00 前言 上半年的时候安全公司Bastille Networks(巴士底狱)安全研究员发现大多数无线鼠标和接收器之间的通信信号是不加密的,黑客可对一两百米范围内存在漏洞的无线键鼠进行嗅探甚至劫持 ...