本文来自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 source
int y=0;// The y coordinate of the first pixel in source
int width=bitmap.getWidth();//The number of pixels in each row
int 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,来获得对应尺寸和图形的Bitmap
matrix.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 source
int y=0;// The y coordinate of the first pixel in source
int width=bitmap.getWidth();//The number of pixels in each row
int 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。来获得对应尺寸和图形的Bitmap
matrix.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 source
int y=0;// The y coordinate of the first pixel in source
int width=bitmap.getWidth();//The number of pixels in each row
int 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。来获得对应尺寸和图形的Bitmap
matrix.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 source
int y=0;// The y coordinate of the first pixel in source
int width=bitmap.getWidth();//The number of pixels in each row
int 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,来获得对应尺寸和图形的Bitmap
matrix.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设置图片原理(下)的更多相关文章

  1. Android ImageView设置图片原理(上)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 首先关于图片加载到ImageView上,我们来讨论几个问题: 如下: imageView.setIm ...

  2. Android开发模板代码(二)——为ImageView设置图片,退出后能保存ImageView的状态

    接着之前的那个从图库选择图片,设置到ImageView中去,但是,我发现了一个问题,就是再次进入的时候ImageView是恢复到了默认状态,搜索了资料许久之后,终于是发现了解决方法,使用SharePr ...

  3. Java开发桌面程序学习(七)——ImageView设置图片以及jar包读取fxml文件

    ImageView设置图片 JavaFx的ImageView,设置图片不能直接通过属性设置,只能通过代码来设置 ImageView设置图片 首先,我们让fxml对应的那个controller的java ...

  4. Android -- ImageView(控制图片的大小以及旋转的角度)

    1. 

  5. Android Studio设置图片背景及主题设置

    因为Android Studio是基于IDEA的,所以IDEA里面能用的插件Android Studio也能用,这次图片背景是依赖IDEA下的一个插件,名为BackgroundImage的插件,用户可 ...

  6. Android教程:ImageView 设置图片

    Android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setImag ...

  7. ImageView 设置图片

      android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setIm ...

  8. ImageView 设置图片来自:http://blog.csdn.net/lincyang/article/details/6562163

    android doc中是这样描述的: public void setImageResource (int resId) 这是其中的一个方法,参数resld是这样: ImageView.setImag ...

  9. Android ImageView 替换图片

    网上找了半天,找到的都是错的,都不是我想要的效果.我想要的是点击一个图片后,图片被替换. 通过一下方法可以实现:“v”是ImageView对象,“image_name”是替换后的图片资源 ((Imag ...

随机推荐

  1. php查询字符串是否存在 strpos

    /*** 查询字符是否存在于某字符串** @param $haystack 字符串* @param $needle 要查找的字符* @return bool*/function str_exists( ...

  2. ActiveMQ学习笔记(3)----JMS的可靠性机制

    1. 消息接收确认 JMS消息只有在被确认之后,才认为已经被成功的消费了,消息成功消费通常包含三个阶段:客户接收消息,客户处理消息和消息被确认. 在事务性会话中,当一个事务被提交的时候,确认自动发生. ...

  3. 虚拟机创建后该如何获取IP地址并访问互联网实用教程

    之前在做项目的时候主机IP地址.网关.DNS.子网掩码等都是公司或者对方直接给提供的,但是如果我们自己想搭建一台虚拟机或者一台集群的话,手头又没有IP地址,该肿么办呢?   白慌,这里介绍一个小技巧, ...

  4. [arc067f]yakiniku restaurants

    题意: n家饭店,m张餐票,第i家和第i+1家饭店之间的距离是$A_i$,在第i家饭店用掉第j张餐票会获得$B_{i,j}$的好感度,但是从饭店i走到饭店j会有$dis_{i,j}$的代价,可以从任意 ...

  5. NOIp模拟赛三十四(yxq供题)

    毒瘤yxq! 毒瘤yxq! 毒瘤yxq! 据yxq自己说,林导让他出题的时候要求是“代码量少”,“思维难度高”,“不涉及太复杂的算法”,而且“最好要让myh有一题做不出来”(狙击myh).于是今天的题 ...

  6. 紫书 习题 11-4 UVa 1660 (网络流拆点法)

    这道题改了两天-- 因为这道题和节点有关, 所以就用拆点法解决节点的容量问题. 节点拆成两个点, 连一条弧容量为1, 表示只能经过一次. 然后图中的弧容量无限. 然后求最小割, 即最大流, 即为答案. ...

  7. Java基础学习总结(4)——对象转型

    一.对象转型介绍 对象转型分为两种:一种叫向上转型(父类对象的引用或者叫基类对象的引用指向子类对象,这就是向上转型),另一种叫向下转型.转型的意思是:如把float类型转成int类型,把double类 ...

  8. Qt之图形(绘制漂亮的圆弧)

    简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我 ...

  9. HttpClient 图讲解明

    大家刚看这个名字一定会想问这是什么东东,在这我特意百度百科了下 HTTP 协议可能是如今 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序须要直接通过 HTTP 协议来訪 ...

  10. 怎样創建 iOS 展開式 UITableView?

    原文:http://www.appcoda.com.tw/expandable-table-view/ 译者:kmyhy(appcoda的驻站译者) 幾乎全部的 App 都會以導航的方式向用戶展示多個 ...