android:animation
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
android:animation [2012/05/10 09:28] – percy | android:animation [2016/05/05 13:07] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Android Animation ====== | ====== Android Animation ====== | ||
+ | |||
+ | ===== Animation ===== | ||
+ | - Android API Animation: | ||
+ | - Android Animation Guide: | ||
+ | ===== Camera ===== | ||
+ | - Android API Camera: | ||
Line 7: | Line 13: | ||
- Android API Matrix: | - Android API Matrix: | ||
- pre/ | - pre/ | ||
+ | |||
+ | ===== Image Util ===== | ||
+ | <file java ImageUtil.java> | ||
+ | |||
+ | package me.pjq.imageutil; | ||
+ | |||
+ | import android.graphics.Bitmap; | ||
+ | import android.graphics.BitmapFactory; | ||
+ | import android.graphics.Canvas; | ||
+ | import android.graphics.Color; | ||
+ | import android.graphics.Matrix; | ||
+ | import android.graphics.Rect; | ||
+ | import android.graphics.drawable.BitmapDrawable; | ||
+ | import android.graphics.drawable.Drawable; | ||
+ | import android.util.Log; | ||
+ | |||
+ | import java.io.ByteArrayOutputStream; | ||
+ | |||
+ | /** | ||
+ | * 图片处理 <br> | ||
+ | * Reference: | ||
+ | | ||
+ | * @author pengjianqing@gmail.com | ||
+ | */ | ||
+ | public class ImageUtil { | ||
+ | |||
+ | /** | ||
+ | * 图片旋转 | ||
+ | | ||
+ | * @param bmp 要旋转的图片 | ||
+ | * @param degree 图片旋转的角度,负值为逆时针旋转,正值为顺时针旋转 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap rotateBitmap(Bitmap bmp, float degree) { | ||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.postRotate(degree); | ||
+ | return Bitmap.createBitmap(bmp, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 图片缩放 | ||
+ | | ||
+ | * @param bm | ||
+ | * @param scale 值小于则为缩小,否则为放大 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap resizeBitmap(Bitmap bm, float scale) { | ||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.postScale(scale, | ||
+ | return Bitmap.createBitmap(bm, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 图片缩放 | ||
+ | | ||
+ | * @param bm | ||
+ | * @param w 缩小或放大成的宽 | ||
+ | * @param h 缩小或放大成的高 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap resizeBitmap(Bitmap bm, int w, int h) { | ||
+ | Bitmap BitmapOrg = bm; | ||
+ | |||
+ | int width = BitmapOrg.getWidth(); | ||
+ | int height = BitmapOrg.getHeight(); | ||
+ | |||
+ | float scaleWidth = ((float) w) / width; | ||
+ | float scaleHeight = ((float) h) / height; | ||
+ | |||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.postScale(scaleWidth, | ||
+ | return Bitmap.createBitmap(BitmapOrg, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 图片反转 | ||
+ | | ||
+ | * @param bm | ||
+ | * @param flag 0为水平反转,1为垂直反转 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap reverseBitmap(Bitmap bmp, int flag) { | ||
+ | float[] floats = null; | ||
+ | switch (flag) { | ||
+ | case 0: // 水平反转 | ||
+ | floats = new float[] { | ||
+ | -1f, 0f, 0f, 0f, 1f, 0f, 0f, 0f, 1f | ||
+ | }; | ||
+ | break; | ||
+ | case 1: // 垂直反转 | ||
+ | floats = new float[] { | ||
+ | 1f, 0f, 0f, 0f, -1f, 0f, 0f, 0f, 1f | ||
+ | }; | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | if (floats != null) { | ||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.setValues(floats); | ||
+ | return Bitmap.createBitmap(bmp, | ||
+ | } | ||
+ | |||
+ | return bmp; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 图片效果叠加 | ||
+ | | ||
+ | * @param bmp 限制了尺寸大小的Bitmap | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap overlay(Bitmap bmp, Bitmap overlay) | ||
+ | { | ||
+ | long start = System.currentTimeMillis(); | ||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | // 对边框图片进行缩放 | ||
+ | // Bitmap overlay = | ||
+ | // BitmapFactory.decodeResource(mContext.getResources(), | ||
+ | // R.drawable.rainbow_overlay); | ||
+ | int w = overlay.getWidth(); | ||
+ | int h = overlay.getHeight(); | ||
+ | float scaleX = width * 1F / w; | ||
+ | float scaleY = height * 1F / h; | ||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.postScale(scaleX, | ||
+ | |||
+ | Bitmap overlayCopy = Bitmap.createBitmap(overlay, | ||
+ | |||
+ | int pixColor = 0; | ||
+ | int layColor = 0; | ||
+ | |||
+ | int pixR = 0; | ||
+ | int pixG = 0; | ||
+ | int pixB = 0; | ||
+ | int pixA = 0; | ||
+ | |||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | int newA = 0; | ||
+ | |||
+ | int layR = 0; | ||
+ | int layG = 0; | ||
+ | int layB = 0; | ||
+ | int layA = 0; | ||
+ | |||
+ | final float alpha = 0.5F; | ||
+ | |||
+ | int[] srcPixels = new int[width * height]; | ||
+ | int[] layPixels = new int[width * height]; | ||
+ | bmp.getPixels(srcPixels, | ||
+ | overlayCopy.getPixels(layPixels, | ||
+ | |||
+ | int pos = 0; | ||
+ | for (int i = 0; i < height; i++) | ||
+ | { | ||
+ | for (int k = 0; k < width; k++) | ||
+ | { | ||
+ | pos = i * width + k; | ||
+ | pixColor = srcPixels[pos]; | ||
+ | layColor = layPixels[pos]; | ||
+ | |||
+ | pixR = Color.red(pixColor); | ||
+ | pixG = Color.green(pixColor); | ||
+ | pixB = Color.blue(pixColor); | ||
+ | pixA = Color.alpha(pixColor); | ||
+ | |||
+ | layR = Color.red(layColor); | ||
+ | layG = Color.green(layColor); | ||
+ | layB = Color.blue(layColor); | ||
+ | layA = Color.alpha(layColor); | ||
+ | |||
+ | newR = (int) (pixR * alpha + layR * (1 - alpha)); | ||
+ | newG = (int) (pixG * alpha + layG * (1 - alpha)); | ||
+ | newB = (int) (pixB * alpha + layB * (1 - alpha)); | ||
+ | layA = (int) (pixA * alpha + layA * (1 - alpha)); | ||
+ | |||
+ | newR = Math.min(255, | ||
+ | newG = Math.min(255, | ||
+ | newB = Math.min(255, | ||
+ | newA = Math.min(255, | ||
+ | |||
+ | srcPixels[pos] = Color.argb(newA, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | bitmap.setPixels(srcPixels, | ||
+ | long end = System.currentTimeMillis(); | ||
+ | Log.d(" | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 浮雕效果 | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap emboss(Bitmap bmp) | ||
+ | { | ||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | int pixR = 0; | ||
+ | int pixG = 0; | ||
+ | int pixB = 0; | ||
+ | |||
+ | int pixColor = 0; | ||
+ | |||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | |||
+ | int[] pixels = new int[width * height]; | ||
+ | bmp.getPixels(pixels, | ||
+ | int pos = 0; | ||
+ | for (int i = 1, length = height - 1; i < length; i++) | ||
+ | { | ||
+ | for (int k = 1, len = width - 1; k < len; k++) | ||
+ | { | ||
+ | pos = i * width + k; | ||
+ | pixColor = pixels[pos]; | ||
+ | |||
+ | pixR = Color.red(pixColor); | ||
+ | pixG = Color.green(pixColor); | ||
+ | pixB = Color.blue(pixColor); | ||
+ | |||
+ | pixColor = pixels[pos + 1]; | ||
+ | newR = Color.red(pixColor) - pixR + 127; | ||
+ | newG = Color.green(pixColor) - pixG + 127; | ||
+ | newB = Color.blue(pixColor) - pixB + 127; | ||
+ | |||
+ | newR = Math.min(255, | ||
+ | newG = Math.min(255, | ||
+ | newB = Math.min(255, | ||
+ | |||
+ | pixels[pos] = Color.argb(255, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | bitmap.setPixels(pixels, | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 叠加边框图片有用部分 | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap alphaLayer(Bitmap bmp, Bitmap overlay) | ||
+ | { | ||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | // 边框图片 | ||
+ | // Bitmap overlay = | ||
+ | // BitmapFactory.decodeResource(mContext.getResources(), | ||
+ | // R.drawable.black); | ||
+ | int w = overlay.getWidth(); | ||
+ | int h = overlay.getHeight(); | ||
+ | float scaleX = width * 1F / w; | ||
+ | float scaleY = height * 1F / h; | ||
+ | Matrix matrix = new Matrix(); | ||
+ | matrix.postScale(scaleX, | ||
+ | |||
+ | Bitmap overlayCopy = Bitmap.createBitmap(overlay, | ||
+ | |||
+ | int pixColor = 0; | ||
+ | int layColor = 0; | ||
+ | int newColor = 0; | ||
+ | |||
+ | int pixR = 0; | ||
+ | int pixG = 0; | ||
+ | int pixB = 0; | ||
+ | int pixA = 0; | ||
+ | |||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | int newA = 0; | ||
+ | |||
+ | int layR = 0; | ||
+ | int layG = 0; | ||
+ | int layB = 0; | ||
+ | int layA = 0; | ||
+ | |||
+ | float alpha = 0.3F; | ||
+ | float alphaR = 0F; | ||
+ | float alphaG = 0F; | ||
+ | float alphaB = 0F; | ||
+ | for (int i = 0; i < width; i++) | ||
+ | { | ||
+ | for (int k = 0; k < height; k++) | ||
+ | { | ||
+ | pixColor = bmp.getPixel(i, | ||
+ | layColor = overlayCopy.getPixel(i, | ||
+ | |||
+ | // 获取原图片的RGBA值 | ||
+ | pixR = Color.red(pixColor); | ||
+ | pixG = Color.green(pixColor); | ||
+ | pixB = Color.blue(pixColor); | ||
+ | pixA = Color.alpha(pixColor); | ||
+ | |||
+ | // 获取边框图片的RGBA值 | ||
+ | layR = Color.red(layColor); | ||
+ | layG = Color.green(layColor); | ||
+ | layB = Color.blue(layColor); | ||
+ | layA = Color.alpha(layColor); | ||
+ | |||
+ | // 颜色与纯黑色相近的点 | ||
+ | if (layR < 20 && layG < 20 && layB < 20) | ||
+ | { | ||
+ | alpha = 1F; | ||
+ | } | ||
+ | else | ||
+ | { | ||
+ | alpha = 0.3F; | ||
+ | } | ||
+ | |||
+ | alphaR = alpha; | ||
+ | alphaG = alpha; | ||
+ | alphaB = alpha; | ||
+ | |||
+ | // 两种颜色叠加 | ||
+ | newR = (int) (pixR * alphaR + layR * (1 - alphaR)); | ||
+ | newG = (int) (pixG * alphaG + layG * (1 - alphaG)); | ||
+ | newB = (int) (pixB * alphaB + layB * (1 - alphaB)); | ||
+ | layA = (int) (pixA * alpha + layA * (1 - alpha)); | ||
+ | |||
+ | // 值在0~255之间 | ||
+ | newR = Math.min(255, | ||
+ | newG = Math.min(255, | ||
+ | newB = Math.min(255, | ||
+ | newA = Math.min(255, | ||
+ | |||
+ | newColor = Color.argb(newA, | ||
+ | bitmap.setPixel(i, | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Bitmap转换成byte数组 | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static byte[] bitmap2Byte(Bitmap bmp) | ||
+ | { | ||
+ | ByteArrayOutputStream baos = new ByteArrayOutputStream(); | ||
+ | bmp.compress(Bitmap.CompressFormat.PNG, | ||
+ | return baos.toByteArray(); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 数组转换成Bitmap | ||
+ | | ||
+ | * @param buffer | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap byte2Bitmap(byte[] buffer) | ||
+ | { | ||
+ | return BitmapFactory.decodeByteArray(buffer, | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * Bitmap转换成Drawable | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Drawable bitmap2Drawable(Bitmap bmp) | ||
+ | { | ||
+ | return new BitmapDrawable(bmp); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * BitmapDrawable转换成Bitmap | ||
+ | | ||
+ | * @param drawable | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap drawable2Bitmap(BitmapDrawable drawable) | ||
+ | { | ||
+ | return drawable.getBitmap(); | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 怀旧效果(相对之前做了优化快一倍) | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap oldRemeber(Bitmap bmp) | ||
+ | { | ||
+ | // 速度测试 | ||
+ | long start = System.currentTimeMillis(); | ||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | int pixColor = 0; | ||
+ | int pixR = 0; | ||
+ | int pixG = 0; | ||
+ | int pixB = 0; | ||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | int[] pixels = new int[width * height]; | ||
+ | bmp.getPixels(pixels, | ||
+ | for (int i = 0; i < height; i++) | ||
+ | { | ||
+ | for (int k = 0; k < width; k++) | ||
+ | { | ||
+ | pixColor = pixels[width * i + k]; | ||
+ | pixR = Color.red(pixColor); | ||
+ | pixG = Color.green(pixColor); | ||
+ | pixB = Color.blue(pixColor); | ||
+ | newR = (int) (0.393 * pixR + 0.769 * pixG + 0.189 * pixB); | ||
+ | newG = (int) (0.349 * pixR + 0.686 * pixG + 0.168 * pixB); | ||
+ | newB = (int) (0.272 * pixR + 0.534 * pixG + 0.131 * pixB); | ||
+ | int newColor = Color.argb(255, | ||
+ | newB > 255 ? 255 : newB); | ||
+ | pixels[width * i + k] = newColor; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | bitmap.setPixels(pixels, | ||
+ | long end = System.currentTimeMillis(); | ||
+ | Log.d(" | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 模糊效果 | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap blurImage(Bitmap bmp) | ||
+ | { | ||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | int pixColor = 0; | ||
+ | |||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | |||
+ | int newColor = 0; | ||
+ | |||
+ | int[][] colors = new int[9][3]; | ||
+ | for (int i = 1, length = width - 1; i < length; i++) | ||
+ | { | ||
+ | for (int k = 1, len = height - 1; k < len; k++) | ||
+ | { | ||
+ | for (int m = 0; m < 9; m++) | ||
+ | { | ||
+ | int s = 0; | ||
+ | int p = 0; | ||
+ | switch (m) | ||
+ | { | ||
+ | case 0: | ||
+ | s = i - 1; | ||
+ | p = k - 1; | ||
+ | break; | ||
+ | case 1: | ||
+ | s = i; | ||
+ | p = k - 1; | ||
+ | break; | ||
+ | case 2: | ||
+ | s = i + 1; | ||
+ | p = k - 1; | ||
+ | break; | ||
+ | case 3: | ||
+ | s = i + 1; | ||
+ | p = k; | ||
+ | break; | ||
+ | case 4: | ||
+ | s = i + 1; | ||
+ | p = k + 1; | ||
+ | break; | ||
+ | case 5: | ||
+ | s = i; | ||
+ | p = k + 1; | ||
+ | break; | ||
+ | case 6: | ||
+ | s = i - 1; | ||
+ | p = k + 1; | ||
+ | break; | ||
+ | case 7: | ||
+ | s = i - 1; | ||
+ | p = k; | ||
+ | break; | ||
+ | case 8: | ||
+ | s = i; | ||
+ | p = k; | ||
+ | } | ||
+ | pixColor = bmp.getPixel(s, | ||
+ | colors[m][0] = Color.red(pixColor); | ||
+ | colors[m][1] = Color.green(pixColor); | ||
+ | colors[m][2] = Color.blue(pixColor); | ||
+ | } | ||
+ | |||
+ | for (int m = 0; m < 9; m++) | ||
+ | { | ||
+ | newR += colors[m][0]; | ||
+ | newG += colors[m][1]; | ||
+ | newB += colors[m][2]; | ||
+ | } | ||
+ | |||
+ | newR = (int) (newR / 9F); | ||
+ | newG = (int) (newG / 9F); | ||
+ | newB = (int) (newB / 9F); | ||
+ | |||
+ | newR = Math.min(255, | ||
+ | newG = Math.min(255, | ||
+ | newB = Math.min(255, | ||
+ | |||
+ | newColor = Color.argb(255, | ||
+ | bitmap.setPixel(i, | ||
+ | |||
+ | newR = 0; | ||
+ | newG = 0; | ||
+ | newB = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 柔化效果(高斯模糊)(优化后比上面快三倍) | ||
+ | | ||
+ | * @param bmp | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap blurImageAmeliorate(Bitmap bmp) | ||
+ | { | ||
+ | long start = System.currentTimeMillis(); | ||
+ | // 高斯矩阵 | ||
+ | int[] gauss = new int[] { | ||
+ | 1, 2, 1, 2, 4, 2, 1, 2, 1 | ||
+ | }; | ||
+ | |||
+ | int width = bmp.getWidth(); | ||
+ | int height = bmp.getHeight(); | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | int pixR = 0; | ||
+ | int pixG = 0; | ||
+ | int pixB = 0; | ||
+ | |||
+ | int pixColor = 0; | ||
+ | |||
+ | int newR = 0; | ||
+ | int newG = 0; | ||
+ | int newB = 0; | ||
+ | |||
+ | int delta = 16; // 值越小图片会越亮,越大则越暗 | ||
+ | |||
+ | int idx = 0; | ||
+ | int[] pixels = new int[width * height]; | ||
+ | bmp.getPixels(pixels, | ||
+ | for (int i = 1, length = height - 1; i < length; i++) | ||
+ | { | ||
+ | for (int k = 1, len = width - 1; k < len; k++) | ||
+ | { | ||
+ | idx = 0; | ||
+ | for (int m = -1; m <= 1; m++) | ||
+ | { | ||
+ | for (int n = -1; n <= 1; n++) | ||
+ | { | ||
+ | pixColor = pixels[(i + m) * width + k + n]; | ||
+ | pixR = Color.red(pixColor); | ||
+ | pixG = Color.green(pixColor); | ||
+ | pixB = Color.blue(pixColor); | ||
+ | |||
+ | newR = newR + (int) (pixR * gauss[idx]); | ||
+ | newG = newG + (int) (pixG * gauss[idx]); | ||
+ | newB = newB + (int) (pixB * gauss[idx]); | ||
+ | idx++; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | newR /= delta; | ||
+ | newG /= delta; | ||
+ | newB /= delta; | ||
+ | |||
+ | newR = Math.min(255, | ||
+ | newG = Math.min(255, | ||
+ | newB = Math.min(255, | ||
+ | |||
+ | pixels[i * width + k] = Color.argb(255, | ||
+ | |||
+ | newR = 0; | ||
+ | newG = 0; | ||
+ | newB = 0; | ||
+ | } | ||
+ | } | ||
+ | |||
+ | bitmap.setPixels(pixels, | ||
+ | long end = System.currentTimeMillis(); | ||
+ | Log.d(" | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** 图片的上半部分标识 */ | ||
+ | public static final int FLAG_TOP = 0x1; | ||
+ | /** 图片的下半部分标识 */ | ||
+ | public static final int FLAG_BOTTOM = FLAG_TOP << 1; | ||
+ | /** 图片的左半部分标识 */ | ||
+ | public static final int FLAG_LEFT = FLAG_TOP << 2; | ||
+ | /** 图片的右半部分标识 */ | ||
+ | public static final int FLAG_RIGHT = FLAG_TOP << 3; | ||
+ | |||
+ | public static Bitmap cropBitmap(Bitmap bmp) | ||
+ | { | ||
+ | // 将图片切成左右两块 | ||
+ | Bitmap left = cropBitmapLandscape(bmp, | ||
+ | Bitmap right = cropBitmapLandscape(bmp, | ||
+ | |||
+ | // 再将左右两块图片切成四块 | ||
+ | Bitmap leftTop = cropBitmapPortrait(left, | ||
+ | Bitmap leftBottom = cropBitmapPortrait(left, | ||
+ | Bitmap rightTop = cropBitmapPortrait(right, | ||
+ | Bitmap rightBottom = cropBitmapPortrait(right, | ||
+ | |||
+ | // 原左右两块图片回收 | ||
+ | left.recycle(); | ||
+ | right.recycle(); | ||
+ | left = null; | ||
+ | right = null; | ||
+ | |||
+ | // 创建新图片,中间留10个像素的间距 | ||
+ | final int width = bmp.getWidth() + 10; | ||
+ | final int height = bmp.getHeight() + 10; | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | // 组合图片 | ||
+ | final int leftPos = width - leftBottom.getWidth(); | ||
+ | final int topPos = height - leftBottom.getHeight(); | ||
+ | Canvas canvas = new Canvas(bitmap); | ||
+ | canvas.drawBitmap(rightBottom, | ||
+ | canvas.drawBitmap(leftBottom, | ||
+ | canvas.drawBitmap(rightTop, | ||
+ | canvas.drawBitmap(leftTop, | ||
+ | |||
+ | // 图片回收 | ||
+ | leftTop.recycle(); | ||
+ | leftBottom.recycle(); | ||
+ | rightTop.recycle(); | ||
+ | rightBottom.recycle(); | ||
+ | |||
+ | rightTop = null; | ||
+ | leftTop = null; | ||
+ | leftBottom = null; | ||
+ | rightBottom = null; | ||
+ | |||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 水平切割图片,也就是将图片分成左右两块 | ||
+ | | ||
+ | * @param bmp 图片 | ||
+ | * @param flag 是保留左边还是右边的标识 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap cropBitmapLandscape(Bitmap bmp, int flag) | ||
+ | { | ||
+ | final int width = bmp.getWidth(); | ||
+ | final int height = bmp.getHeight(); | ||
+ | int startWidth = 0; // 起始宽度位置 | ||
+ | int endWidth = width / 2; // 结束宽度位置 | ||
+ | Bitmap bitmap = Bitmap.createBitmap(endWidth, | ||
+ | |||
+ | switch (flag) | ||
+ | { | ||
+ | case FLAG_LEFT: | ||
+ | break; | ||
+ | case FLAG_RIGHT: | ||
+ | startWidth = endWidth; | ||
+ | endWidth = width; | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | Rect r = new Rect(startWidth, | ||
+ | Rect rect = new Rect(0, 0, width / 2, height); // 新图片的大小 | ||
+ | Canvas canvas = new Canvas(bitmap); | ||
+ | canvas.drawBitmap(bmp, | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | /** | ||
+ | * 垂直切割图片,也就是说将图片切成上下两块 | ||
+ | | ||
+ | * @param bmp | ||
+ | * @param flag 图片是保留上面还是下面 | ||
+ | * @return | ||
+ | */ | ||
+ | public static Bitmap cropBitmapPortrait(Bitmap bmp, int flag) | ||
+ | { | ||
+ | final int width = bmp.getWidth(); | ||
+ | final int height = bmp.getHeight(); | ||
+ | int startHeight = 0; // 高度的起始位置 | ||
+ | int endHeight = height / 2; // 高度的结束位置 | ||
+ | Bitmap bitmap = Bitmap.createBitmap(width, | ||
+ | |||
+ | switch (flag) | ||
+ | { | ||
+ | case FLAG_TOP: | ||
+ | break; | ||
+ | case FLAG_BOTTOM: | ||
+ | startHeight = endHeight; | ||
+ | endHeight = height; | ||
+ | break; | ||
+ | } | ||
+ | |||
+ | Rect r = new Rect(0, startHeight, | ||
+ | Rect rect = new Rect(0, 0, width, height / 2); // 新图片的大小 | ||
+ | Canvas canvas = new Canvas(bitmap); | ||
+ | canvas.drawBitmap(bmp, | ||
+ | return bitmap; | ||
+ | } | ||
+ | |||
+ | } | ||
+ | |||
+ | |||
+ | </ |
/var/www/dokuwiki/wiki/data/attic/android/animation.1336613338.txt.gz · Last modified: 2016/05/05 13:06 (external edit)