Android ImageView 的scaleType属性详解(一)

来源:互联网 发布:素材下载站源码 编辑:程序博客网 时间:2024/06/08 17:39

首先扯点别的:

昨天晚上怕97拳皇交流群里喊我打拳皇,都没敢上QQ,怕被虐,也是艰难啊。行,今天少扯点,直接进入正题:Android ImageView 的scaleType属性详解

  • 1 首先看看Android中的ImageView在xml文件中的用法
 <!--今天讨论的就是android:scaleType="fitCenter"--> <ImageView        android:id="@+id/imageView"        android:layout_width="150dp"        android:layout_height="150dp"        android:layout_marginTop="30dp"        android:scaleType="fitCenter"        android:background="#ff3344"/>
  • 2 scaleTyple 的取值有8种:看看Api
    这里写图片描述
    本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

  • 3 那就从头往下捋一捋(这篇文章先捋前四个,后四个在下一篇文章中再讨论)

3.1 第一个取值是CENTER(中间的意思)意思是把图片放在ImageView 的中间,不进行缩放。如果图片的宽高都小于ImageView的宽高,就直接把图片放入ImageView的中间,如果图片的宽高大于ImageView的宽高则截取图片的中间部分放进ImageView中,光说没意思看效果:

小图片效果
这里写图片描述

大图片效果,先看看原图娱乐一下
柳岩

然后把她放进ImageView,效果如下
唐突佳人啊

3.2 第二个取值是CENTER_CROP(中间剪裁)意思是:保持纵横比对图片进行缩放,因此图片会和ImageView同等大小,或者大于ImageView的尺寸。
因为缩放是根据图片的短边与ImageView对应的边长度保持一致(可能是放大或缩小,会导致图片的长等于或者大于ImageView的长边导致整个图片显示不下)。最终结果是完全填充满ImageView.还是看效果
小图片的效果
小图放大

大图片的效果
大图就显示不下,只能截取一部分

3.3第三个取值是CENTER_INSIDE (中间 里面,(废话,会英语的谁不认识这两个单词))解释是:保持纵横比对图片进行缩放,因此图片会和ImageView同等大小,或者**小于**ImageView的尺寸。直到整幅图能够居中显示在ImageView中;小于ImageView的图片不变,直接居中显示,不放大。看效果图
小图片不放大
小图片不会放大,直接显示在ImageView中

大图片
大图片能全部显示在ImageView中,但不会充满ImageView

3.4第四个取值是FIT_CENTER (适合,中间,是ImageView的默认的缩放模式)解释是:计算一个能保持图片原来面貌的的缩放比例,同时确保图片完全充满整个ImageView,如果不能保证图片整个充满ImageView的话,至少保证图片的一条边完全充满ImageView的对应的边。图片位于ImageView的中间。还是看效果,说不明白,我都蒙圈了。

小图怡情
小图的情况

大图就不咋的了
高度充满,但是宽度没有填满
宽度填满了,但是高度没有填满
- 这就是前四种效果了,接下来贴一下代码吧。注意加载图片的时候不要出OOM问题

xml文件<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:gravity="center_horizontal"    android:orientation="vertical">    <ImageView        android:id="@+id/imageView"        android:layout_width="150dp"        android:layout_height="150dp"        android:layout_marginTop="30dp"        android:scaleType="fitCenter"        android:src="@mipmap/ic_launcher"        android:background="#ff3344"/>    <Button        android:id="@+id/btnPickImg"        android:layout_width="match_parent"        android:layout_height="wrap_content"        android:text="从相册选择图片" /></LinearLayout>

java 代码

package com.imageviewdemo;import android.content.Intent;import android.database.Cursor;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.net.Uri;import android.provider.MediaStore;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.ImageView;public class MainActivity extends AppCompatActivity implements View.OnClickListener {    private Button btnPickImg;    private ImageView imageView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        btnPickImg= (Button) findViewById(R.id.btnPickImg);        btnPickImg.setOnClickListener(this);        imageView= (ImageView) findViewById(R.id.imageView);    }    @Override    public void onClick(View v) {        switch (v.getId()){            case R.id.btnPickImg:                //打开手机图库选择一张照片                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);                startActivityForResult(intent, 7);                break;            default:                break;        }    }    /**     * 选择照片后返回,将图片加载到imageView中     * @param requestCode     * @param resultCode     * @param data     */    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        if(requestCode==7&&resultCode==RESULT_OK) {            Uri uri = data.getData();            String[] filePathColumn = {MediaStore.Images.Media.DATA};            Cursor cursor = getContentResolver().query(uri, filePathColumn, null, null, null);            cursor.moveToFirst();            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);            String picturePath = cursor.getString(columnIndex);            Log.e("TAG", "picturePath:" + picturePath);            cursor.close();            imageView.setImageBitmap(decodeSampledBitmapFromFile(picturePath, imageView.getWidth(), imageView.getHeight()));            //imageView.setImageBitmap(decodeSampledBitmapFromFile(picturePath, 400, 400));        }    }    /**使用这个方法,首先你要将BitmapFactory.Options的inJustDecodeBounds属性设置为true,解析一次图片。     * 然后将BitmapFactory.Options连同期望的宽度和高度一起传递到到calculateInSampleSize方法中,     * 就可以得到合适的inSampleSize值了。之后再解析一次图片,使用新获取到的inSampleSize值,     * 并把inJustDecodeBounds设置为false,就可以得到压缩后的图片了。     * @param path     * @param reqWidth     * @param reqHeight     * @return     */    public Bitmap decodeSampledBitmapFromFile(String path, int reqWidth, int reqHeight) {        // 第一次解析将inJustDecodeBounds设置为true,来获取图片大小        final BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;        BitmapFactory.decodeFile(path, options);        // 调用上面定义的方法计算inSampleSize值        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);        // 使用获取到的inSampleSize值再次解析图片        options.inJustDecodeBounds = false;        return BitmapFactory.decodeFile(path, options);    }    /**计算压缩比     * @param options     * @param reqWidth     * @param reqHeight     * @return     */    public  int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {        // 源图片的高度和宽度        final int height = options.outHeight;        final int width = options.outWidth;        int inSampleSize = 1;        if (height > reqHeight || width > reqWidth) {            // 计算出实际宽高和目标宽高的比率            final int heightRatio = Math.round((float) height / (float) reqHeight);            final int widthRatio = Math.round((float) width / (float) reqWidth);            // 选择宽和高中最小的比率作为inSampleSize的值,这样可以保证最终图片的宽和高            // 一定都会大于等于目标的宽和高。            inSampleSize = heightRatio < widthRatio ? heightRatio : widthRatio;        }        return inSampleSize;    }}

基本就是这样了,另外4中缩放类型和效果图下篇再说。

0 0