详解ImageView的CENTER_CROP,CENTER_INSIDE,FIT_CENTER等属性

简介: 探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制Android多...

探索Android软键盘的疑难杂症
深入探讨Android异步精髓Handler
详解Android主流框架不可或缺的基石
站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础
Android多分辨率适配框架(2)— 原理剖析
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View
自定义View系列教程01–常用工具介绍
自定义View系列教程02–onMeasure源码详尽分析
自定义View系列教程03–onLayout源码详尽分析
自定义View系列教程04–Draw源码分析及其实践
自定义View系列教程05–示例分析
自定义View系列教程06–详解View的Touch事件处理
自定义View系列教程07–详解ViewGroup分发Touch事件
自定义View系列教程08–滑动冲突的产生及其处理


package cc.testscaletype;

import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
/**
 * Demo描述:
 * 
 * 详解ImageView的CENTER_CROP,CENTER_INSIDE,FIT_CENTER等属性
 * 
 * 
 * 
 * Demo说明:
 * 
 * 1 准备三张大小不一的图片
 *   logo----->360*360
 *   dogs----->1024*682
 *   bdog----->1920*1080
 *   
 * 2 在布局文件中设置ImageView的大小为750px
 * 
 * 3 为了便于对比理解,依次测试ImageView的各个属性
 * 
 * 
 * 
 * 原创作者:
 * 谷哥的小弟
 * http://blog.csdn.net/lfdfhl
 *
 */

public class MainActivity extends Activity {
    private ImageView mImageView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mImageView = (ImageView) findViewById(R.id.iamgeView);
        int logo_id=R.drawable.logo;
        int dogs_id=R.drawable.dogs;
        int bdog_id=R.drawable.bdog;


        //testCenter(logo_id);
        //testCenter(dogs_id);
        //testCenter(bdog_id);


        //testCenterCrop(logo_id);
        //testCenterCrop(dogs_id);
        //testCenterCrop(bdog_id);


        //testCenterInside(logo_id);
        //testCenterInside(dogs_id);
        //testCenterInside(bdog_id);


        testFitCenter(logo_id);
        //testFitCenter(dogs_id);
        //testFitCenter(bdog_id);


        //testFitEnd(logo_id);
        //testFitEnd(dogs_id);
        //testFitEnd(bdog_id);


        //testFitStart(logo_id);
        //testFitStart(dogs_id);
        //testFitStart(bdog_id);


