天天看點

第三方開源庫:TakePhoto + pickphotoview + AlbumTakePhotopickphotoviewAlbumMatisePictureSelector其他

這篇部落客要收集有關圖檔選擇器的library

TakePhoto

github項目位址:https://github.com/crazyandcoder/TakePhoto

簡書位址:android 開源項目—TakePhoto

對于每個APP基本上都有一個頭像上傳的功能,對于如何擷取頭像照片,可以通過使用本地相冊或者拍照擷取,而是用原生的相機功能都會或多或少遇到一些問題,是以特地封裝了相機和相冊功能,使用簡單,友善,隻需要簡單的幾行代碼就可以擷取圖檔。

效果圖

第三方開源庫:TakePhoto + pickphotoview + AlbumTakePhotopickphotoviewAlbumMatisePictureSelector其他

主要亮點

  • 可以進行拍照或者從本地相冊擷取圖檔
  • 可以對已經選中的圖檔進行編輯、如裁剪、放大、縮小等操作
  • 直接傳回選中圖檔的位址,友善後續操作,如上傳伺服器等。

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

截圖

第三方開源庫:TakePhoto + pickphotoview + AlbumTakePhotopickphotoviewAlbumMatisePictureSelector其他
第三方開源庫:TakePhoto + pickphotoview + AlbumTakePhotopickphotoviewAlbumMatisePictureSelector其他

使用

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());
    }
}
           

集合中是圖檔的路徑:

第三方開源庫:TakePhoto + pickphotoview + AlbumTakePhotopickphotoviewAlbumMatisePictureSelector其他

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

特性

  1. 完美支援7.0,不存在Android7.0 FileUriExposedException。
  2. 支援元件:

    Activity

    Fragment

  3. UI風格可以配置,比如:

    Toolbar

    StatusBar

    NavigationBar

  4. 單選、多選、檔案夾預覽、畫廊、畫廊縮放。
  5. 支援配置相冊展示時的列數。
  6. 支援配置是否使用相機。
  7. 畫廊預覽選擇的圖檔,預覽時可以反選。
  8. 支援自定義

    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

    已經非常完善的處理過了。
  • 另外

    Android6.0

    運作時權限推薦使用:AndPermission,如果不使用6.0特性,建議把

    targetSdkVersion

    值設定的小于23,這樣就不會使用

    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()
        );
    }
}
           

根據小夥伴們的測試情況,推薦使用優先級如下:

  1. LocalImageLoader
  2. Glide
  3. Picasso

最後我把用

Glide

Picasso

的例子也給出來,當然Demo中也有,你也可以下載下傳Demo看。

注意:隻是在demo中用

Glide

Picasso

提供了sample,

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