Android仿微信聊天图片缩略图裁剪

本文地址:http://blog.csdn.net/Jaden_hool/article/details/49642297
效果图
1、横图原图:
Android仿微信聊天图片缩略图裁剪_第1张图片
横图聊天界面缩略图:
Android仿微信聊天图片缩略图裁剪_第2张图片
2、竖图原图:
Android仿微信聊天图片缩略图裁剪_第3张图片
竖图聊天界面缩略图:
Android仿微信聊天图片缩略图裁剪_第4张图片
3、聊天界面效果图:
Android仿微信聊天图片缩略图裁剪_第5张图片
一、首先要明确,”ImageView控件的大小“ 和 “用src属性设置的图片的大小”并不是一个概念,可以通过设置scaleType属性实现想要的效果。借用别的大神做的一张图简单介绍一下scaleType属性:
Android仿微信聊天图片缩略图裁剪_第6张图片
常量
public static final ImageView.ScaleType CENTER
在视图中使图像居中,不执行缩放。
在 XML 中可以使用的语法: android:scaleType=”center”。
public static final ImageView.ScaleType CENTER_CROP
均衡的缩放图像(保持图像原始比例),使图片的两个坐标(宽、高)都大于等于 相应的视图坐标(负的内边距)。图像则位于视图的中央。
在 XML 中可以使用的语法:android:scaleType=”centerCrop”。
public static final ImageView.ScaleType CENTER_INSIDE
均 衡的缩放图像(保持图像原始比例),使图片的两个坐标(宽、高)都小于等于 相应的视图坐标(负的内边距)。图像则位于视图的中央。
在 XML 中可以使用的语法:android:scaleType=”centerInside”。
public static final ImageView.ScaleType FIT_CENTER
使用 CENTER 方式缩放图像。
在 XML 中可以使用的语法: android:scaleType=”fitCenter”。
public static final ImageView.ScaleType FIT_END
使用 END 方式缩放图像。
在 XML 中可以使用的语法: android:scaleType=”fitEnd”。
public static final ImageView.ScaleType FIT_START
使用 START 方式缩放图像。
在 XML 中可以使用的语法:android:scaleType=”fitStart”。
public static final ImageView.ScaleType FIT_XY
使 用 FILL 方式缩放图像。
在 XML 中可以使用的语法: android:scaleType=”fitXY”。
public static final ImageView.ScaleType MATRIX
绘制时,使用图像矩阵方式缩放。图像矩阵可以通过 setImageMatrix(Matrix) 设置。在 XML 中可以使用的语法: android:scaleType=”matrix”。(此部分内容为转载)

public class ImageSize {

    private int width;
    private int height;
    public int getWidth() {
        return width;
    }
    public void setWidth(int width) {
        this.width = width;
    }
    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }


}

二、根据以下方法得到ImageView控件的大小,但是图片的实际大小并不需要改变。

public static ImageSize getImageSize(Bitmap bitmap) {
        ImageSize imageSize = new ImageSize();
        if (null == bitmap || bitmap.isRecycled()) {
            return null;
        }
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        byte[] byteTmp = baos.toByteArray();
        try {
            baos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        BitmapFactory.Options bitmapOptions = new BitmapFactory.Options();
        bitmapOptions.inJustDecodeBounds = true;
        BitmapFactory.decodeByteArray(byteTmp, 0, byteTmp.length, bitmapOptions);
        int outWidth = bitmapOptions.outWidth;
        int outHeight = bitmapOptions.outHeight;
        int maxWidth = 400;
        int maxHeight = 400;
        int minWidth = 150;
        int minHeight = 150;
        if (outWidth / maxWidth > outHeight / maxHeight) {//
            if (outWidth >= maxWidth) {//
                imageSize.setWidth(maxWidth);
                imageSize.setHeight(outHeight * maxWidth / outWidth);
            } else {
                imageSize.setWidth(outWidth);
                imageSize.setHeight(outHeight);
            }
            if (outHeight < minHeight) {
                imageSize.setHeight(minHeight);
                int width = outWidth * minHeight / outHeight;
                if (width > maxWidth) {
                    imageSize.setWidth(maxWidth);
                } else {
                    imageSize.setWidth(width);
                }
            }
        } else {
            if (outHeight >= maxHeight) {
                imageSize.setHeight(maxHeight);
                imageSize.setWidth(outWidth * maxHeight / outHeight);
            } else {
                imageSize.setHeight(outHeight);
                imageSize.setWidth(outWidth);
            }
            if (outWidth < minWidth) {
                imageSize.setWidth(minWidth);
                int height = outHeight * minWidth / outWidth;
                if (height > maxHeight) {
                    imageSize.setHeight(maxHeight);
                } else {
                    imageSize.setHeight(height);
                }
            }
        }

        return imageSize;
    }

三、最后一步非常重要,为ImageView添加属性android:scaleType=”centerCrop”。设置图片时,先从网络上下载得到bitmap对象,调用getImageSize(Bitmap bitmap)方法得到ImageView的宽高,在代码中动态为ImageView设置宽高即可:

ImageSize imageSize = BitmapUtils.getImageSize(loadedImage);
        LayoutParams imageLP = imageView.getLayoutParams();
                        imageLP.width = imageSize.getWidth();
                        imageLP.height = imageSize.getHeight();
                        imageView.setLayoutParams(imageLP);

你可能感兴趣的:(原创)