Android ImageView 的scaleType属性详解(一)

首先扯点别的:

昨天晚上怕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
    Android ImageView 的scaleType属性详解(一)_第1张图片
    本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:

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

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

小图片效果
Android ImageView 的scaleType属性详解(一)_第2张图片

大图片效果,先看看原图娱乐一下
Android ImageView 的scaleType属性详解(一)_第3张图片

然后把她放进ImageView,效果如下
Android ImageView 的scaleType属性详解(一)_第4张图片

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

大图片的效果

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

大图片
Android ImageView 的scaleType属性详解(一)_第6张图片

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

小图怡情
Android ImageView 的scaleType属性详解(一)_第7张图片

大图就不咋的了
Android ImageView 的scaleType属性详解(一)_第8张图片
Android ImageView 的scaleType属性详解(一)_第9张图片
- 这就是前四种效果了,接下来贴一下代码吧。注意加载图片的时候不要出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中缩放类型和效果图下篇再说。

你可能感兴趣的:(imageview,ScaleType)