我的博客http://blog.csdn.net/dawn_moon
客戶的需求都是非常怪的。我有時候在給客戶做項目的時候就想罵客戶是sb。可是請你相信我,等你有需求,自己變成客戶的時候,給你做項目的哥哥肯定也會罵你是sb。
是這種,客戶須要做一個圖片上傳的功能,這個圖片須要裁剪。一般而言,這東西用系統自帶的裁剪就搞定了。但是客戶不,他要能夠自由裁剪,就是長寬比不固定,想裁成什么比例就裁成什么比例,我一聽,蛋都碎了。
沒有辦法,客戶sb歸sb,需求還是得照做,不然不給錢要喝西北風了。
圖片裁剪的功能系統自帶了,和我的需求僅僅有一點不一樣,就是它是固定寬高比的,設定了寬高比就不能再改變,而我須要自由寬高比。好吧,既然僅僅有這一點不一樣,那給他改改即可了。
事實上我這人是非常懶的,我早就想谷歌一下看有沒有人寫好的,拿來改下直接用好了。但是找了一圈,僅僅有一個哥哥自己寫了一個自己定義裁剪的功能。跑了一下,基本功能能夠實現,但是太Ugly了,並且不太穩定,有一些適配沒有做好。想想還是自己改源代碼好了,嗯,就這樣。
下載gallery的源代碼,抽取裁剪功能的代碼,如圖

這基本就好了,然后CropImage.java里面有叉叉,自己改下就好了。這個類使用了View里面的一些變量,這些變量被打上了hide標簽,所以sdk應用開發是看不到,僅僅有系統編譯才干夠通過。這里面有非常多東西我們是不須要的,比方
/*if (extras != null) {
if (extras.getString("circleCrop") != null) {
mCircleCrop = true;
mAspectX = 1;
mAspectY = 1;
}
mSaveUri = (Uri) extras.getParcelable(MediaStore.EXTRA_OUTPUT);
if (mSaveUri != null) {
String outputFormatString = extras.getString("outputFormat");
if (outputFormatString != null) {
mOutputFormat = Bitmap.CompressFormat.valueOf(
outputFormatString);
}
} else {
mSetWallpaper = extras.getBoolean("setWallpaper");
}
mBitmap = (Bitmap) extras.getParcelable("data");
mAspectX = extras.getInt("aspectX");
mAspectY = extras.getInt("aspectY");
mOutputX = extras.getInt("outputX");
mOutputY = extras.getInt("outputY");
mScale = extras.getBoolean("scale", true);
mScaleUp = extras.getBoolean("scaleUpIfNeeded", true);
mDoFaceDetection = extras.containsKey("noFaceDetection")
? !extras.getBoolean("noFaceDetection")
: true;
}
if (mBitmap == null) {
Uri target = intent.getData();
// mAllImages = ImageManager.makeImageList(mContentResolver, target,
// ImageManager.SORT_ASCENDING);
mImage = mAllImages.getImageForUri(target);
if (mImage != null) {
// Don't read in really large bitmaps. Use the (big) thumbnail
// instead.
// TODO when saving the resulting bitmap use the
// decode/crop/encode api so we don't lose any resolution.
mBitmap = mImage.thumbBitmap(IImage.ROTATE_AS_NEEDED);
}
}*/看這里凝視掉的代碼,就是你調用系統裁剪的時候要傳的一些參數,我這里直接凝視掉,僅僅傳一個要剪切圖片的uri就能夠。
然后怎么讓他自由裁剪呢,看下mAspectX變量的使用,源代碼里面用mAspectX和mAspectY來做寬高比計算的,我們就把他計算寬高比的地方凝視掉就好了。把mAspectX和mAspectY都設為1,然后改動幾個地方:
hv.setup(mImageMatrix, imageRect, faceRect, mCircleCrop,false
/*mAspectX != 0 && mAspectY != 0*/);這里凝視掉了最后一個條件,直接傳false,就會取消寬高比限制。
if (mAspectX != 0 && mAspectY != 0) {
if (mAspectX > mAspectY) {
// 自由縮放
cropHeight = cropWidth * mAspectY ;// mAspectX;
} else {
cropWidth = cropHeight * mAspectX ;// mAspectY;
}
}這里去掉了寬高比計算。
然后基本就完畢了。

