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
    这里写图片描述
    本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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值