package cn.qqtheme.framework.util; 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.support.annotation.ColorInt; import android.support.annotation.FloatRange; import android.text.TextUtils; import android.view.View; import android.widget.ListView; import android.widget.ScrollView; 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; import java.util.Locale; /** * 数据类型转换、单位转换 * * @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) { LogUtils.warn(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); LogUtils.verbose(String.format(Locale.CHINA, "%d to hex string is %s", num, hexString)); 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); LogUtils.verbose(String.format(Locale.CHINA, "%d to binary string is %s", num, binaryString)); 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) { LogUtils.warn(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) { LogUtils.warn(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) { LogUtils.error(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) { LogUtils.verbose("uri is null"); return ""; } LogUtils.verbose("uri: " + uri.toString()); 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(); } } LogUtils.verbose("uri to path: " + path); 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) { LogUtils.error(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()) { LogUtils.verbose("recycle bitmap: " + bitmap.toString()); 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); LogUtils.verbose(dpValue + " dp == " + pxValue + " px"); 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); LogUtils.verbose(pxValue + " px == " + dpValue + " dp"); 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); LogUtils.verbose(pxValue + " px == " + spValue + " sp"); return spValue; } public static String toGbk(String str) { try { return new String(str.getBytes("utf-8"), "gbk"); } catch (UnsupportedEncodingException e) { LogUtils.warn(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) { LogUtils.error(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; LogUtils.verbose(String.format(Locale.CHINA, "%d to color string is %s", color, colorString)); } else { colorString = red + green + blue; LogUtils.verbose(String.format(Locale.CHINA, "%d to color string is %s%s%s%s, exclude alpha is %s", color, alpha, red, green, blue, colorString)); } 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); } }