編輯:關於android開發
比如,項目中調用相,返回一張圖片一眼看過去,就是放大後才有區別。
1. 項目中用到的的代碼
// 從SD卡裡直接獲取Bitmap
private Bitmap getDiskBitmap(String pathString) {
Bitmap bitmap = null;
try {
File file = new File(pathString);
if (file.exists()) {
bitmap = BitmapFactory.decodeFile(pathString);
}
} catch (Exception e) {
// TODO: handle exception
}
return bitmap;
}
// 轉換成64位的Bitmap
public static String bitmapToBase64(Bitmap bitmap) {
String result = null;
ByteArrayOutputStream baos = null;
try {
if (bitmap != null) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
baos.flush();
baos.close();
byte[] bitmapBytes = baos.toByteArray();
result = Base64.encodeToString(bitmapBytes, Base64.DEFAULT);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (baos != null) {
baos.flush();
baos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
// 裁剪
public static Bitmap imageCrop(Bitmap bitmap, int num1, int num2,
boolean isRecycled) {
if (bitmap == null) {
return null;
}
int w = bitmap.getWidth(); // 得到圖片的寬,高
int h = bitmap.getHeight();
int retX, retY;
int nw, nh;
if (w > h) {
if (h > w * num2 / num1) {
nw = w;
nh = w * num2 / num1;
retX = 0;
retY = (h - nh) / 2;
} else {
nw = h * num1 / num2;
nh = h;
retX = (w - nw) / 2;
retY = 0;
}
} else {
if (w > h * num2 / num1) {
nh = h;
nw = h * num2 / num1;
retY = 0;
retX = (w - nw) / 2;
} else {
nh = w * num1 / num2;
nw = w;
retY = (h - nh) / 2;
retX = 0;
}
}
Bitmap bmp = Bitmap.createBitmap(bitmap, retX, retY, nw, nh, null,
false);
if (isRecycled && bitmap != null && !bitmap.equals(bmp)
&& !bitmap.isRecycled()) {
bitmap.recycle();// 回收原圖片
bitmap = null;
}
return bmp;
}
private void encode() {
File file = new File(Environment.getExternalStorageDirectory(),"famous_bitmap_painting.jpg");
try {
if (file.exists()) {
file.delete();
}
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
String imgPath = getIntent().getStringExtra("famousPicturePath");
//圖片的地址imgBitmapPath
String imgBitmapPath = file.getPath().toString();
try {
ImageUtils.createImageThumbnail(getApplicationContext(), imgPath,
imgBitmapPath, 500, 100);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//bitmap ---createImageThumbnail工具類裁剪後處理後的圖片 Bitmap bitmap = getDiskBitmap(imgBitmapPath);
if (bitmap != null) {//bitmap ---imageCrop類裁剪後處理後的圖片
Bitmap bitmap2 = imageCrop(bitmap, 500, 500, false);
search_img.setImageBitmap(bitmap2);//bitmap 轉成---64位字節
String base64 = bitmapToBase64(bitmap);
}
}
2. 重點是這個工具類,其中大部分無用的,有用的可以直接
public class ImageUtils {
public final static String SDCARD_MNT = "/mnt/sdcard";
public final static String SDCARD = "/sdcard";
/** 請求相冊 */
public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;
/** 請求相機 */
public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;
/** 請求裁剪 */
public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2;
public static final int REQUEST_CODE_GETIMAGE_IMAGEPAVER = 3;
/**
* 寫圖片文件 在Android系統中,文件保存在 /data/data/PACKAGE_NAME/files 目錄下
*
* @throws IOException
*/
public static void saveImage(Context context, String fileName, Bitmap bitmap)
throws IOException {
saveImage(context, fileName, bitmap, 100);
}
public static void saveImage(Context context, String fileName,
Bitmap bitmap, int quality) throws IOException {
if (bitmap == null || fileName == null || context == null)
return;
FileOutputStream fos = context.openFileOutput(fileName,
Context.MODE_PRIVATE);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, quality, stream);
byte[] bytes = stream.toByteArray();
fos.write(bytes);
fos.close();
}
/**
* 寫圖片文件到SD卡
*
* @throws IOException
*/
public static void saveImageToSD(Context ctx, String filePath,
Bitmap bitmap, int quality) throws IOException {
if (bitmap != null) {
File file = new File(filePath.substring(0,
filePath.lastIndexOf(File.separator)));
if (!file.exists()) {
file.mkdirs();
}
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(filePath));
bitmap.compress(CompressFormat.JPEG, quality, bos);
bos.flush();
bos.close();
if (ctx != null) {
scanPhoto(ctx, filePath);
}
}
}
public static void saveBackgroundImage(Context ctx, String filePath,
Bitmap bitmap, int quality) throws IOException {
if (bitmap != null) {
File file = new File(filePath.substring(0,
filePath.lastIndexOf(File.separator)));
if (!file.exists()) {
file.mkdirs();
}
BufferedOutputStream bos = new BufferedOutputStream(
new FileOutputStream(filePath));
bitmap.compress(CompressFormat.PNG, quality, bos);
bos.flush();
bos.close();
if (ctx != null) {
scanPhoto(ctx, filePath);
}
}
}
/**
* 讓Gallery上能馬上看到該圖片
*/
private static void scanPhoto(Context ctx, String imgFileName) {
Intent mediaScanIntent = new Intent(
Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
File file = new File(imgFileName);
Uri contentUri = Uri.fromFile(file);
mediaScanIntent.setData(contentUri);
ctx.sendBroadcast(mediaScanIntent);
}
/**
* 獲取bitmap
*
* @param context
* @param fileName
* @return
*/
public static Bitmap getBitmap(Context context, String fileName) {
FileInputStream fis = null;
Bitmap bitmap = null;
try {
fis = context.openFileInput(fileName);
bitmap = BitmapFactory.decodeStream(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
return bitmap;
}
/**
* 獲取bitmap
*
* @param filePath
* @return
*/
public static Bitmap getBitmapByPath(String filePath) {
return getBitmapByPath(filePath, null);
}
public static Bitmap getBitmapByPath(String filePath,
BitmapFactory.Options opts) {
FileInputStream fis = null;
Bitmap bitmap = null;
try {
File file = new File(filePath);
fis = new FileInputStream(file);
bitmap = BitmapFactory.decodeStream(fis, null, opts);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
return bitmap;
}
/**
* 獲取bitmap
*
* @param file
* @return
*/
public static Bitmap getBitmapByFile(File file) {
FileInputStream fis = null;
Bitmap bitmap = null;
try {
fis = new FileInputStream(file);
bitmap = BitmapFactory.decodeStream(fis);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
e.printStackTrace();
} finally {
try {
fis.close();
} catch (Exception e) {
}
}
return bitmap;
}
/**
* 使用當前時間戳拼接一個唯一的文件名
*
* @param format
* @return
*/
public static String getTempFileName() {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SS");
String fileName = format.format(new Timestamp(System
.currentTimeMillis()));
return fileName;
}
/**
* 獲取照相機使用的目錄
*
* @return
*/
public static String getCamerPath() {
return Environment.getExternalStorageDirectory() + File.separator
+ "FounderNews" + File.separator;
}
/**
* 判斷當前Url是否標准的content://樣式,如果不是,則返回絕對路徑
*
* @param uri
* @return
*/
public static String getAbsolutePathFromNoStandardUri(Uri mUri) {
String filePath = null;
String mUriString = mUri.toString();
mUriString = Uri.decode(mUriString);
String pre1 = "file://" + SDCARD + File.separator;
String pre2 = "file://" + SDCARD_MNT + File.separator;
if (mUriString.startsWith(pre1)) {
filePath = Environment.getExternalStorageDirectory().getPath()
+ File.separator + mUriString.substring(pre1.length());
} else if (mUriString.startsWith(pre2)) {
filePath = Environment.getExternalStorageDirectory().getPath()
+ File.separator + mUriString.substring(pre2.length());
}
return filePath;
}
/**
* 通過uri獲取文件的絕對路徑
*
* @param uri
* @return
*/
@SuppressWarnings("deprecation")
public static String getAbsoluteImagePath(Activity context, Uri uri) {
String imagePath = "";
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = context.managedQuery(uri, proj, // Which columns to
// return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
if (cursor != null) {
int column_index = cursor
.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
if (cursor.getCount() > 0 && cursor.moveToFirst()) {
imagePath = cursor.getString(column_index);
}
}
return imagePath;
}
/**
* 獲取圖片縮略圖 只有Android2.1以上版本支持
*
* @param imgName
* @param kind
* MediaStore.Images.Thumbnails.MICRO_KIND
* @return
*/
@SuppressWarnings("deprecation")
public static Bitmap loadImgThumbnail(Activity context, String imgName,
int kind) {
Bitmap bitmap = null;
String[] proj = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.DISPLAY_NAME };
Cursor cursor = context.managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,
MediaStore.Images.Media.DISPLAY_NAME + "='" + imgName + "'",
null, null);
if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
ContentResolver crThumb = context.getContentResolver();
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 1;
// bitmap = MethodsCompat.getThumbnail(crThumb, cursor.getInt(0),
// kind, options);
}
return bitmap;
}
public static Bitmap loadImgThumbnail(String filePath, int w, int h) {
Bitmap bitmap = getBitmapByPath(filePath);
return zoomBitmap(bitmap, w, h);
}
/**
* 獲取SD卡中最新圖片路徑
*
* @return
*/
public static String getLatestImage(Activity context) {
String latestImage = null;
String[] items = { MediaStore.Images.Media._ID,
MediaStore.Images.Media.DATA };
Cursor cursor = context.managedQuery(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI, items, null,
null, MediaStore.Images.Media._ID + " desc");
if (cursor != null && cursor.getCount() > 0) {
cursor.moveToFirst();
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
.moveToNext()) {
latestImage = cursor.getString(1);
break;
}
}
return latestImage;
}
/**
* 計算縮放圖片的寬高
*
* @param img_size
* @param square_size
* @return
*/
public static int[] scaleImageSize(int[] img_size, int square_size) {
if (img_size[0] <= square_size && img_size[1] <= square_size)
return img_size;
double ratio = square_size
/ (double) Math.max(img_size[0], img_size[1]);
return new int[] { (int) (img_size[0] * ratio),
(int) (img_size[1] * ratio) };
}
/**
* 創建縮略圖
*
* @param context
* @param largeImagePath
* 原始大圖路徑
* @param thumbfilePath
* 輸出縮略圖路徑
* @param square_size
* 輸出圖片寬度
* @param quality
* 輸出圖片質量
* @throws IOException
*/
public static void createImageThumbnail(Context context,
String largeImagePath, String thumbfilePath, int square_size,
int quality) throws IOException {
BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = 1;
// 原始圖片bitmap
Bitmap cur_bitmap = getBitmapByPath(largeImagePath, opts);
if (cur_bitmap == null)
return;
// 原始圖片的高寬
int[] cur_img_size = new int[] { cur_bitmap.getWidth(),
cur_bitmap.getHeight() };
// 計算原始圖片縮放後的寬高
int[] new_img_size = scaleImageSize(cur_img_size, square_size);
// 生成縮放後的bitmap
Bitmap thb_bitmap = zoomBitmap(cur_bitmap, new_img_size[0],
new_img_size[1]);
// 生成縮放後的圖片文件
saveImageToSD(null, thumbfilePath, thb_bitmap, quality);
}
/**
* 放大縮小圖片
*
* @param bitmap
* @param w
* @param h
* @return
*/
public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
Bitmap newbmp = null;
if (bitmap != null) {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
float scaleWidht = ((float) w / width);
float scaleHeight = ((float) h / height);
matrix.postScale(scaleWidht, scaleHeight);
newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix,
true);
}
return newbmp;
}
public static Bitmap scaleBitmap(Bitmap bitmap) {
// 獲取這個圖片的寬和高
int width = bitmap.getWidth();
int height = bitmap.getHeight();
// 定義預轉換成的圖片的寬度和高度
int newWidth = 200;
int newHeight = 200;
// 計算縮放率,新尺寸除原始尺寸
float scaleWidth = ((float) newWidth) / width;
float scaleHeight = ((float) newHeight) / height;
// 創建操作圖片用的matrix對象
Matrix matrix = new Matrix();
// 縮放圖片動作
matrix.postScale(scaleWidth, scaleHeight);
// 旋轉圖片 動作
// matrix.postRotate(45);
// 創建新的圖片
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
matrix, true);
return resizedBitmap;
}
/**
* (縮放)重繪圖片
*
* @param context
* Activity
* @param bitmap
* @return
*/
public static Bitmap reDrawBitMap(Activity context, Bitmap bitmap) {
DisplayMetrics dm = new DisplayMetrics();
context.getWindowManager().getDefaultDisplay().getMetrics(dm);
int rHeight = dm.heightPixels;
int rWidth = dm.widthPixels;
// float rHeight=dm.heightPixels/dm.density+0.5f;
// float rWidth=dm.widthPixels/dm.density+0.5f;
// int height=bitmap.getScaledHeight(dm);
// int width = bitmap.getScaledWidth(dm);
int height = bitmap.getHeight();
int width = bitmap.getWidth();
float zoomScale;
/** 方式3 **/
if (width >= rWidth)
zoomScale = ((float) rWidth) / width;
else
zoomScale = 1.0f;
// 創建操作圖片用的matrix對象
Matrix matrix = new Matrix();
// 縮放圖片動作
matrix.postScale(zoomScale, zoomScale);
Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
bitmap.getWidth(), bitmap.getHeight(), matrix, true);
return resizedBitmap;
}
/**
* 將Drawable轉化為Bitmap
*
* @param drawable
* @return
*/
public static Bitmap drawableToBitmap(Drawable drawable) {
int width = drawable.getIntrinsicWidth();
int height = drawable.getIntrinsicHeight();
Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
: Bitmap.Config.RGB_565);
Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, width, height);
drawable.draw(canvas);
return bitmap;
}
/**
* 獲得圓角圖片的方法
*
* @param bitmap
* @param roundPx
* 一般設成14
* @return
*/
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Paint paint = new Paint();
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
/**
* 獲得帶倒影的圖片方法
*
* @param bitmap
* @return
*/
public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
final int reflectionGap = 4;
int width = bitmap.getWidth();
int height = bitmap.getHeight();
Matrix matrix = new Matrix();
matrix.preScale(1, -1);
Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
width, height / 2, matrix, false);
Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
(height + height / 2), Config.ARGB_8888);
Canvas canvas = new Canvas(bitmapWithReflection);
canvas.drawBitmap(bitmap, 0, 0, null);
Paint deafalutPaint = new Paint();
canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
Paint paint = new Paint();
LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
0x00ffffff, TileMode.CLAMP);
paint.setShader(shader);
// Set the Transfer mode to be porter duff and destination in
paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
// Draw a rectangle using the paint with our linear gradient
canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
+ reflectionGap, paint);
return bitmapWithReflection;
}
/**
* 將bitmap轉化為drawable
*
* @param bitmap
* @return
*/
public static Drawable bitmapToDrawable(Bitmap bitmap) {
Drawable drawable = new BitmapDrawable(bitmap);
return drawable;
}
/**
* 獲取圖片類型
*
* @param file
* @return
*/
public static String getImageType(File file) {
if (file == null || !file.exists()) {
return null;
}
InputStream in = null;
try {
in = new FileInputStream(file);
String type = getImageType(in);
return type;
} catch (IOException e) {
return null;
} finally {
try {
if (in != null) {
in.close();
}
} catch (IOException e) {
}
}
}
/**
* 獲取圖片的類型信息
*
* @param in
* @return
* @see #getImageType(byte[])
*/
public static String getImageType(InputStream in) {
if (in == null) {
return null;
}
try {
byte[] bytes = new byte[8];
in.read(bytes);
return getImageType(bytes);
} catch (IOException e) {
return null;
}
}
/**
* 獲取圖片的類型信息
*
* @param bytes
* 2~8 byte at beginning of the image file
* @return image mimetype or null if the file is not image
*/
public static String getImageType(byte[] bytes) {
if (isJPEG(bytes)) {
return "image/jpeg";
}
if (isGIF(bytes)) {
return "image/gif";
}
if (isPNG(bytes)) {
return "image/png";
}
if (isBMP(bytes)) {
return "application/x-bmp";
}
return null;
}
private static boolean isJPEG(byte[] b) {
if (b.length < 2) {
return false;
}
return (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8);
}
private static boolean isGIF(byte[] b) {
if (b.length < 6) {
return false;
}
return b[0] == 'G' && b[1] == 'I' && b[2] == 'F' && b[3] == '8'
&& (b[4] == '7' || b[4] == '9') && b[5] == 'a';
}
private static boolean isPNG(byte[] b) {
if (b.length < 8) {
return false;
}
return (b[0] == (byte) 137 && b[1] == (byte) 80 && b[2] == (byte) 78
&& b[3] == (byte) 71 && b[4] == (byte) 13 && b[5] == (byte) 10
&& b[6] == (byte) 26 && b[7] == (byte) 10);
}
private static boolean isBMP(byte[] b) {
if (b.length < 2) {
return false;
}
return (b[0] == 0x42) && (b[1] == 0x4d);
}
/**
*
*/
public static String getImagePath(Uri uri, Activity context) {
String[] projection = { MediaColumns.DATA };
Cursor cursor = context.getContentResolver().query(uri, projection,
null, null, null);
if (cursor != null) {
cursor.moveToFirst();
int columIndex = cursor.getColumnIndexOrThrow(MediaColumns.DATA);
String ImagePath = cursor.getString(columIndex);
cursor.close();
return ImagePath;
}
return uri.toString();
}
static Bitmap bitmap = null;
/**
* 2014年8月13日
*
* @param uri
* @param context
* E-mail:mr.huangwenwei@gmail.com
*/
public static Bitmap loadPicasaImageFromGalley(final Uri uri,
final Activity context) {
String[] projection = { MediaColumns.DATA, MediaColumns.DISPLAY_NAME };
Cursor cursor = context.getContentResolver().query(uri, projection,
null, null, null);
if (cursor != null) {
cursor.moveToFirst();
int columIndex = cursor.getColumnIndex(MediaColumns.DISPLAY_NAME);
if (columIndex != -1) {
new Thread(new Runnable() {
@Override
public void run() {
try {
bitmap = android.provider.MediaStore.Images.Media
.getBitmap(context.getContentResolver(),
uri);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
cursor.close();
return bitmap;
} else
return null;
}
public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen) {
return rotateAndScale(b, degrees, maxSideLen, true);
}
public static Bitmap rotateAndScale(Bitmap b, int degrees, float maxSideLen, boolean recycle) {
// if (null == b || degrees == 0 && b.getWidth() <= maxSideLen + 10 && b.getHeight() <= maxSideLen + 10) {
// return b;
// }
Matrix m = new Matrix();
if (degrees != 0) {
m.setRotate(degrees);
}
// float scale = Math.min(maxSideLen / b.getWidth(), maxSideLen / b.getHeight());
// if (scale < 1) {
// m.postScale(scale, scale);
// }
try {
Bitmap b2 = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), m, true);
if (null != b2 && b != b2) {
if (recycle) {
b.recycle();
}
b = b2;
}
} catch (OutOfMemoryError e) {
}
return b;
}
public static Bitmap decodeByteArrayUnthrow(byte[] data, BitmapFactory.Options opts) {
try {
return BitmapFactory.decodeByteArray(data, 0, data.length, opts);
} catch (Throwable e) {
}
return null;
}
public static boolean saveBitmap2file(Bitmap bmp, File file, Bitmap.CompressFormat format, int quality) {
if (file.isFile())
file.delete();
OutputStream stream = null;
try {
stream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
return false;
}
return bmp.compress(format, quality, stream);
}
/*
* 視頻錄制所需工具類
*/
public static List<Camera.Size> getResolutionList(Camera camera)
{
Parameters parameters = camera.getParameters();
List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes();
return previewSizes;
}
public static class ResolutionComparator implements Comparator<Camera.Size>{
@Override
public int compare(Size lhs, Size rhs) {
if(lhs.height!=rhs.height)
return lhs.height-rhs.height;
else
return lhs.width-rhs.width;
}
}
}
Android中使用開源框架android-image-indicator實現圖片輪播部署,
Android中使用開源框架android-image-indicator實現圖片輪播部署,之前的博文中有介紹關於圖片輪播的實現方式,分別為(含超鏈接): 1、《Andr
Android 博客園客戶端 (五) 查看評論、搜索博主,android查看評論
Android 博客園客戶端 (五) 查看評論、搜索博主,android查看評論項目地址:https://github.com/ZhangTingkuo/AndroidC
[Android]OkHttp的簡單封裝-輔助框架
[Android]OkHttp的簡單封裝-輔助框架 序言 OkHttp 的強大算是毋庸置疑了;OkHttp 基本在網絡層能完成任何事情,適用任何情況;正因為如此 OkH
Android開源項目分類匯總(六)工具庫
Android開源項目分類匯總(六)工具庫 主要包括那些不錯的開發庫,包括依賴注入框架、圖片緩存、網絡相關、數據庫ORM建模、Android公共庫、Android 高版本