1、压缩图片
使用系统自带的方法压缩图片,提高图片加载速度,防止图片过大引起OOM,会降低图像质量
private Bitmap imageZoom(Bitmap bitMap) {
// 图片允许最大空间 单位:KBdoublemaxSize=400.00;
// 将bitmap放至数组中,意在bitmap的大小(与实际读取的原文件要大)ByteArrayOutputStreambaos=newByteArrayOutputStream();
bitMap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
// 将字节换成KBdoublemid= b.length / 1024;
// 判断bitmap占用空间是否大于允许最大空间 如果大于则压缩 小于则不压缩if (mid > maxSize) {
// 获取bitmap大小 是允许最大大小的多少倍doublei= mid / maxSize;
// 获取这个图片的宽和高floatwidth= bitMap.getWidth();
floatheight= bitMap.getHeight();
// 创建操作图片用的matrix对象Matrixmatrix=newMatrix();
// 计算宽高缩放率floatscaleWidth= ((float) (bitMap.getWidth() / Math.sqrt(i))) / width;
floatscaleHeight= ((float) (bitMap.getHeight() / Math.sqrt(i))) / height;
// 缩放图片动作
matrix.postScale(scaleWidth, scaleHeight);
bitMap = Bitmap.createBitmap(bitMap, 0, 0, (int) width, (int) height, matrix, true);
}
return bitMap;
}
2、获取网络资源文件大小
公司有个离谱的需求,需要显示PDF文件大小,正常的逻辑应该是PDF文件上传的时候,后台记录文件大小到数据库里面,前端只做展示。奇葩的是原有的需求里面并没有记录文件大小,公司也不打算加上这个功能,只能前端自己计算文件大小。这个方法实际还是通过网络下载缓存之后计算缓存的大小。需要注意,因为需要异步线程下载文件,所以计算的结果是有延迟的。列表里面使用的话,快速滑动列表会因为异步加载出现文件大小显示错误的情况。
public static void getNetworkFileSize(TextView textView, String fileUrl) {
final Handler handler = new Handler(Looper.myLooper()) {
@Override
public void handleMessage(Message msg) {
String fileSize = msg.getData().getString("fileSize");
textView.setText(fileSize);
}
};
if (fileUrl == null) {
return;
}
if (fileUrl.length() == 0) {
return;
}
URL url = null;
try {
url = new URL(fileUrl);
} catch (MalformedURLException e) {
e.printStackTrace();
}
if (url == null) {
return;
}
final URL finalUrl = url;
new Thread(new Runnable() {
@Override
public void run() {
try {
HttpURLConnection urlConnection = (HttpURLConnection) finalUrl.openConnection();
int fileLength = urlConnection.getContentLength();
Bundle bundle = new Bundle();
bundle.putString("fileSize", formatFileSize(fileLength));
Message message = handler.obtainMessage();
message.setData(bundle);
handler.sendMessage(message);
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
3、将View保存为图片
公司需求是制作一个海报,长按界面可以将海报保存到本地。这个方法可以将传入的控件和子控件绘制保存。注意:保存的文件名字要增加一些随机数防止重复,虽然某些手机系统可以在结尾自动追加数字,但是有数量限制,同一个文件夹下同名文件超过一定数量保存时就会报错。
/**
*保存图片
*/
private fun saveImage(view: View) {
val bitmap = Bitmap.createBitmap(
view.width, view.height,
Bitmap.Config.ARGB_8888
)
val canvas = Canvas(bitmap)
view.draw(canvas)
MediaStore.Images.Media.insertImage(contentResolver,
bitmap,
"picture_name" + System.currentTimeMillis().toString(),
"demo_saveImage")
ToastUtil.show("保存成功")
}
4、复制到剪切板
这个功能毕竟常见,比如复制某些口令到某音某宝。公司的需求是分享页面的时候有复制页面连接分享的功能
private fun copyStr(copyStr: String): Boolean {
return try {
//获取剪贴板管理器
val cm: ClipboardManager = getSystemService(CLIPBOARD_SERVICE) as ClipboardManager
// 创建普通字符型ClipData
val mClipData: ClipData = ClipData.newPlainText("Label", copyStr)
// 将ClipData内容放到系统剪贴板里。
cm.setPrimaryClip(mClipData)
ToastUtil.show("复制成功")
true
} catch (e: java.lang.Exception) {
false
}
}