在做一个项目的时候有个要求就是固定大小取图像的缩略图,android2.2以前的话都是通过BitmapFactory.Options 设置Options通过一定的宽高比例来得到一个缩略图,但是得到的并不是要求的固定大小的缩略图,而是宽和高按一定比例缩放后的,android2.2以后提供了一个新的类ThumbnailUtils类可以直接获取,但是考虑到2.2以版本的兼容性ThumbnailUtils虽然很好但是不适用,通过对ThumbnailUtils类的解析,项目中抽出了一个新的类把ThumbnailUtils类中与图片不相关的内容剔除出来,这样就可以兼容所有的版本:

上代码:

private static class ImageZoom {

private static final int OPTIONS_SCALE_UP = 0x1;

public static final int OPTIONS_RECYCLE_INPUT = 0x2;

private static final int OPTIONS_NONE = 0x0;

public static  Bitmap  extractThumbnail(Bitmap source, int width, int height)

{

return extractThumbnail(source,width,height,OPTIONS_NONE);

}

private static Bitmap  extractThumbnail(

Bitmap source, int width, int height, int options) {

if (source == null) {

return null;

}

float scale;

if (source.getWidth() < source.getHeight()) {

scale = width / (float) source.getWidth();

} else {

scale = height / (float) source.getHeight();

}

Matrix matrix = new Matrix();

matrix.setScale(scale, scale);

Bitmap thumbnail = transform(matrix, source, width, height,

OPTIONS_SCALE_UP | options);

return thumbnail;

}

private static Bitmap transform(Matrix scaler,

Bitmap source,

int targetWidth,

int targetHeight,

int options) {

boolean scaleUp = (options & OPTIONS_SCALE_UP) != 0;

boolean recycle = (options & OPTIONS_RECYCLE_INPUT) != 0;

int deltaX = source.getWidth() - targetWidth;

int deltaY = source.getHeight() - targetHeight;

if (!scaleUp && (deltaX < 0 || deltaY < 0)) {

Bitmap b2 = Bitmap.createBitmap(targetWidth, targetHeight,

Bitmap.Config.ARGB_8888);

Canvas c = new Canvas(b2);

int deltaXHalf = Math.max(0, deltaX / 2);

int deltaYHalf = Math.max(0, deltaY / 2);

Rect src = new Rect(

deltaXHalf,

deltaYHalf,

deltaXHalf + Math.min(targetWidth, source.getWidth()),

deltaYHalf + Math.min(targetHeight, source.getHeight()));

int dstX = (targetWidth  - src.width())  / 2;

int dstY = (targetHeight - src.height()) / 2;

Rect dst = new Rect(

dstX,

dstY,

targetWidth - dstX,

targetHeight - dstY);

c.drawBitmap(source, src, dst, null);

if (recycle) {

source.recycle();

}

return b2;

}

float bitmapWidthF = source.getWidth();

float bitmapHeightF = source.getHeight();

float bitmapAspect = bitmapWidthF / bitmapHeightF;

float viewAspect   = (float) targetWidth / targetHeight;

if (bitmapAspect > viewAspect) {

float scale = targetHeight / bitmapHeightF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

} else {

float scale = targetWidth / bitmapWidthF;

if (scale < .9F || scale > 1F) {

scaler.setScale(scale, scale);

} else {

scaler = null;

}

}

Bitmap b1;

if (scaler != null) {

b1 = Bitmap.createBitmap(source, 0, 0,

source.getWidth(), source.getHeight(), scaler, true);

} else {

b1 = source;

}

if (recycle && b1 != source) {

source.recycle();

}

int dx1 = Math.max(0, b1.getWidth() - targetWidth);

int dy1 = Math.max(0, b1.getHeight() - targetHeight);

Bitmap b2 = Bitmap.createBitmap(

b1,

dx1 / 2,

dy1 / 2,

targetWidth,

targetHeight);

if (b2 != b1) {

if (recycle || b1 != source) {

b1.recycle();

}

}

return b2;

}

}

