Android ImageView设置图片原理(下)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
写完上一篇后,总认为介绍的知识点不多,仅仅是一种在UI线程解析载入图片。两种在子线程解析,在UI线程载入图片,就这个差别。
关于图片和ImageView,事实上有很多其它能够介绍的。比方在解析图片前获得图片的宽高。用来做图片适配。比方等比例缩小图片,以减小内存占用;比方图片旋转效果等等。
第一个问题和第二个问题:
BitmapFactory.Options options = new BitmapFactory.Options();
/*
* If set to true, the decoder will return null (no bitmap), but the
* out... fields will still be set, allowing the caller to query the
* bitmap without having to allocate the memory for its pixels.
*/
options.inJustDecodeBounds = true;
String url=Environment.getExternalStorageDirectory().getPath() +"/test.jpg";//sdcard/test.jpg
BitmapFactory.decodeFile(url,options);
int outWidth=options.outWidth;//获得图片的宽
int outHeight=options.outHeight;//获得图片的高
int width=100;//放图片组件的宽
int height=100;//放图片组件的高
double shink=outHeight*outWidth/width/height;//缩小的比例
options.inSampleSize=(int) Math.sqrt(shink);//inSampleSize设置,则缩小比例即它的平方,如2则比例为1/4。Bitmap bitmap=BitmapFactory.decodeFile(url, options);//此值就是我们所须要的值
下面是官方提供的方法:public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ?128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}第三个问题:Matrix来翻转、剪切图片之后再讲。matrix通过设置postRotate来进行翻转。不管45度还是90度Matrix matrix = new Matrix();
matrix.postRotate(45);int x=0;//The x coordinate of the first pixel in sourceint y=0;// The y coordinate of the first pixel in sourceint width=bitmap.getWidth();//The number of pixels in each rowint height=bitmap.getHeight();// The number of rows
Bitmap finalBitmap = Bitmap.createBitmap(bitmap, x, y, width ,height, matrix, true);
mImg.setImageBitmap(finalBitmap);剪切主要改变x,y,width和height,来获得对应尺寸和图形的Bitmapmatrix.postRotate的结果例如以下图matrix.postScale(1,-1);倒立的结果例如以下图第四个问题:Bitmap.Config几种类型间的差别
A:alpha R:red G:green B:blue
ARGB_8888 32位,8byte每一个像素 透明度为8
ARGB_4444 16位。4byte每一个像素 透明度为4
ALPHA_8 8位,1byte每一个像素 透明度为8 没有颜色
RGB_565 16位,2byte每一个像素 无透明度
第五个问题:canvas绘图
clipRect:要求画制的区域,有left、right、top、bottom4个參数(相对父布局而言,scrollTo同理)
drawArc:画弧线
drawRect:画长方形
drawCircle:画圆
drawLine:画线
通过clipRect等对画布进行设置,能够有效防止在看不见的时候还绘制UI。降低图片渲染的次数
src设置图片内容。不会拉伸,能够通过设置alpha来显示透明度;使用scaleType来对其缩放。比方设置crop_start,则须要在配置文件写fit_xy保证图片宽和高被正确计算,在代码中设置crop_start才有效
background设置图片背景,会拉伸
adjustViewBounds用来设置图片大小,又想设置宽高比的场景
本文来自http://blog.csdn.net/liuxian13183/ 。引用必须注明出处。
写完上一篇后。总认为介绍的知识点不多,仅仅是一种在UI线程解析载入图片,两种在子线程解析。在UI线程载入图片,就这个差别。
关于图片和ImageView。事实上有很多其它能够介绍的,比方在解析图片前获得图片的宽高,用来做图片适配;比方等比例缩小图片,以减小内存占用;比方图片旋转效果等等。
第一个问题和第二个问题:
BitmapFactory.Options options = new BitmapFactory.Options();
/*
* If set to true, the decoder will return null (no bitmap), but the
* out... fields will still be set, allowing the caller to query the
* bitmap without having to allocate the memory for its pixels.
*/
options.inJustDecodeBounds = true;
String url=Environment.getExternalStorageDirectory().getPath() +"/test.jpg";//sdcard/test.jpg
BitmapFactory.decodeFile(url,options);
int outWidth=options.outWidth;//获得图片的宽
int outHeight=options.outHeight;//获得图片的高
int width=100;//放图片组件的宽
int height=100;//放图片组件的高
double shink=outHeight*outWidth/width/height;//缩小的比例
options.inSampleSize=(int) Math.sqrt(shink);//inSampleSize设置。则缩小比例即它的平方,如2则比例为1/4。Bitmap bitmap=BitmapFactory.decodeFile(url, options);//此值就是我们所须要的值
下面是官方提供的方法:public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ?1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ?128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}第三个问题:Matrix来翻转、剪切图片之后再讲。matrix通过设置postRotate来进行翻转,不管45度还是90度Matrix matrix = new Matrix();
matrix.postRotate(45);int x=0;//The x coordinate of the first pixel in sourceint y=0;// The y coordinate of the first pixel in sourceint width=bitmap.getWidth();//The number of pixels in each rowint height=bitmap.getHeight();// The number of rows
Bitmap finalBitmap = Bitmap.createBitmap(bitmap, x, y, width ,height, matrix, true);
mImg.setImageBitmap(finalBitmap);剪切主要改变x,y,width和height。来获得对应尺寸和图形的Bitmapmatrix.postRotate的结果例如以下图matrix.postScale(1,-1);倒立的结果例如以下图第四个问题:Bitmap.Config几种类型间的差别
A:alpha R:red G:green B:blue
ARGB_8888 32位,8byte每一个像素 透明度为8
ARGB_4444 16位。4byte每一个像素 透明度为4
ALPHA_8 8位,1byte每一个像素 透明度为8 没有颜色
RGB_565 16位,2byte每一个像素 无透明度
第五个问题:canvas绘图
clipRect:要求画制的区域,有left、right、top、bottom4个參数
drawArc:画弧线
drawRect:画长方形
drawCircle:画圆
drawLine:画线
本文来自http://blog.csdn.net/liuxian13183/ 。引用必须注明出处!
写完上一篇后,总认为介绍的知识点不多,仅仅是一种在UI线程解析载入图片,两种在子线程解析,在UI线程载入图片,就这个差别。
关于图片和ImageView,事实上有很多其它能够介绍的,比方在解析图片前获得图片的宽高,用来做图片适配。比方等比例缩小图片,以减小内存占用;比方图片旋转效果等等。
第一个问题和第二个问题:
BitmapFactory.Options options = new BitmapFactory.Options();
/*
* If set to true, the decoder will return null (no bitmap), but the
* out... fields will still be set, allowing the caller to query the
* bitmap without having to allocate the memory for its pixels.
*/
options.inJustDecodeBounds = true;
String url=Environment.getExternalStorageDirectory().getPath() +"/test.jpg";//sdcard/test.jpg
BitmapFactory.decodeFile(url,options);
int outWidth=options.outWidth;//获得图片的宽
int outHeight=options.outHeight;//获得图片的高
int width=100;//放图片组件的宽
int height=100;//放图片组件的高
double shink=outHeight*outWidth/width/height;//缩小的比例
options.inSampleSize=(int) Math.sqrt(shink);//inSampleSize设置。则缩小比例即它的平方。如2则比例为1/4。Bitmap bitmap=BitmapFactory.decodeFile(url, options);//此值就是我们所须要的值
下面是官方提供的方法:public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}第三个问题:Matrix来翻转、剪切图片之后再讲。matrix通过设置postRotate来进行翻转,不管45度还是90度Matrix matrix = new Matrix();
matrix.postRotate(45);int x=0;//The x coordinate of the first pixel in sourceint y=0;// The y coordinate of the first pixel in sourceint width=bitmap.getWidth();//The number of pixels in each rowint height=bitmap.getHeight();// The number of rows
Bitmap finalBitmap = Bitmap.createBitmap(bitmap, x, y, width ,height, matrix, true);
mImg.setImageBitmap(finalBitmap);剪切主要改变x,y,width和height。来获得对应尺寸和图形的Bitmapmatrix.postRotate的结果例如以下图matrix.postScale(1,-1);倒立的结果例如以下图第四个问题:Bitmap.Config几种类型间的差别
A:alpha R:red G:green B:blue
ARGB_8888 32位,8byte每一个像素 透明度为8
ARGB_4444 16位,4byte每一个像素 透明度为4
ALPHA_8 8位,1byte每一个像素 透明度为8 没有颜色
RGB_565 16位。2byte每一个像素 无透明度
第五个问题:canvas绘图
clipRect:要求画制的区域,有left、right、top、bottom4个參数
drawArc:画弧线
drawRect:画长方形
drawCircle:画圆
drawLine:画线
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处!
写完上一篇后,总认为介绍的知识点不多,仅仅是一种在UI线程解析载入图片,两种在子线程解析。在UI线程载入图片,就这个差别。
关于图片和ImageView,事实上有很多其它能够介绍的,比方在解析图片前获得图片的宽高,用来做图片适配。比方等比例缩小图片,以减小内存占用;比方图片旋转效果等等。
第一个问题和第二个问题:
BitmapFactory.Options options = new BitmapFactory.Options();
/*
* If set to true, the decoder will return null (no bitmap), but the
* out... fields will still be set, allowing the caller to query the
* bitmap without having to allocate the memory for its pixels.
*/
options.inJustDecodeBounds = true;
String url=Environment.getExternalStorageDirectory().getPath() +"/test.jpg";//sdcard/test.jpg
BitmapFactory.decodeFile(url,options);
int outWidth=options.outWidth;//获得图片的宽
int outHeight=options.outHeight;//获得图片的高
int width=100;//放图片组件的宽
int height=100;//放图片组件的高
double shink=outHeight*outWidth/width/height;//缩小的比例
options.inSampleSize=(int) Math.sqrt(shink);//inSampleSize设置,则缩小比例即它的平方,如2则比例为1/4。Bitmap bitmap=BitmapFactory.decodeFile(url, options);//此值就是我们所须要的值
下面是官方提供的方法:public static int computeSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
int initialSize = computeInitialSampleSize(options, minSideLength, maxNumOfPixels);
int roundedSize;
if (initialSize <= 8) {
roundedSize = 1;
while (roundedSize < initialSize) {
roundedSize <<= 1;
}
} else {
roundedSize = (initialSize + 7) / 8 * 8;
}
return roundedSize;
}private static int computeInitialSampleSize(BitmapFactory.Options options, int minSideLength, int maxNumOfPixels) {
double w = options.outWidth;
double h = options.outHeight;
int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math.sqrt(w * h / maxNumOfPixels));
int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(Math.floor(w / minSideLength), Math.floor(h / minSideLength));
if (upperBound < lowerBound) {
// return the larger one when there is no overlapping zone.
return lowerBound;
}
if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
return 1;
} else if (minSideLength == -1) {
return lowerBound;
} else {
return upperBound;
}
}第三个问题:Matrix来翻转、剪切图片之后再讲。matrix通过设置postRotate来进行翻转,不管45度还是90度Matrix matrix = new Matrix();
matrix.postRotate(45);int x=0;//The x coordinate of the first pixel in sourceint y=0;// The y coordinate of the first pixel in sourceint width=bitmap.getWidth();//The number of pixels in each rowint height=bitmap.getHeight();// The number of rows
Bitmap finalBitmap = Bitmap.createBitmap(bitmap, x, y, width ,height, matrix, true);
mImg.setImageBitmap(finalBitmap);剪切主要改变x,y,width和height,来获得对应尺寸和图形的Bitmapmatrix.postRotate的结果例如以下图matrix.postScale(1,-1);倒立的结果例如以下图第四个问题:Bitmap.Config几种类型间的差别
A:alpha R:red G:green B:blue
ARGB_8888 32位,8byte每一个像素 透明度为8
ARGB_4444 16位,4byte每一个像素 透明度为4
ALPHA_8 8位,1byte每一个像素 透明度为8 没有颜色
RGB_565 16位,2byte每一个像素 无透明度
第五个问题:canvas绘图
clipRect:要求画制的区域。有left、right、top、bottom4个參数
drawArc:画弧线
drawRect:画长方形
drawCircle:画圆
drawLine:画线
Android ImageView设置图片原理(下)的更多相关文章
- Android ImageView设置图片原理(上)
本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 首先关于图片加载到ImageView上,我们来讨论几个问题: 如下: imageView.setIm ...
- Android开发模板代码(二)——为ImageView设置图片,退出后能保存ImageView的状态
接着之前的那个从图库选择图片,设置到ImageView中去,但是,我发现了一个问题,就是再次进入的时候ImageView是恢复到了默认状态,搜索了资料许久之后,终于是发现了解决方法,使用SharePr ...
- Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件
ImageView设置图片 JavaFx的ImageView,设置图片不能直接通过属性设置,只能通过代码来设置 ImageView设置图片 首先,我们让fxml对应的那个controller的java ...
- Android -- ImageView(控制图片的大小以及旋转的角度)
1.
- Android Studio设置图片背景及主题设置
因为Android Studio是基于IDEA的,所以IDEA里面能用的插件Android Studio也能用,这次图片背景是依赖IDEA下的一个插件,名为BackgroundImage的插件,用户可 ...
- Android教程:ImageView 设置图片
Android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setImag ...
- ImageView 设置图片
android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setIm ...
- ImageView 设置图片来自:http://blog.csdn.net/lincyang/article/details/6562163
android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setImag ...
- Android ImageView 替换图片
网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...
随机推荐
- Monitor (synchronization)条件变量-安全对象
In concurrent programming, a monitor is a synchronization construct that allows threads to have both ...
- SP10628 COT - Count on a tree 主席树
Code: #include<cstdio> #include<cstring> #include<algorithm> #include<string> ...
- js的onclick和jq的click以及on和bind的区别
onclick和click,只能静态绑定点击事件:bind的可以一次绑定多个事件(click/onmouseover等):on可以动态的绑定事件,当页面加载完成调用on即可
- URL正则
现有需求 表单填写域名只能填写 baseURL 或者 baseURL+端口 不带协议 否则为不合法 String url1 = ".com:90"; String url2 = & ...
- C语言数组和指针是不同的
有一个这样的错误: 在一个文件中定义:int mango[100]; 在另一个文件中声明:extern int *mango; 将会产生错误 定义和声明的区别: 在C中,任何对象都有且只有一个定义 ...
- BNUOJ 34990 Justice String
Justice String Time Limit: 2000ms Memory Limit: 65536KB 64-bit integer IO format: %lld Java cla ...
- Java实现斐波那契数列Fibonacci
import java.util.Scanner; public class Fibonacci { public static void main(String[] args) { // TODO ...
- cpc,a wonderful concert
做完这道题突然就感觉自己脑子是不是已经秀逗了,tle到死后才想起来找规律, 就是求排列数的题目,按插入点对状态进行分类,可以暴力tle... #include<iostream> #inc ...
- tp5实现多数据库查询
引言: 有时候一个管理后台,需要涉及到多个数据库.比如,商城管理.直播管理.消息管理等等,它们都有自己的数据库.这个时候,就需要去连接多个数据库,进行处理了.thinkphp可以支持多个数据库连接. ...
- vue --- 路由传参的几种方式
方案一: getDescribe(id) { // 直接调用$router.push 实现携带参数的跳转 this.$router.push({ path: `/describe/${id}`, }) ...