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);
}
}