uCrop介紹,我們自己的安卓版圖片裁剪庫

donaldyee 8年前發布 | 65K 次閱讀 安卓開發 Android開發 移動開發

來自: http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2016/0123/3909.html



在Yalantis,我們開發了許多不同的安卓app,根據我們的經驗來看,幾乎每個我們開發的應用都需要圖片裁剪的功能。圖片裁剪可以用于很多目的,從普通到頭像調整到按比例裁剪以及圖片變換等更復雜的功能。

考慮到想為我們的所有客戶都提供最好的圖片編輯工具,我們決定創建 uCrop , 一個安卓版的圖片裁剪庫。

你可能會想為什么我們不直接使用現有的圖片裁剪方案。畢竟,你可以在 Github和 Android Arsenal 上找到許多這樣的項目。但是有一點:沒有一個滿足我們的需求。讓我們快速瀏覽一遍最流行的開源圖片裁剪庫,然后解釋為什么他們都不是很符合要求。

為什么其它的開源庫都不好

1. SoundCloud cropping library

我已經在幾個項目上成功的使用了SoundCloud的庫,但是仍然它有幾個問題讓我感到很悲劇。

首先,你是通過一個裁剪框操作的,而不是圖片本身。如果你需要裁剪圖片里面很小的一片區域,這是很蛋疼的,而且從用戶體驗的角度來講著也是不對的。我相信Instagram 已經在給了我們一些UX方面的教訓,這種可移動的裁剪框已經死去了。

再者,SoundCloud 的裁剪庫并不允許我們做任何的旋轉。拜托,老大!大家都知道有很多“神奇”的安卓手機里面圖片的EXIF 信息是錯誤的(謝天謝地,我們已經通過 CWAC 解決了這個爛攤子)。再說,許多用戶也想能夠旋轉圖片(不僅僅是想旋轉90度)。

最后,使用SoundCloud庫不能改變寬高比。當然,如果你只是想得到一個正方形的頭像,這完全沒有問題。但是使用這個庫無法實現更多形狀的有趣的頭像照片。

2. Edmodo Cropper

Edmodo Cropper和SoundCloud 庫非常相似,和SoundCloud 也有一下共同的缺陷。但是,這個庫允許動態的改變裁剪框的寬高比例。它也有guideline而且有旋轉圖片的method (但是僅僅是一個method,因此你需要自己弄一個gesture detection 或者一個spinner 來控制手勢 )。

3. Scissors

Scissors 是一個比較新的庫,最近在一個 Android Weekly issue 上看到之后也非常興奮。但是5分鐘之后就興奮感就消失了。這是從關于Scissors的  博客 中引用的一段話:

...我們研究了現有的解決方案。沒有一個 滿足了我們的需求,因此我們覺得建立自己的。

這種方式值得表揚。但實際上,不過是又多了一個不能動態旋轉圖片和改變寬高比例的library 罷了。不過,Scissors倒是集成了一些流行的圖片庫,比如 PicassoGlide , 和 Universal Image Loader 。我希望Scissors 在后續的版本能有更多實用的功能。

[ I do like how Scissors implements zoom. The image always scales down to the center of the image, no matter where your fingers are.]

在分析了現有庫的缺陷之后,我們決定創建  我們自己的 library ,支持手勢和精煉的用戶體驗。

uCrop: 一個解決了圖片裁剪問題的Library

uCrop 是一個讓你可以裁剪圖片以進一步使用的安卓庫。主要功能包括:

  • 縮放圖片

  • 旋轉圖片

  • 改變裁剪的寬高比

  • 支持觸摸手勢:單手指滾動和平移圖片,雙手指旋轉圖片,捏圖變焦(放大縮小),雙擊變焦。

  • 功能多樣化的簡便Activity,有精確化縮放和旋轉的空間以及一套預定義的寬高比例(1:1, 4:3, 3:4, 2:3, 3:2, 16:9, 9:16 +原始圖片的比例)。

uCrop 有一個用于初始化和配置的builder類型的接口。library 本身只需要最小api level 10,但是sample 是在 API level 15+上運行的。

如何在項目中使用uCrop?

在項目中引入庫:

compile 'com.yalantis:ucrop:1.0.1'

在AndroidManifest.xml中添加UCropActivity:

<activity
    android:name="com.yalantis.ucrop.UCropActivity"
    android:screenOrientation="portrait"/>

uCrop的配置是使用的builder模式:

UCrop.of(sourceUri, destinationUri)
    .withAspectRatio(16, 9)
    .withMaxResultSize(maxWidth, maxHeight)
    .start(context);

重寫onActivityResult方法并處理裁剪的結果:

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK && requestCode == UCrop.REQUEST_CROP) {
        final Uri resultUri = UCrop.getOutput(data);
    } else if (resultCode == UCrop.RESULT_ERROR) {
        final Throwable cropError = UCrop.getError(data);
    }
}

如何自定義uCrop?

你可以改變如下設置:

  • compression format 壓縮格式(e.g. PNG, JPEG, WEBP).

  • compression quality壓縮質量 [0 - 100] (無損的PNG會忽略質量設置 )

  • support for simultaneous gestures

  • 從原始圖片解碼的Bitmap的最大值(如果你想重寫默認的行為)。

  • 以及更多 (比如color palette)

下篇文章我們將分享建立 uCrop 的經驗,敬請關注!

</div>

 本文由用戶 donaldyee 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!