這篇部落客要收集有關圖檔選擇器的library
TakePhoto
github項目位址:https://github.com/crazyandcoder/TakePhoto
簡書位址:android 開源項目—TakePhoto
對于每個APP基本上都有一個頭像上傳的功能,對于如何擷取頭像照片,可以通過使用本地相冊或者拍照擷取,而是用原生的相機功能都會或多或少遇到一些問題,是以特地封裝了相機和相冊功能,使用簡單,友善,隻需要簡單的幾行代碼就可以擷取圖檔。
效果圖

主要亮點
- 可以進行拍照或者從本地相冊擷取圖檔
- 可以對已經選中的圖檔進行編輯、如裁剪、放大、縮小等操作
- 直接傳回選中圖檔的位址,友善後續操作,如上傳伺服器等。
gradle
api>=14
compile 'liji.library.dev:takephotolib:1.0.2'
//glide是為了示範效果,takephotolib不依賴glide
compile 'com.github.bumptech.glide:glide:3.7.0'
代碼示例
下面的代碼在點選事件中。就這幾行代碼就可以搞定圖檔編輯、如裁剪、放大、縮小等操作,非常友善,作者很給力。
TakePhoto takePhoto = new TakePhoto(MainActivity.this);
takePhoto.setOnPictureSelected(new TakePhoto.onPictureSelected() {
@Override
public void select(String path) {
tv.setText("選擇的圖檔位址:" + path);
Glide.with(MainActivity.this).load("file://" + path).into(iv);
}
});
takePhoto.show();
作者提供的使用方法代碼在
Main2Activity
類中。
BUG
1三星手機(SM-G5500)擷取不到圖檔資源
pickphotoview
github:https://github.com/Werb/PickPhotoSample
截圖
使用
dependencies {
...
compile 'com.werb.pickphotoview:pickphotoview:0.0.5-beta1'
}
findViewById(R.id.btn1).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new PickPhotoView.Builder(MainActivity.this)
.setPickPhotoSize()
.setShowCamera(true)
.setSpanCount()
.start();
}
});
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == ) {
return;
}
if (data == null) {
return;
}
if (requestCode == PickConfig.PICK_PHOTO_DATA) {
List<String> selectPaths = (List<String>) data.getSerializableExtra(PickConfig.INTENT_IMG_LIST_SELECT);
// do something u want
Log.d(TAG, selectPaths.toString());
}
}
集合中是圖檔的路徑:
Album
Album
是一個MD風格的開源相冊,主要功能分為兩部分:相冊選圖、畫廊預覽。
github位址:https://github.com/yanzhenjie/Album/blob/master/README-CN.md
Demo:http://git.oschina.net/libraryDemo/albumdemo
Demo
如果是調起畫相冊:
使用Album.album(this).start()
如果是調起畫廊:
Album.gallery(this).start()
Demo:中用
RecyclerView
來顯示擷取的圖檔,在其點選事件中調起畫廊
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
mRecyclerView.setLayoutManager(new GridLayoutManager(this, ));
Drawable drawable = ResourcesCompat.getDrawable(getResources(), R.drawable.decoration_white, null);
mRecyclerView.addItemDecoration(new AlbumVerticalGirdDecoration(drawable));
// int itemSize = (DisplayUtils.screenWidth - (drawable.getIntrinsicWidth() * )) / ;
// int itemSize = (DisplayUtils.screenWidth) / ;
int itemSize = getWindow().getWindowManager().getDefaultDisplay().getWidth()/;
adapter = new MyAdapter(mImageList,itemSize);
mRecyclerView.setAdapter(adapter);
adapter.setOnItemClickListener(new MyAdapter.OnItemClickListener() {
@Override
public void onItemClick(View view, int position) {
previewImage(position);
}
});
下面是github README.md
特性
- 完美支援7.0,不存在Android7.0 FileUriExposedException。
- 支援元件:
、Activity
。Fragment
- UI風格可以配置,比如:
、Toolbar
、StatusBar
。NavigationBar
- 單選、多選、檔案夾預覽、畫廊、畫廊縮放。
- 支援配置相冊展示時的列數。
- 支援配置是否使用相機。
- 畫廊預覽選擇的圖檔,預覽時可以反選。
- 支援自定義
,例如使用:LocalImageLoader
、Glide
、Picasso
實作。ImageLoader
效果預覽
體驗請下載下傳demo的apk。
依賴
- Gradle:
mainifest.xml中需要注冊
<activity
android:name="com.yanzhenjie.album.AlbumActivity"
android:configChanges="orientation|keyboardHidden|screenSize"
android:theme="@style/Theme.AppCompat.Light.NoActionBar"
android:windowSoftInputMode="stateAlwaysHidden|stateHidden" />
- 注意:1.0.0以上版本給這個activity配置的
android:title=""
屬性會被自動忽略。
在使用相冊的時候可以動态設定相冊的标題。
權限
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
- 開發者不需要擔心
運作時權限,Android6.0
已經非常完善的處理過了。Album
- 另外
運作時權限推薦使用:AndPermission,如果不使用6.0特性,建議把Android6.0
值設定的小于23,這樣就不會使用targetSdkVersion
運作時權限了。Android6.0
使用教程
Album
主要功能分為兩部分:相冊選圖、畫廊預覽,下面分别說明。
Album 相冊
使用
Album.album(this).start()
即可調起相冊。
Album.album(this)
.requestCode() // 請求碼,傳回時onActivityResult()的第一個參數。
.toolBarColor(toolbarColor) // Toolbar 顔色,預設藍色。
.statusBarColor(statusBarColor) // StatusBar 顔色,預設藍色。
.navigationBarColor(navigationBarColor) // NavigationBar 顔色,預設黑色,建議使用預設。
.title("圖庫") // 配置title。
.selectCount() // 最多選擇幾張圖檔。
.columnCount() // 相冊展示列數,預設是2列。
.camera(true) // 是否有拍照功能。
.checkedList(mImageList) // 已經選擇過得圖檔,相冊會自動選中選過的圖檔,并計數。
.start();
重寫
onActivityResult()
方法,接受圖檔選擇結果:
ArrayList<String> mImageList;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == ) {
if (resultCode == RESULT_OK) { // Successfully.
// 不要質疑你的眼睛,就是這麼簡單。
mImageList = Album.parseResult(data);
} else if (resultCode == RESULT_CANCELED) { // User canceled.
// 使用者取消了操作。
}
}
}
Gallery 畫廊
使用
Album.gallery(this).start()
即可調起畫廊,畫廊隻支援預覽本地圖檔,你隻需要傳入一個圖檔集合:
Album.gallery(this)
.requestCode() // 請求碼,傳回時onActivityResult()的第一個參數。
.toolBarColor(toolbarColor) // Toolbar 顔色,預設藍色。
.statusBarColor(statusBarColor) // StatusBar 顔色,預設藍色。
.navigationBarColor(navigationBarColor) // NavigationBar 顔色,預設黑色,建議使用預設。
.checkedList(mImageList) // 要預覽的圖檔list。
.currentPosition(position) // 預覽的時候要顯示list中的圖檔的index。
.checkFunction(true) // 預覽時是否有反選功能。
.start();
注意:
- 一定要傳入要預覽的圖檔集合,否則啟動會立即傳回。
- 調用畫廊預覽時判斷
,這樣才能保證傳入的if(currentPosition < mImageList.size())
在position
中,否則會立即傳回。list
如果你需要預覽時的反選功能,那麼重寫
onActivityResult()
方法,接受反選後的圖檔
List
結果:
ArrayList<String> mImageList;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == ) {
if (resultCode == RESULT_OK) { // Successfully.
// 不要再次質疑你的眼睛,還是這麼簡單。
mImageList = Album.parseResult(data);
} else if (resultCode == RESULT_CANCELED) { // User canceled.
// 使用者取消了操作。
}
}
}
進階配置
這個配置不是必須的,不配置也完全可以用,為了照顧強迫症同學,開放配置。
你的App如果使用了任何圖檔加載架構,比如:
Glide
、
Picasso
、
ImageLoader
,你可以用他們自定義本地圖檔
Loader
,不過
Album
已經提供了一個預設的,是以你不配置也完全可以。
Album提供的預設的
LocalImageLoader
如下:
public class Application extends android.app.Application {
@Override
public void onCreate() {
super.onCreate();
Album.initialize(new AlbumConfig.Build()
.setImageLoader(new LocalImageLoader()) // 使用預設loader.
.build()
);
}
}
根據小夥伴們的測試情況,推薦使用優先級如下:
- LocalImageLoader
- Glide
- Picasso
最後我把用
Glide
和
Picasso
的例子也給出來,當然Demo中也有,你也可以下載下傳Demo看。
注意:隻是在demo中用和
Glide
提供了sample,
Picasso
庫中并沒有引入
Album
和
Glide
。
Picasso
Glide
public class GlideImageLoader implements AlbumImageLoader {
@Override
public void loadImage(ImageView imageView, String imagePath, int width, int height) {
Glide.with(imageView.getContext())
.load(new File(imagePath))
.into(imageView);
}
}
...
Album.initialize(new AlbumConfig.Build()
.setImageLoader(new GlideImageLoader()) // Use glide loader.
.build()
Picasso
public class PicassoImageLoader implements AlbumImageLoader {
@Override
public void loadImage(ImageView imageView, String imagePath, int width, int height) {
Picasso.with(imageView.getContext())
.load(new File(imagePath))
.centerCrop()
.resize(width, height)
.into(imageView);
}
}
...
Album.initialize(new AlbumConfig.Build()
.setImageLoader(new PicassoImageLoader()) // Use picasso loader.
.build()
混淆
Album
是完全可以混淆的,如果混淆後相冊出現了問題,請在混淆規則中添加:
-dontwarn com.yanzhenjie.album.**
-keep class com.yanzhenjie.album.**{*;}
Matise
Matise github位址
運作sample沒有問題,但是自己用就報錯了。
PictureSelector
github: https://github.com/LuckSiege/PictureSelector
Demo:https://gitee.com/beifang2008/PictureSelector01.git
其他
多圖檔選擇:MultiImageSelector
圓形圖檔:CircleImageView
TakePhoto + pickphotoview + Album +Matisse