廢話不多說,拷貝就可以直接用
package com.wanlang.base.base_utils;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.drawable.ColorDrawable;
import android.media.ExifInterface;
import android.text.TextUtils;
import android.widget.ImageView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.Transformation;
import com.bumptech.glide.load.engine.Resource;
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool;
import com.bumptech.glide.load.resource.bitmap.BitmapResource;
import com.bumptech.glide.load.resource.bitmap.RoundedCorners;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.transition.DrawableCrossFadeFactory;
import com.wanlang.base.BaseApplication;
import com.wanlang.wanandroid.R;
import java.io.IOException;
import java.security.MessageDigest;
import androidx.annotation.NonNull;
/**
* 圖片工具類
*/
public class ImageUtils {
/**
* 加載網絡圖片
*/
public static void loadImage(ImageView imageView, Object url) {
RequestOptions options = new RequestOptions()
.placeholder(R.mipmap.logo_app); //圖片加載出來前,顯示的圖片
// .error(R.mipmap.error) //圖片加載失敗後,顯示的圖片
// .fallback(R.mipmap.tab_me_bg); //url爲空的時候,顯示的圖片
DrawableCrossFadeFactory drawableCrossFadeFactory = new DrawableCrossFadeFactory
.Builder(300)
.setCrossFadeEnabled(true)
.build();
Context context;
if (imageView == null) {
return;
} else {
if (imageView.getContext() == null) {
context = BaseApplication.Companion.getContext();
} else {
context = imageView.getContext();
}
Glide.with(context)
.load(url)
.apply(options)
// .centerCrop()//centerCrop()是將圖片按照比例放大到imageview的尺寸;
.centerCrop()//fitCenter()是將圖片按照比例縮小到imageview的尺寸;
// .transition(DrawableTransitionOptions.with(drawableCrossFadeFactory))//設置加載動畫
.into(imageView);
}
}
/**
* 加載圓角圖片
*
* @param imageView
* @param url 鏈接地址
* @param dp 圓角大小
*/
public static void loadImageCircle(Context context, ImageView imageView, Object url, int dp) {
//設置圖片大小
RoundedCorners roundedCorners = new RoundedCorners(dp);
//通過RequestOptions擴展功能,
RequestOptions options = RequestOptions.bitmapTransform(roundedCorners)
.placeholder(new ColorDrawable(Color.GRAY))//設置佔位圖
.error(R.mipmap.logo_app)//設置錯誤圖片
.fallback(new ColorDrawable(Color.RED))
.override(300, 300);//採樣率,因爲ImageView就這麼大,可以壓縮圖片,降低內存消耗
Glide.with(context)
.asBitmap()
.load(url)
.apply(options)
//fixme 注意加載圓角的時候,註釋掉下面的方法
// .centerCrop()//centerCrop()是將圖片按照比例放大到imageview的尺寸;
// .fitCenter()//fitCenter()是將圖片按照比例縮小到imageview的尺寸;
.into(imageView);
}
/**
* 加載圓形
*/
public static void loadImageCircle(Context context, ImageView imageView, String url) {
Glide.with(context)
.load(url)
.apply(RequestOptions.circleCropTransform()
.placeholder(new ColorDrawable(Color.GRAY))
.error(new ColorDrawable(Color.WHITE))
.fallback(new ColorDrawable(Color.RED)))
.into(imageView);
}
/**
* 加載網絡圖片
*/
public static void loadImageBannerDefault(ImageView imageView, String url) {
if (TextUtils.isEmpty(url)) {
} else {
Glide.with(imageView.getContext())
.load(url)
.apply(new RequestOptions()
.placeholder(new ColorDrawable(Color.GRAY))
.error(R.mipmap.logo_app)
.fallback(new ColorDrawable(Color.RED)))
.into(imageView);
}
}
/**
* 根據路徑獲得圖片信息並按比例壓縮,返回bitmap
*/
public static Bitmap getSmallBitmap(String filePath) {
final BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;//只解析圖片邊沿,獲取寬高
BitmapFactory.decodeFile(filePath, options);
// 計算縮放比
options.inSampleSize = calculateInSampleSize(options, 480, 800);
// 完整解析圖片返回bitmap
options.inJustDecodeBounds = false;
return BitmapFactory.decodeFile(filePath, options);
}
public static int calculateInSampleSize(BitmapFactory.Options options,
int reqWidth, int reqHeight) {
final int height = options.outHeight;
final int width = options.outWidth;
int inSampleSize = 1;
if (height > reqHeight || width > reqWidth) {
final int heightRatio = Math.round((float) height / (float) reqHeight);
final int widthRatio = Math.round((float) width / (float) reqWidth);
inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;
}
return inSampleSize;
}
/**
* 獲取照片角度
*/
public static int readPictureDegree(String path) {
int degree = 0;
try {
ExifInterface exifInterface = new ExifInterface(path);
int orientation = exifInterface.getAttributeInt(
ExifInterface.TAG_ORIENTATION,
ExifInterface.ORIENTATION_NORMAL);
switch (orientation) {
case ExifInterface.ORIENTATION_ROTATE_90:
degree = 90;
break;
case ExifInterface.ORIENTATION_ROTATE_180:
degree = 180;
break;
case ExifInterface.ORIENTATION_ROTATE_270:
degree = 270;
break;
}
} catch (IOException e) {
e.printStackTrace();
}
return degree;
}
/**
* 旋轉照片
*/
public static Bitmap rotateBitmap(Bitmap bitmap, int degress) {
if (bitmap != null) {
Matrix m = new Matrix();
m.postRotate(degress);
bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(),
bitmap.getHeight(), m, true);
return bitmap;
}
return bitmap;
}
private static class RoundedCornersTransform implements Transformation<Bitmap> {
private BitmapPool mBitmapPool;
private float radius;
private boolean isLeftTop, isRightTop, isLeftBottom, isRightBotoom;
/**
* 需要設置圓角的部分
*
* @param leftTop 左上角
* @param rightTop 右上角
* @param leftBottom 左下角
* @param rightBottom 右下角
*/
public void setNeedCorner(boolean leftTop, boolean rightTop, boolean leftBottom, boolean rightBottom) {
isLeftTop = leftTop;
isRightTop = rightTop;
isLeftBottom = leftBottom;
isRightBotoom = rightBottom;
}
/**
* @param context 上下文
* @param radius 圓角幅度
*/
public RoundedCornersTransform(Context context, float radius) {
this.mBitmapPool = Glide.get(context).getBitmapPool();
this.radius = radius;
}
@NonNull
@Override
public Resource<Bitmap> transform(@NonNull Context context, @NonNull Resource<Bitmap> resource, int outWidth, int outHeight) {
Bitmap source = resource.get();
int finalWidth, finalHeight;
//輸出目標的寬高或高寬比例
float scale;
if (outWidth > outHeight) {
//如果 輸出寬度 > 輸出高度 求高寬比
scale = (float) outHeight / (float) outWidth;
finalWidth = source.getWidth();
//固定原圖寬度,求最終高度
finalHeight = (int) ((float) source.getWidth() * scale);
if (finalHeight > source.getHeight()) {
//如果 求出的最終高度 > 原圖高度 求寬高比
scale = (float) outWidth / (float) outHeight;
finalHeight = source.getHeight();
//固定原圖高度,求最終寬度
finalWidth = (int) ((float) source.getHeight() * scale);
}
} else if (outWidth < outHeight) {
//如果 輸出寬度 < 輸出高度 求寬高比
scale = (float) outWidth / (float) outHeight;
finalHeight = source.getHeight();
//固定原圖高度,求最終寬度
finalWidth = (int) ((float) source.getHeight() * scale);
if (finalWidth > source.getWidth()) {
//如果 求出的最終寬度 > 原圖寬度 求高寬比
scale = (float) outHeight / (float) outWidth;
finalWidth = source.getWidth();
finalHeight = (int) ((float) source.getWidth() * scale);
}
} else {
//如果 輸出寬度=輸出高度
finalHeight = source.getHeight();
finalWidth = finalHeight;
}
//修正圓角
this.radius *= (float) finalHeight / (float) outHeight;
Bitmap outBitmap = this.mBitmapPool.get(finalWidth, finalHeight, Bitmap.Config.ARGB_8888);
if (outBitmap == null) {
outBitmap = Bitmap.createBitmap(finalWidth, finalHeight, Bitmap.Config.ARGB_8888);
}
Canvas canvas = new Canvas(outBitmap);
Paint paint = new Paint();
//關聯畫筆繪製的原圖bitmap
BitmapShader shader = new BitmapShader(source, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
//計算中心位置,進行偏移
int width = (source.getWidth() - finalWidth) / 2;
int height = (source.getHeight() - finalHeight) / 2;
if (width != 0 || height != 0) {
Matrix matrix = new Matrix();
matrix.setTranslate((float) (-width), (float) (-height));
shader.setLocalMatrix(matrix);
}
paint.setShader(shader);
paint.setAntiAlias(true);
RectF rectF = new RectF(0.0F, 0.0F, (float) canvas.getWidth(), (float) canvas.getHeight());
//先繪製圓角矩形
canvas.drawRoundRect(rectF, this.radius, this.radius, paint);
//左上角圓角
if (!isLeftTop) {
canvas.drawRect(0, 0, radius, radius, paint);
}
//右上角圓角
if (!isRightTop) {
canvas.drawRect(canvas.getWidth() - radius, 0, canvas.getWidth(), radius, paint);
}
//左下角圓角
if (!isLeftBottom) {
canvas.drawRect(0, canvas.getHeight() - radius, radius, canvas.getHeight(), paint);
}
//右下角圓角
if (!isRightBotoom) {
canvas.drawRect(canvas.getWidth() - radius, canvas.getHeight() - radius, canvas.getWidth(), canvas.getHeight(), paint);
}
return BitmapResource.obtain(outBitmap, this.mBitmapPool);
}
@Override
public void updateDiskCacheKey(@NonNull MessageDigest messageDigest) {
}
}
}