        //testFitXY(logo_id);
        //testFitXY(dogs_id);
        //testFitXY(bdog_id);
    }

    /**
     * 测试CENTER属性
     * 
     * 将图片显示在ImageView的中心点,不执行任何缩放
     * 
     * 1.1 若图片宽和高均小于ImageView控件的宽高,则图片显示在ImageView正中间
     * 1.2 若图片宽或高大于ImageView控件的宽或高,则图片不会完整地显示
     *    
     * 即在此属性作用下:
     * 如果图片宽高均小于图片宽高,那么图片可以在ImageView中间完整地以原大小显示
     * 如果图片的宽或者高大于ImageView大小,图片不可完整显示
     * 
     */
    private void testCenter(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.CENTER);
        mImageView.setImageResource(resourceID);
    }

    /**
     * 测试CENTER_CROP属性
     * 
     * 将图片放在ImageView的中心点,然后对图片进行等比例缩放
     * 
     * 官方文档描述:
     * Scale the image uniformly (maintain the image's aspect ratio) so that 
     * both dimensions (width and height) of the image will be equal to or larger 
     * than the corresponding dimension of the view (minus padding). 
     * 这段文字值得好好体会一下。
     * 简而言之:
     * 等比例缩放图片使得图片的宽和高均不小于控件对应的宽高
     * 
     * 1.1 若图片宽和高均小于ImageView控件的宽高,则等比例放大图片,直至铺满ImageView.
     *     当然这种情况下的等比例放大,就可能导致图片X或Y方向的图片显示不全
     * 1.2 若图片宽或高小于ImageView控件的宽或高,则将图片等比例放大直到铺满ImageView
     *     比如ImageView为750*750,图片为600*800,所以会等比例放大图片,直至图片宽度变为
     *     750.但是这样会造成图片的高度大于了ImageView的高,所以图片的垂直方向显示不全,会被剪裁
     * 1.3 如图片宽和高均大于ImageView控件的宽和高
     *     此时等比例缩小图片,当图片的宽高中任意一值等于控件对应的宽高时停止缩小图片。
     *     在这种情况下就很可能造成:图片显示不完整
     * 
     * 所以CENTER_CROP属性的显著特点:
     * 图片会铺满整个ImageView,但图片可能显示不完整
     * 
     */
    private void testCenterCrop(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.CENTER_CROP);
        mImageView.setImageResource(resourceID);
    }


    /**
     * 测试CENTER_INSIDE属性
     * 
     * 将图片放在ImageView的中心点,然后对图片进行等比例缩放
     * 
     * 官方文档:
     * Scale the image uniformly (maintain the image's aspect ratio) so that 
     * both dimensions (width and height) of the image will be equal to or less 
     * than the corresponding dimension of the view (minus padding). 
     * 
     * 简而言之:
     * 等比例缩放图片使得图片的宽和高均不大于控件对应的宽高
     * 
     * 1.1 若图片宽和高均小于ImageView控件的宽高,则将图片放在ImageView中间。
     *     此情况下,图片的四周可见ImageView的背景色
     * 1.2 若图片宽或高大于ImageView控件的宽或高,则将图片等比例缩小直到ImageView可以完整显示该图片
     *    此情况下,图片的上下或者左右可见ImageView的背景色
     * 1.3 如图片宽和高均大于ImageView控件的宽和高
     *     此情况下,等比例缩小图片使得图片的宽和高均不大于控件的宽高。
     *     所以,这也很容易导致图片的上下或者左右可见ImageView的背景色
     * 
     * 至此,可见CENTER_INSIDE属性的特点
     * 1 始终会完全显示整张图片
     * 2 很可能导致ImageView控件留白,即露出背景色
     * 
     * 
     * 到这就可以明显看出CENTER_CROP和CENTER_INSIDE的区别:
     * 1 CENTER_CROP   要求图片的宽高均不小于控件宽高
     * 2 CENTER_INSIDE 要求图片的宽高均不大于控件宽高
     * 
     */
    private void testCenterInside(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.CENTER_INSIDE);
        mImageView.setImageResource(resourceID);
    }

    /**
     * 测试FIT_CENTER属性
     * 
     * 将图片放在ImageView的中心点,然后对图片进行等比例缩放
     * 
     * 官方文档:
     * Scale the image using CENTER.
     * CENTER: 
     * Compute a scale that will maintain the original src aspect ratio, 
     * but will also ensure that src fits entirely inside dst. 
     * At least one axis (X or Y) will fit exactly. The result is centered inside dst.
     * 
     * 在理解了CENTER_CROP和CENTER_INSIDE之后再看FIT_CENTER就会好理解一些
     * 
     * 将图片放在ImageView的中心点,对图片进行等比例缩放从而完整地显示图片
     * 
     * 
     * 
     * 1.1 若图片宽和高均小于ImageView控件的宽高,则等比例放大图片
     *     直到图片的宽高中任意一值等于控件的宽或者高
     *     此情况下,图片的上下或者左右可见ImageView的背景色
     *     
     *    
     * 1.2  若图片宽和高均大于ImageView控件的宽和高,则等比例缩小图片
     *     直到图片的宽高中任意一值等于控件的宽或者高
     *     所以,这也很容易导致图片的上下或者左右可见ImageView的背景色
     *     
     * 1.3  若图片宽或高大于ImageView控件的宽或高
     *     这时候是该执行放大呢?还是缩小呢?
     *     其实,此时是有一个原则的:完整地显示图片。
     *     就像文档中所说:ensure that src fits entirely inside dst
     *     所以,此时会对图片进行缩放,直到图片的宽高均不大于控件的宽高
     *    
     * 
     * 所以,在使用FIT_CENTER时可以完整地显示图片,而且它有一个显著的特点:
     * 它使得图片的宽高中至少有一个值恰好等于控件的宽或者高。
     * 这一点也是它和CENTER_INSIDE属性的主要区别
     * 
     * 
     * 
     */
    private void testFitCenter(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.FIT_CENTER);
        mImageView.setImageResource(resourceID);
    }


    /**
     * 测试FIT_END属性
     * 
     * FIT_END和FIT_CENTER属性非常类似
     * 差别在于,FIT_END最终会将缩放后的图片放在ImageView控件的右下角
     */
    private void testFitEnd(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.FIT_END);
        mImageView.setImageResource(resourceID);
    }

    /**
     * 测试FIT_START属性
     * 
     * FIT_START和FIT_CENTER属性非常类似
     * 差别在于,FIT_END最终会将缩放后的图片放在ImageView控件的左上角
     */
    private void testFitStart(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.FIT_START);
        mImageView.setImageResource(resourceID);
    }

    /**
     * 测试FIT_XY属性
     * 
     * 不按照比例缩放图片,从而使图片铺满整个ImageView。
     * 在此情况下虽然可以完整地显示图片,但是图片会被拉伸导致失真
     * 
     */
    private void testFitXY(int resourceID) {
        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),resourceID);
        System.out.println("---> width=" + bitmap.getWidth()+ " ,height=" + bitmap.getHeight());
        mImageView.setScaleType(ScaleType.FIT_XY);
        mImageView.setImageResource(resourceID);
    }




}
相关文章
|
12月前
|
固态存储 安全 程序员
搭建程序员个人博客网站的服务器配置怎么选?
搭建个人博客网站时,合理选择服务器配置至关重要。推荐1核CPU、2GiB内存、SSD硬盘及2M-10M带宽,适合大多数个人博客。操作系统方面,Linux更为经济高效。建议选择如阿里云等知名云服务商,同时考虑服务器的可扩展性和安全性,确保网站稳定运行与良好体验。
1269 2
|
SQL 索引 数据库
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
使用instr 函数优化替换Like条件子句提高数据检索性能
1280 0
使用instr 函数优化替换Like条件子句提高数据检索性能案例总结
|
前端开发
uni-app中使用 async + await 实现异步请求同步化
uni-app中使用 async + await 实现异步请求同步化
3701 0
uni-app中使用 async + await 实现异步请求同步化
|
NoSQL 关系型数据库 MySQL
当查询的数据来自多个数据源,有哪些好的分页策略?
当查询的数据来自多个数据源,有哪些好的分页策略?
213 9
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
782 8
|
消息中间件 Kafka 程序员
Kafka面试必备:深度解析Replica副本的作用与机制
**Kafka的Replica副本是保证数据可靠性的关键机制。每个Partition有Leader和Follower副本,Leader处理读写请求及管理同步,Follower被动同步并准备成为新Leader。从Kafka 2.4开始,Follower在完全同步时也可提供读服务,提升性能。数据一致性通过高水位机制和Leader Epoch机制保证,后者更精确地判断和恢复数据一致性,增强系统容错能力。**
426 1
|
存储 网络协议 算法
TCP协议的三次握手与四次挥手
TCP协议的三次握手与四次挥手
384 2
|
XML 前端开发 Java
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
【Android App】三维处理中三维投影OpenGL功能的讲解及实战(附源码和演示 超详细必看)
298 1
|
数据安全/隐私保护
Mac平台出现brew command not found问题解决方法
Mac平台出现brew command not found问题解决方法
2437 1
|
小程序 开发者
微信小程序使用vant组件所出现的一些问题
微信小程序使用vant组件所出现的一些问题
385 0