pull/42/head
parent
d6e50f8284
commit
cfd7b67715
@ -1,617 +0,0 @@ |
|||||||
package io.legado.app.ui.filechooser.utils; |
|
||||||
|
|
||||||
import android.annotation.TargetApi; |
|
||||||
import android.content.ContentUris; |
|
||||||
import android.content.Context; |
|
||||||
import android.content.res.ColorStateList; |
|
||||||
import android.content.res.Resources; |
|
||||||
import android.database.Cursor; |
|
||||||
import android.graphics.Bitmap; |
|
||||||
import android.graphics.BitmapFactory; |
|
||||||
import android.graphics.Canvas; |
|
||||||
import android.graphics.Color; |
|
||||||
import android.graphics.drawable.BitmapDrawable; |
|
||||||
import android.graphics.drawable.ColorDrawable; |
|
||||||
import android.graphics.drawable.Drawable; |
|
||||||
import android.graphics.drawable.NinePatchDrawable; |
|
||||||
import android.net.Uri; |
|
||||||
import android.os.Build; |
|
||||||
import android.os.Environment; |
|
||||||
import android.provider.DocumentsContract; |
|
||||||
import android.provider.MediaStore; |
|
||||||
import android.text.TextUtils; |
|
||||||
import android.view.View; |
|
||||||
import android.widget.ListView; |
|
||||||
import android.widget.ScrollView; |
|
||||||
|
|
||||||
import androidx.annotation.ColorInt; |
|
||||||
import androidx.annotation.FloatRange; |
|
||||||
|
|
||||||
import java.io.BufferedReader; |
|
||||||
import java.io.ByteArrayOutputStream; |
|
||||||
import java.io.IOException; |
|
||||||
import java.io.InputStream; |
|
||||||
import java.io.InputStreamReader; |
|
||||||
import java.io.UnsupportedEncodingException; |
|
||||||
import java.nio.ByteBuffer; |
|
||||||
import java.text.DecimalFormat; |
|
||||||
import java.util.Arrays; |
|
||||||
import java.util.List; |
|
||||||
|
|
||||||
/** |
|
||||||
* 数据类型转换、单位转换 |
|
||||||
* |
|
||||||
* @author 李玉江[QQ:1023694760] |
|
||||||
* @since 2014-4-18 |
|
||||||
*/ |
|
||||||
public class ConvertUtils { |
|
||||||
public static final long GB = 1073741824; |
|
||||||
public static final long MB = 1048576; |
|
||||||
public static final long KB = 1024; |
|
||||||
|
|
||||||
public static int toInt(Object obj) { |
|
||||||
try { |
|
||||||
return Integer.parseInt(obj.toString()); |
|
||||||
} catch (NumberFormatException e) { |
|
||||||
return -1; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static int toInt(byte[] bytes) { |
|
||||||
int result = 0; |
|
||||||
byte abyte; |
|
||||||
for (int i = 0; i < bytes.length; i++) { |
|
||||||
abyte = bytes[i]; |
|
||||||
result += (abyte & 0xFF) << (8 * i); |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
public static int toShort(byte first, byte second) { |
|
||||||
return (first << 8) + (second & 0xFF); |
|
||||||
} |
|
||||||
|
|
||||||
public static long toLong(Object obj) { |
|
||||||
try { |
|
||||||
return Long.parseLong(obj.toString()); |
|
||||||
} catch (NumberFormatException e) { |
|
||||||
return -1L; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static float toFloat(Object obj) { |
|
||||||
try { |
|
||||||
return Float.parseFloat(obj.toString()); |
|
||||||
} catch (NumberFormatException e) { |
|
||||||
return -1f; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* int占4字节 |
|
||||||
* |
|
||||||
* @param i the |
|
||||||
* @return byte [ ] |
|
||||||
*/ |
|
||||||
public static byte[] toByteArray(int i) { |
|
||||||
// byte[] bytes = new byte[4];
|
|
||||||
// bytes[0] = (byte) (0xff & i);
|
|
||||||
// bytes[1] = (byte) ((0xff00 & i) >> 8);
|
|
||||||
// bytes[2] = (byte) ((0xff0000 & i) >> 16);
|
|
||||||
// bytes[3] = (byte) ((0xff000000 & i) >> 24);
|
|
||||||
// return bytes;
|
|
||||||
return ByteBuffer.allocate(4).putInt(i).array(); |
|
||||||
} |
|
||||||
|
|
||||||
public static byte[] toByteArray(String hexData, boolean isHex) { |
|
||||||
if (hexData == null || hexData.equals("")) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
if (!isHex) { |
|
||||||
return hexData.getBytes(); |
|
||||||
} |
|
||||||
hexData = hexData.replaceAll("\\s+", ""); |
|
||||||
String hexDigits = "0123456789ABCDEF"; |
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream( |
|
||||||
hexData.length() / 2); |
|
||||||
// 将每2位16进制整数组装成一个字节
|
|
||||||
for (int i = 0; i < hexData.length(); i += 2) { |
|
||||||
baos.write((hexDigits.indexOf(hexData.charAt(i)) << 4 | hexDigits |
|
||||||
.indexOf(hexData.charAt(i + 1)))); |
|
||||||
} |
|
||||||
byte[] bytes = baos.toByteArray(); |
|
||||||
try { |
|
||||||
baos.close(); |
|
||||||
} catch (IOException e) { |
|
||||||
} |
|
||||||
return bytes; |
|
||||||
} |
|
||||||
|
|
||||||
public static String toHexString(String str) { |
|
||||||
if (TextUtils.isEmpty(str)) |
|
||||||
return ""; |
|
||||||
StringBuilder builder = new StringBuilder(); |
|
||||||
byte[] bytes = str.getBytes(); |
|
||||||
for (byte aByte : bytes) { |
|
||||||
builder.append(Integer.toHexString(0xFF & aByte)); |
|
||||||
builder.append(" "); |
|
||||||
} |
|
||||||
return builder.toString(); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* To hex string string. |
|
||||||
* |
|
||||||
* @param bytes the bytes |
|
||||||
* @return the string |
|
||||||
*/ |
|
||||||
public static String toHexString(byte... bytes) { |
|
||||||
char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', |
|
||||||
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; |
|
||||||
// 参见:http://www.oschina.net/code/snippet_116768_9019
|
|
||||||
char[] buffer = new char[bytes.length * 2]; |
|
||||||
for (int i = 0, j = 0; i < bytes.length; ++i) { |
|
||||||
int u = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];//转无符号整型
|
|
||||||
buffer[j++] = DIGITS[u >>> 4]; |
|
||||||
buffer[j++] = DIGITS[u & 0xf]; |
|
||||||
} |
|
||||||
return new String(buffer); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* To hex string string. |
|
||||||
* |
|
||||||
* @param num the num |
|
||||||
* @return the string |
|
||||||
*/ |
|
||||||
public static String toHexString(int num) { |
|
||||||
String hexString = Integer.toHexString(num); |
|
||||||
return hexString; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* To binary string string. |
|
||||||
* |
|
||||||
* @param bytes the bytes |
|
||||||
* @return the string |
|
||||||
*/ |
|
||||||
public static String toBinaryString(byte... bytes) { |
|
||||||
char[] DIGITS = {'0', '1', '2', '3', '4', '5', '6', |
|
||||||
'7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; |
|
||||||
// 参见:http://www.oschina.net/code/snippet_116768_9019
|
|
||||||
char[] buffer = new char[bytes.length * 8]; |
|
||||||
for (int i = 0, j = 0; i < bytes.length; ++i) { |
|
||||||
int u = bytes[i] < 0 ? bytes[i] + 256 : bytes[i];//转无符号整型
|
|
||||||
buffer[j++] = DIGITS[(u >>> 7) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 6) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 5) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 4) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 3) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 2) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[(u >>> 1) & 0x1]; |
|
||||||
buffer[j++] = DIGITS[u & 0x1]; |
|
||||||
} |
|
||||||
return new String(buffer); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* To binary string string. |
|
||||||
* |
|
||||||
* @param num the num |
|
||||||
* @return the string |
|
||||||
*/ |
|
||||||
public static String toBinaryString(int num) { |
|
||||||
String binaryString = Integer.toBinaryString(num); |
|
||||||
return binaryString; |
|
||||||
} |
|
||||||
|
|
||||||
public static String toSlashString(String str) { |
|
||||||
String result = ""; |
|
||||||
char[] chars = str.toCharArray(); |
|
||||||
for (char chr : chars) { |
|
||||||
if (chr == '"' || chr == '\'' || chr == '\\') { |
|
||||||
result += "\\";//符合“"”“'”“\”这三个符号的前面加一个“\”
|
|
||||||
} |
|
||||||
result += chr; |
|
||||||
} |
|
||||||
return result; |
|
||||||
} |
|
||||||
|
|
||||||
public static <T> T[] toArray(List<T> list) { |
|
||||||
//noinspection unchecked
|
|
||||||
return (T[]) list.toArray(); |
|
||||||
} |
|
||||||
|
|
||||||
public static <T> List<T> toList(T[] array) { |
|
||||||
return Arrays.asList(array); |
|
||||||
} |
|
||||||
|
|
||||||
public static String toString(Object[] objects) { |
|
||||||
return Arrays.deepToString(objects); |
|
||||||
} |
|
||||||
|
|
||||||
public static String toString(Object[] objects, String tag) { |
|
||||||
StringBuilder sb = new StringBuilder(); |
|
||||||
for (Object object : objects) { |
|
||||||
sb.append(object); |
|
||||||
sb.append(tag); |
|
||||||
} |
|
||||||
return sb.toString(); |
|
||||||
} |
|
||||||
|
|
||||||
public static byte[] toByteArray(InputStream is) { |
|
||||||
if (is == null) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
try { |
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream(); |
|
||||||
byte[] buff = new byte[100]; |
|
||||||
while (true) { |
|
||||||
int len = is.read(buff, 0, 100); |
|
||||||
if (len == -1) { |
|
||||||
break; |
|
||||||
} else { |
|
||||||
os.write(buff, 0, len); |
|
||||||
} |
|
||||||
} |
|
||||||
byte[] bytes = os.toByteArray(); |
|
||||||
os.close(); |
|
||||||
is.close(); |
|
||||||
return bytes; |
|
||||||
} catch (IOException e) { |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
public static byte[] toByteArray(Bitmap bitmap) { |
|
||||||
if (bitmap == null) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
ByteArrayOutputStream os = new ByteArrayOutputStream(); |
|
||||||
// 将Bitmap压缩成PNG编码,质量为100%存储,除了PNG还有很多常见格式,如jpeg等。
|
|
||||||
bitmap.compress(Bitmap.CompressFormat.PNG, 100, os); |
|
||||||
byte[] bytes = os.toByteArray(); |
|
||||||
try { |
|
||||||
os.close(); |
|
||||||
} catch (IOException e) { |
|
||||||
} |
|
||||||
return bytes; |
|
||||||
} |
|
||||||
|
|
||||||
public static Bitmap toBitmap(byte[] bytes, int width, int height) { |
|
||||||
Bitmap bitmap = null; |
|
||||||
if (bytes.length != 0) { |
|
||||||
try { |
|
||||||
BitmapFactory.Options options = new BitmapFactory.Options(); |
|
||||||
// 不进行图片抖动处理
|
|
||||||
options.inDither = false; |
|
||||||
// 设置让解码器以最佳方式解码
|
|
||||||
options.inPreferredConfig = null; |
|
||||||
if (width > 0 && height > 0) { |
|
||||||
options.outWidth = width; |
|
||||||
options.outHeight = height; |
|
||||||
} |
|
||||||
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length, options); |
|
||||||
bitmap.setDensity(96);// 96 dpi
|
|
||||||
} catch (Exception e) { |
|
||||||
} |
|
||||||
} |
|
||||||
return bitmap; |
|
||||||
} |
|
||||||
|
|
||||||
public static Bitmap toBitmap(byte[] bytes) { |
|
||||||
return toBitmap(bytes, -1, -1); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 将Drawable转换为Bitmap |
|
||||||
* 参考:http://kylines.iteye.com/blog/1660184
|
|
||||||
*/ |
|
||||||
public static Bitmap toBitmap(Drawable drawable) { |
|
||||||
if (drawable instanceof BitmapDrawable) { |
|
||||||
return ((BitmapDrawable) drawable).getBitmap(); |
|
||||||
} else if (drawable instanceof ColorDrawable) { |
|
||||||
//color
|
|
||||||
Bitmap bitmap = Bitmap.createBitmap(32, 32, Bitmap.Config.ARGB_8888); |
|
||||||
Canvas canvas = new Canvas(bitmap); |
|
||||||
canvas.drawColor(((ColorDrawable) drawable).getColor()); |
|
||||||
return bitmap; |
|
||||||
} else if (drawable instanceof NinePatchDrawable) { |
|
||||||
//.9.png
|
|
||||||
Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), |
|
||||||
drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); |
|
||||||
Canvas canvas = new Canvas(bitmap); |
|
||||||
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); |
|
||||||
drawable.draw(canvas); |
|
||||||
return bitmap; |
|
||||||
} |
|
||||||
return null; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 从第三方文件选择器获取路径。 |
|
||||||
* 参见:http://blog.csdn.net/zbjdsbj/article/details/42387551
|
|
||||||
*/ |
|
||||||
@TargetApi(Build.VERSION_CODES.KITKAT) |
|
||||||
public static String toPath(Context context, Uri uri) { |
|
||||||
if (uri == null) { |
|
||||||
return ""; |
|
||||||
} |
|
||||||
String path = uri.getPath(); |
|
||||||
String scheme = uri.getScheme(); |
|
||||||
String authority = uri.getAuthority(); |
|
||||||
//是否是4.4及以上版本
|
|
||||||
boolean isKitKat = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT; |
|
||||||
// DocumentProvider
|
|
||||||
if (isKitKat && DocumentsContract.isDocumentUri(context, uri)) { |
|
||||||
String docId = DocumentsContract.getDocumentId(uri); |
|
||||||
String[] split = docId.split(":"); |
|
||||||
String type = split[0]; |
|
||||||
Uri contentUri = null; |
|
||||||
switch (authority) { |
|
||||||
// ExternalStorageProvider
|
|
||||||
case "com.android.externalstorage.documents": |
|
||||||
if ("primary".equalsIgnoreCase(type)) { |
|
||||||
return Environment.getExternalStorageDirectory() + "/" + split[1]; |
|
||||||
} |
|
||||||
break; |
|
||||||
// DownloadsProvider
|
|
||||||
case "com.android.providers.downloads.documents": |
|
||||||
contentUri = ContentUris.withAppendedId( |
|
||||||
Uri.parse("content://downloads/public_downloads"), Long.valueOf(docId)); |
|
||||||
return _queryPathFromMediaStore(context, contentUri, null, null); |
|
||||||
// MediaProvider
|
|
||||||
case "com.android.providers.media.documents": |
|
||||||
if ("image".equals(type)) { |
|
||||||
contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} else if ("video".equals(type)) { |
|
||||||
contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} else if ("audio".equals(type)) { |
|
||||||
contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; |
|
||||||
} |
|
||||||
String selection = "_id=?"; |
|
||||||
String[] selectionArgs = new String[]{split[1]}; |
|
||||||
return _queryPathFromMediaStore(context, contentUri, selection, selectionArgs); |
|
||||||
} |
|
||||||
} |
|
||||||
// MediaStore (and general)
|
|
||||||
else { |
|
||||||
if ("content".equalsIgnoreCase(scheme)) { |
|
||||||
// Return the remote address
|
|
||||||
if (authority.equals("com.google.android.apps.photos.content")) { |
|
||||||
return uri.getLastPathSegment(); |
|
||||||
} |
|
||||||
return _queryPathFromMediaStore(context, uri, null, null); |
|
||||||
} |
|
||||||
// File
|
|
||||||
else if ("file".equalsIgnoreCase(scheme)) { |
|
||||||
return uri.getPath(); |
|
||||||
} |
|
||||||
} |
|
||||||
return path; |
|
||||||
} |
|
||||||
|
|
||||||
private static String _queryPathFromMediaStore(Context context, Uri uri, String selection, String[] selectionArgs) { |
|
||||||
String filePath = null; |
|
||||||
try { |
|
||||||
String[] projection = {MediaStore.Images.Media.DATA}; |
|
||||||
Cursor cursor = context.getContentResolver().query(uri, projection, selection, selectionArgs, null); |
|
||||||
if (cursor != null) { |
|
||||||
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); |
|
||||||
cursor.moveToFirst(); |
|
||||||
filePath = cursor.getString(column_index); |
|
||||||
cursor.close(); |
|
||||||
} |
|
||||||
} catch (IllegalArgumentException e) { |
|
||||||
} |
|
||||||
return filePath; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 把view转化为bitmap(截图) |
|
||||||
* 参见:http://www.cnblogs.com/lee0oo0/p/3355468.html
|
|
||||||
*/ |
|
||||||
public static Bitmap toBitmap(View view) { |
|
||||||
int width = view.getWidth(); |
|
||||||
int height = view.getHeight(); |
|
||||||
if (view instanceof ListView) { |
|
||||||
height = 0; |
|
||||||
// 获取listView实际高度
|
|
||||||
ListView listView = (ListView) view; |
|
||||||
for (int i = 0; i < listView.getChildCount(); i++) { |
|
||||||
height += listView.getChildAt(i).getHeight(); |
|
||||||
} |
|
||||||
} else if (view instanceof ScrollView) { |
|
||||||
height = 0; |
|
||||||
// 获取scrollView实际高度
|
|
||||||
ScrollView scrollView = (ScrollView) view; |
|
||||||
for (int i = 0; i < scrollView.getChildCount(); i++) { |
|
||||||
height += scrollView.getChildAt(i).getHeight(); |
|
||||||
} |
|
||||||
} |
|
||||||
view.setDrawingCacheEnabled(true); |
|
||||||
view.clearFocus(); |
|
||||||
view.setPressed(false); |
|
||||||
boolean willNotCache = view.willNotCacheDrawing(); |
|
||||||
view.setWillNotCacheDrawing(false); |
|
||||||
// Reset the drawing cache background color to fully transparent for the duration of this operation
|
|
||||||
int color = view.getDrawingCacheBackgroundColor(); |
|
||||||
view.setDrawingCacheBackgroundColor(Color.WHITE);//截图去黑色背景(透明像素)
|
|
||||||
if (color != Color.WHITE) { |
|
||||||
view.destroyDrawingCache(); |
|
||||||
} |
|
||||||
view.buildDrawingCache(); |
|
||||||
Bitmap cacheBitmap = view.getDrawingCache(); |
|
||||||
if (cacheBitmap == null) { |
|
||||||
return null; |
|
||||||
} |
|
||||||
Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); |
|
||||||
Canvas canvas = new Canvas(bitmap); |
|
||||||
canvas.drawBitmap(cacheBitmap, 0, 0, null); |
|
||||||
canvas.save(); |
|
||||||
canvas.restore(); |
|
||||||
if (!bitmap.isRecycled()) { |
|
||||||
bitmap.recycle(); |
|
||||||
} |
|
||||||
// Restore the view
|
|
||||||
view.destroyDrawingCache(); |
|
||||||
view.setWillNotCacheDrawing(willNotCache); |
|
||||||
view.setDrawingCacheBackgroundColor(color); |
|
||||||
return bitmap; |
|
||||||
} |
|
||||||
|
|
||||||
public static Drawable toDrawable(Bitmap bitmap) { |
|
||||||
return bitmap == null ? null : new BitmapDrawable(Resources.getSystem(), bitmap); |
|
||||||
} |
|
||||||
|
|
||||||
public static byte[] toByteArray(Drawable drawable) { |
|
||||||
return toByteArray(toBitmap(drawable)); |
|
||||||
} |
|
||||||
|
|
||||||
public static Drawable toDrawable(byte[] bytes) { |
|
||||||
return toDrawable(toBitmap(bytes)); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* dp转换为px |
|
||||||
*/ |
|
||||||
public static int toPx(Context context, float dpValue) { |
|
||||||
final float scale = context.getResources().getDisplayMetrics().density; |
|
||||||
int pxValue = (int) (dpValue * scale + 0.5f); |
|
||||||
return pxValue; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* px转换为dp |
|
||||||
*/ |
|
||||||
public static int toDp(Context context, float pxValue) { |
|
||||||
final float scale = context.getResources().getDisplayMetrics().density; |
|
||||||
int dpValue = (int) (pxValue / scale + 0.5f); |
|
||||||
return dpValue; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* px转换为sp |
|
||||||
*/ |
|
||||||
public static int toSp(Context context, float pxValue) { |
|
||||||
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity; |
|
||||||
int spValue = (int) (pxValue / fontScale + 0.5f); |
|
||||||
return spValue; |
|
||||||
} |
|
||||||
|
|
||||||
public static String toGbk(String str) { |
|
||||||
try { |
|
||||||
return new String(str.getBytes("utf-8"), "gbk"); |
|
||||||
} catch (UnsupportedEncodingException e) { |
|
||||||
return str; |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
public static String toFileSizeString(long fileSize) { |
|
||||||
DecimalFormat df = new DecimalFormat("0.00"); |
|
||||||
String fileSizeString; |
|
||||||
if (fileSize < KB) { |
|
||||||
fileSizeString = fileSize + "B"; |
|
||||||
} else if (fileSize < MB) { |
|
||||||
fileSizeString = df.format((double) fileSize / KB) + "K"; |
|
||||||
} else if (fileSize < GB) { |
|
||||||
fileSizeString = df.format((double) fileSize / MB) + "M"; |
|
||||||
} else { |
|
||||||
fileSizeString = df.format((double) fileSize / GB) + "G"; |
|
||||||
} |
|
||||||
return fileSizeString; |
|
||||||
} |
|
||||||
|
|
||||||
public static String toString(InputStream is, String charset) { |
|
||||||
StringBuilder sb = new StringBuilder(); |
|
||||||
try { |
|
||||||
BufferedReader reader = new BufferedReader(new InputStreamReader(is, charset)); |
|
||||||
while (true) { |
|
||||||
String line = reader.readLine(); |
|
||||||
if (line == null) { |
|
||||||
break; |
|
||||||
} else { |
|
||||||
sb.append(line).append("\n"); |
|
||||||
} |
|
||||||
} |
|
||||||
reader.close(); |
|
||||||
is.close(); |
|
||||||
} catch (IOException e) { |
|
||||||
} |
|
||||||
return sb.toString(); |
|
||||||
} |
|
||||||
|
|
||||||
public static String toString(InputStream is) { |
|
||||||
return toString(is, "utf-8"); |
|
||||||
} |
|
||||||
|
|
||||||
public static int toDarkenColor(@ColorInt int color) { |
|
||||||
return toDarkenColor(color, 0.8f); |
|
||||||
} |
|
||||||
|
|
||||||
public static int toDarkenColor(@ColorInt int color, @FloatRange(from = 0f, to = 1f) float value) { |
|
||||||
float[] hsv = new float[3]; |
|
||||||
Color.colorToHSV(color, hsv); |
|
||||||
hsv[2] *= value;//HSV指Hue、Saturation、Value,即色调、饱和度和亮度,此处表示修改亮度
|
|
||||||
return Color.HSVToColor(hsv); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 转换为6位十六进制颜色代码,不含“#” |
|
||||||
*/ |
|
||||||
public static String toColorString(@ColorInt int color) { |
|
||||||
return toColorString(color, false); |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 转换为6位十六进制颜色代码,不含“#” |
|
||||||
*/ |
|
||||||
public static String toColorString(@ColorInt int color, boolean includeAlpha) { |
|
||||||
String alpha = Integer.toHexString(Color.alpha(color)); |
|
||||||
String red = Integer.toHexString(Color.red(color)); |
|
||||||
String green = Integer.toHexString(Color.green(color)); |
|
||||||
String blue = Integer.toHexString(Color.blue(color)); |
|
||||||
if (alpha.length() == 1) { |
|
||||||
alpha = "0" + alpha; |
|
||||||
} |
|
||||||
if (red.length() == 1) { |
|
||||||
red = "0" + red; |
|
||||||
} |
|
||||||
if (green.length() == 1) { |
|
||||||
green = "0" + green; |
|
||||||
} |
|
||||||
if (blue.length() == 1) { |
|
||||||
blue = "0" + blue; |
|
||||||
} |
|
||||||
String colorString; |
|
||||||
if (includeAlpha) { |
|
||||||
colorString = alpha + red + green + blue; |
|
||||||
} else { |
|
||||||
colorString = red + green + blue; |
|
||||||
} |
|
||||||
return colorString; |
|
||||||
} |
|
||||||
|
|
||||||
/** |
|
||||||
* 对TextView、Button等设置不同状态时其文字颜色。 |
|
||||||
* 参见:http://blog.csdn.net/sodino/article/details/6797821
|
|
||||||
* Modified by liyujiang at 2015.08.13 |
|
||||||
*/ |
|
||||||
public static ColorStateList toColorStateList(@ColorInt int normalColor, @ColorInt int pressedColor, |
|
||||||
@ColorInt int focusedColor, @ColorInt int unableColor) { |
|
||||||
int[] colors = new int[]{pressedColor, focusedColor, normalColor, focusedColor, unableColor, normalColor}; |
|
||||||
int[][] states = new int[6][]; |
|
||||||
states[0] = new int[]{android.R.attr.state_pressed, android.R.attr.state_enabled}; |
|
||||||
states[1] = new int[]{android.R.attr.state_enabled, android.R.attr.state_focused}; |
|
||||||
states[2] = new int[]{android.R.attr.state_enabled}; |
|
||||||
states[3] = new int[]{android.R.attr.state_focused}; |
|
||||||
states[4] = new int[]{android.R.attr.state_window_focused}; |
|
||||||
states[5] = new int[]{}; |
|
||||||
return new ColorStateList(states, colors); |
|
||||||
} |
|
||||||
|
|
||||||
public static ColorStateList toColorStateList(@ColorInt int normalColor, @ColorInt int pressedColor) { |
|
||||||
return toColorStateList(normalColor, pressedColor, pressedColor, normalColor); |
|
||||||
} |
|
||||||
|
|
||||||
} |
|
@ -0,0 +1,131 @@ |
|||||||
|
package io.legado.app.ui.filechooser.utils |
||||||
|
|
||||||
|
import android.content.res.Resources |
||||||
|
import android.graphics.Bitmap |
||||||
|
import android.graphics.BitmapFactory |
||||||
|
import android.graphics.drawable.BitmapDrawable |
||||||
|
import android.graphics.drawable.Drawable |
||||||
|
import okhttp3.internal.and |
||||||
|
import java.io.BufferedReader |
||||||
|
import java.io.IOException |
||||||
|
import java.io.InputStream |
||||||
|
import java.io.InputStreamReader |
||||||
|
import java.text.DecimalFormat |
||||||
|
import java.util.* |
||||||
|
|
||||||
|
/** |
||||||
|
* 数据类型转换、单位转换 |
||||||
|
* |
||||||
|
* @author 李玉江[QQ:1023694760] |
||||||
|
* @since 2014-4-18 |
||||||
|
*/ |
||||||
|
object ConvertUtils { |
||||||
|
const val GB: Long = 1073741824 |
||||||
|
const val MB: Long = 1048576 |
||||||
|
const val KB: Long = 1024 |
||||||
|
|
||||||
|
fun toInt(obj: Any): Int { |
||||||
|
return try { |
||||||
|
Integer.parseInt(obj.toString()) |
||||||
|
} catch (e: NumberFormatException) { |
||||||
|
-1 |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
fun toInt(bytes: ByteArray): Int { |
||||||
|
var result = 0 |
||||||
|
var abyte: Byte |
||||||
|
for (i in bytes.indices) { |
||||||
|
abyte = bytes[i] |
||||||
|
result += abyte and 0xFF shl 8 * i |
||||||
|
} |
||||||
|
return result |
||||||
|
} |
||||||
|
|
||||||
|
fun toFloat(obj: Any): Float { |
||||||
|
return try { |
||||||
|
java.lang.Float.parseFloat(obj.toString()) |
||||||
|
} catch (e: NumberFormatException) { |
||||||
|
-1f |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
fun toString(objects: Array<Any>): String { |
||||||
|
return Arrays.deepToString(objects) |
||||||
|
} |
||||||
|
|
||||||
|
fun toString(objects: Array<Any>, tag: String): String { |
||||||
|
val sb = StringBuilder() |
||||||
|
for (`object` in objects) { |
||||||
|
sb.append(`object`) |
||||||
|
sb.append(tag) |
||||||
|
} |
||||||
|
return sb.toString() |
||||||
|
} |
||||||
|
|
||||||
|
@JvmOverloads |
||||||
|
fun toBitmap(bytes: ByteArray, width: Int = -1, height: Int = -1): Bitmap? { |
||||||
|
var bitmap: Bitmap? = null |
||||||
|
if (bytes.isNotEmpty()) { |
||||||
|
try { |
||||||
|
val options = BitmapFactory.Options() |
||||||
|
// 不进行图片抖动处理 |
||||||
|
options.inDither = false |
||||||
|
// 设置让解码器以最佳方式解码 |
||||||
|
options.inPreferredConfig = null |
||||||
|
if (width > 0 && height > 0) { |
||||||
|
options.outWidth = width |
||||||
|
options.outHeight = height |
||||||
|
} |
||||||
|
bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size, options) |
||||||
|
bitmap!!.density = 96// 96 dpi |
||||||
|
} catch (e: Exception) { |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
return bitmap |
||||||
|
} |
||||||
|
|
||||||
|
fun toDrawable(bitmap: Bitmap?): Drawable? { |
||||||
|
return if (bitmap == null) null else BitmapDrawable(Resources.getSystem(), bitmap) |
||||||
|
} |
||||||
|
|
||||||
|
fun toDrawable(bytes: ByteArray): Drawable? { |
||||||
|
return toDrawable(toBitmap(bytes)) |
||||||
|
} |
||||||
|
|
||||||
|
fun toFileSizeString(fileSize: Long): String { |
||||||
|
val df = DecimalFormat("0.00") |
||||||
|
val fileSizeString: String |
||||||
|
fileSizeString = when { |
||||||
|
fileSize < KB -> fileSize.toString() + "B" |
||||||
|
fileSize < MB -> df.format(fileSize.toDouble() / KB) + "K" |
||||||
|
fileSize < GB -> df.format(fileSize.toDouble() / MB) + "M" |
||||||
|
else -> df.format(fileSize.toDouble() / GB) + "G" |
||||||
|
} |
||||||
|
return fileSizeString |
||||||
|
} |
||||||
|
|
||||||
|
@JvmOverloads |
||||||
|
fun toString(`is`: InputStream, charset: String = "utf-8"): String { |
||||||
|
val sb = StringBuilder() |
||||||
|
try { |
||||||
|
val reader = BufferedReader(InputStreamReader(`is`, charset)) |
||||||
|
while (true) { |
||||||
|
val line = reader.readLine() |
||||||
|
if (line == null) { |
||||||
|
break |
||||||
|
} else { |
||||||
|
sb.append(line).append("\n") |
||||||
|
} |
||||||
|
} |
||||||
|
reader.close() |
||||||
|
`is`.close() |
||||||
|
} catch (e: IOException) { |
||||||
|
} |
||||||
|
|
||||||
|
return sb.toString() |
||||||
|
} |
||||||
|
|
||||||
|
} |
Loading…
Reference in new issue