android 固定大小,android 固定大小取图片缩略图相关推荐

  1. 5 控件固定大小_【聊技术】在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示. 想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的.比如列表中的文章标题.界面下方的按钮文本等等. ...

  2. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  3. android 评价 星星大小,Android RatingBar 评价栏 星星 大小 样式 设置

    Android系统自带RatingBar,无法直接指定宽高,不然会出现无法全部显示的情况,使用系统自带的两个主题 ?android:attr/ratingBarStyleIndicator和 ?and ...

  4. android ripple 大小,Android L限制Ripple水波纹范围大小

    Android L限制Ripple水波纹范围大小 Ripple 简介 Android 5.0 之后 google 推出了 Material Design,Botton 默认的触摸反馈会有水波纹涟漪效果 ...

  5. 【聊技术】在Android中实现自适应文本大小显示

    本周的聊技术话题和大家说说如何在Android中实现自适应文本大小显示. 想象一下,在布局中,通常显示文本的区域大小是固定的,但是文本长度并不总是固定的.比如列表中的文章标题.界面下方的按钮文本等等. ...

  6. 一丶Android如何自定义一个固定的飞行操作摇杆?

    摘要:自定义控件这一块,今天我就教大家如何来自定义一个无人飞行器的固定摇杆控件,摇杆是固定在手机屏幕的固定位置,点击的对应区域高亮,并且实时对飞行器的轨迹控制. 一丶飞行器的介绍,现在有很多无人飞行器 ...

  7. android改变整个app字体大小,Android APP字体随系统字体调整造成界面布局混乱问题解决方案...

    一.遇到的问题: 当用户调整系统字体大小的时候,APP的字体一般也都会跟随改变,进而导致某些界面布局排版混乱. 下面先说一下关于sp单位的理解 sp单位除了受屏幕密度影响外,还受到用户的字体大小影响, ...

  8. android使用Vitamio实现视频播放大小屏流畅切换

    之前在自己的一个项目中用到过视频播放,今天抽空把遇到的坑都写下来,顺便给将要用到的朋友提个醒. 首先说下开源的视频播放框架有好几个,我这里主要讲我用到的这个,那就是Vitamio.有关vitamio的 ...

  9. android thumb大小,Android 设置thumb图片大小

    xml: android:thumb="@drawable/seekbar_thumb" seekbar_thumb.xml: 修改为: private int seekWidth ...

  10. android 调整字体,android设置:调整字体大小

    在手机的设置中,我可以全局更改应用的字体大小.android设置:调整字体大小 设置>显示>字体大小 我可以做的字体大小(小,中,大,非常大),也看过Java和(如果适用).只为我的应用程 ...

最新文章

  1. EasyPusher实现Android手机屏幕桌面直播,实时推送操作画面,用于手游直播等应用
  2. PG 9.4 行冻结信息的测试
  3. java 事件驱动模式_事件驱动
  4. 32位浮点数在威纶触摸屏显示_MCGS触摸屏与与西门子 S7-1200 PLC以太网通讯
  5. 深入理解Objective-C:Category
  6. Surviving the Release Version
  7. 11.2 uptime:显示系统的运行时间及负载
  8. PKU A Simple Problem with Integers 3468
  9. Mysql 的表级锁和行级锁
  10. Tp框架中模板中if条件如何使用?
  11. h264的码率控制 JVT-G012
  12. lol1.7更新服务器维护,lol今天停机维护到几点11日7.1版本停机更新公告
  13. BI报表设计 AJ-Report
  14. 宋体和英文字号与matlab中对照,CSS字体中英文名称对照表:如宋体对应SimSun
  15. WiFi的信道与关联
  16. html5怎么设置表格背景颜色,Echart 如何设置表格内的背景颜色?
  17. 传奇3单机显示服务器进不去,传奇3单机架设的不能进入游戏
  18. C#开发自动照片(图片)裁剪(缩放)工具
  19. 科学解释超级计算机,人工智能、现代科学证明:宇宙是虚拟的,真实世界是超级计算机...
  20. fseek,ftell,rewind函数

热门文章

  1. JDK 动态代理和MyBatis 用到的JDK 动态代理有什么区别?
  2. Fanout交换器-搭建环境
  3. Zuul:路由和高可用小结
  4. Spring核心系列之Spring中的事务
  5. mysql在linux下配置_mysql数据库在Linux下安装与配置
  6. linux7添加两个网关,RHEL7设置IP地址、网关和DNS
  7. uploadify php处理程序,uploadify 后台处理
  8. html 列表循环_python web开发:内置标签与过滤器/循环/条件判断
  9. 解决代码中重复的捕获 promise 错误的 try catch 语句
  10. Vs 2015 批量 删除注释