ImageView实现适屏和裁剪图片的功能

来源:互联网 发布:偏爱说唱—网络歌手 编辑:程序博客网 时间:2024/05/14 18:15

在Android中,要将一张图片显示在屏幕上,需要创建一个显示图片的对象,该对象就是ImageView。

1.ImageView常用属性

  要对图片进行适屏裁剪操作,首先需要了解ImageView的常用属性。

  ImageView的常用属性如图1所示。

 

\

   其中,android:adjustViewBounds[boolean]属性的作用是设置为true时,可以调整图片的边界。android:src(int)属性用于加载图片资源。android:scaleType(ImageView.ScaleType)属性的作用是设置图片以何种方式(类型)匹配ImageView控件,其可选设置项有matrix、fitXY、fitStart、fitCenter、fitEnd、center、centerCrop、centerInside,这些设置值的不同之处如图2所示。

\

2 ScaleType属性值

 

2.ImageView的适屏与裁剪

  适屏是指将图片以合适的大小显示在手机的屏幕上。如果图片的大小不符合手机屏幕的显示要求,那么就需要对图片进行适当的裁剪,以满足显示需求。

  在对图片进行适屏显示和裁剪之间,我们首先需要做的是从手机的图库中获取图片资源。

2.1获取手机的图片库

  在Android中,如何来获取手机里的图片资源呢?其实很简单,只需要通过如下方法就可以很方便的打开手机的图片库了。

Intent intent = new Intent(Intent.ACTION_PICK, android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);

  我们知道在Android中,Intent负责对应用中一次操作的动作、动作涉及数据及附加数据进行描述,Android则根据此Intent的描述,负责找到对应的组件,将 Intent传递给调用的组件,并完成组件的调用。

  所以此处通过intent.ACTION_PICK(拾取)来完成对手机中的图片库的调用。

  打开手机的图片库后,我们便可以从图片库中选择所需图片,进行图片适屏显示或裁剪了。

2.2适屏的实现

  很显然,要将图片以合适的尺寸显示在手机屏幕上,我们首先需要知道手机屏幕的大小。我们可以通过以下两个函数方法来获得手机屏幕的长和宽。

int dw = getWindowManager().getDefaultDisplay().getWidth();//获得手机屏幕的宽度

int dh = getWindowManager().getDefaultDisplay().getHeight();//获得手机屏幕的高度

  获得手机屏幕的长宽值之后,我们便可以以此来对图片的宽度和高度进行适屏匹配了,具体方法如下:

\View Code
 1         //对图片的宽度和高度进行匹配 2         //如果大于1表示图片的高度大于手机屏幕的高度 3         int hRatio = (int)Math.ceil(factory.outHeight / (float)dh); 4                      5         //如果大于1表示图片的宽度大于手机屏幕的宽度 6         int wRatio = (int)Math.ceil(factory.outWidth / (float)dw);                 7                      8         if (hRatio > 1 || wRatio > 1) {                                  //需要进行适屏操作 9             if (hRatio > wRatio) {                                             //图片高度大于宽度10                     factory.inSampleSize = hRatio;                    //以高度为准11             } else {                                                                            //图片高度小于宽度12                     factory.inSampleSize = wRatio;                   //以宽度为准13                 }14         }      

2.3裁剪的实现

  如果图片的尺寸不符合我们需求,就需要对图片进行裁剪操作。在裁剪之前,我们需要设置图片的裁剪规格,具体做法如下:

\View Code
 1     //设置裁剪图片的规格 2     public Intent getImageClipIntent() { 3         Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null); 4         //实现对图片的裁剪,必须设置图片的属性 5         intent.setType("image/*");                    //获取任意类型的图片 6         intent.putExtra("crop", "true");           //滑动选中图片区域 7         intent.putExtra("aspectX", 1);               //表示剪切框的比例为1:1 8         intent.putExtra("aspectY", 1);  9         intent.putExtra("outputX", 80);           //指定输出图片的大小10         intent.putExtra("outputY", 80);11         intent.putExtra("return-data", true);12         return intent;13     }

  首先,我们通过intent.ACTION_GET_CONTENT(获取内容)来取出图片内容。然后通过intent.setType("image/*")函数方法设置获取图片的类型为任意类型的图片。通过intent.putExtra("crop", "true")函数方法指以滑动形式来选中图片区域。通过intent.putExtra("aspectX", 1)和intent.putExtra("aspectY", 1)函数方法设置了剪切框的比例为1:1。最后通过intent.putExtra("outputX", 80)和intent.putExtra("outputY", 80)函数方法指定了裁剪后的输出图片大小为80*80。 ;

2.4模拟器中加载图片

  为了验证实验效果如何,我们需要在虚拟器上进行简单验证。如果我们的虚拟器中没有图片,我们可以通过豌豆荚或91助手将图片导入到我们的虚拟器的图片库中。

  如何将图片导入到模拟器中,这里就不细述了。不过,有一点需要注意,豌豆荚好像不支持2.2的SDK(不知道是不是真的,观点来自于博文http://blog.it.sohu.com/appreview/2010/06/24/51/),反正我折腾了好久都没成功,最后只好使用91助手轻松搞定。


ImageView实现图片适应屏幕大小显示,和图片裁剪的功能.

实现的效果

主界面:



适应屏幕:



裁剪图片:



显示裁剪图片到ImagView:


源代码:

MainActivity.java

package com.imageview.activity;  
  1.   
  2. import java.io.FileNotFoundException;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.graphics.Bitmap;  
  6. import android.graphics.BitmapFactory;  
  7. import android.net.Uri;  
  8. import android.os.Bundle;  
  9. import android.util.Log;  
  10. import android.view.View;  
  11. import android.view.View.OnClickListener;  
  12. import android.widget.Button;  
  13. import android.widget.ImageView;  
  14. import android.widget.Toast;  
  15.   
  16. public class MainActivity extends Activity implements OnClickListener {  
  17.     private Button imageSelectBtn;  
  18.     private Button imageCutBtn;  
  19.     private ImageView imageView;  
  20.     // 声明两个静态整型变量,用于意图的返回标志  
  21.     private static final int IMAGE_SELECT = 1; // 选择图片  
  22.     private static final int IMAGE_CUT = 2; // 裁剪图片  
  23.   
  24.     @Override  
  25.     public void onCreate(Bundle savedInstanceState) {  
  26.         super.onCreate(savedInstanceState);  
  27.         setContentView(R.layout.main);  
  28.         setupViews();  
  29.     }  
  30.   
  31.     // 我的一贯作风呵呵  
  32.     public void setupViews() {  
  33.         imageSelectBtn = (Button) findViewById(R.id.imageSelectButton);  
  34.         imageSelectBtn.setOnClickListener(this);  
  35.         imageCutBtn = (Button) findViewById(R.id.imageCutButton);  
  36.         imageCutBtn.setOnClickListener(this);  
  37.         imageView = (ImageView) findViewById(R.id.imageView);  
  38.     }  
  39.   
  40.     @Override  
  41.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  42.         super.onActivityResult(requestCode, resultCode, data);  
  43.         if (resultCode == RESULT_OK) {  
  44.             // 处理图片按照手机屏幕大小显示  
  45.             if (requestCode == IMAGE_SELECT) {  
  46.                 // 获得图片的路径  
  47.                 Uri uri = data.getData();   
  48.                                // 获得屏幕宽度  
    //                WindowManager wm = this.getWindowManager();
    //                int dw = getWindowManager().getDefaultDisplay().getWidth();   
    //                // 获得屏幕宽度  
    //                int dh = getWindowManager().getDefaultDisplay().getHeight() / 2; 
                   DisplayMetrics metric = new DisplayMetrics();
                   getWindowManager().getDefaultDisplay().getMetrics(metric);
                   int dw = metric.widthPixels;     // 屏幕宽度(像素)
                   int dh = metric.heightPixels;   // 屏幕高度(像素)
  49.                 try {  
  50.                     // 实现对图片裁剪的类,是一个匿名内部类  
  51.                     BitmapFactory.Options factory = new BitmapFactory.Options();  
  52.                     // 如果设置为true,允许查询图片不是按照像素分配内存  
  53.                     factory.inJustDecodeBounds = true;  
  54.                     Bitmap bmp = BitmapFactory.decodeStream(  
  55.                             getContentResolver().openInputStream(uri), null,  
  56.                             factory);  
  57.                     // 对图片的高度和宽度对应手机屏幕进行匹配  
  58.                     // 宽度之比  
  59.                     int wRatio = (int) Math.ceil(factory.outWidth / (float) dw);   
  60.                     // 高度之比  
  61.                     int hRatio = (int) Math.ceil(factory.outHeight / (float) dh);   
  62.                     // 如果wRatio大于1,表示图片的宽度大于屏幕宽度,类似hRatio  
  63.                     if (wRatio > 1 || hRatio > 1) {  
  64.                         // inSampleSize>1则返回比原图更小的图片  
  65.                         if (hRatio > wRatio) {  
  66.                             factory.inSampleSize = hRatio;  
  67.                         } else {  
  68.                             factory.inSampleSize = wRatio;  
  69.                         }  
  70.                     }  
  71.                     // 该属性为false则允许调用者查询图片无需为像素分配内存  
  72.                     factory.inJustDecodeBounds = false;  
  73.                     // 再次使用BitmapFactory对象图像进行适屏操作  
  74.                     bmp = BitmapFactory.decodeStream(getContentResolver()  
  75.                             .openInputStream(uri), null, factory);  
  76.                     imageView.setImageBitmap(bmp);  
  77.                 } catch (FileNotFoundException e) {  
  78.                     e.printStackTrace();  
  79.                 }  
  80.             } else if (requestCode == IMAGE_CUT) { // 裁剪图片  
  81.                 // 一定要和"return-data"返回的标签"data"一致  
  82.                 Bitmap bmp = data.getParcelableExtra("data");   
  83.                 imageView.setImageBitmap(bmp);  
  84.             }  
  85.         }  
  86.     }  
  87.   
  88.     @Override  
  89.     public void onClick(View v) {  
  90.         switch (v.getId()) {  
  91.         case R.id.imageSelectButton:  
  92.             // 如何提取手机的图片,并且进行图片的选择  
  93.             Intent intent = new Intent(  
  94.                     Intent.ACTION_PICK,  
  95.                     android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);  
  96.             startActivityForResult(intent, IMAGE_SELECT);  
  97.             break;  
  98.         case R.id.imageCutButton:  
  99.             Intent intent2 = getImageClipIntent();  
  100.             startActivityForResult(intent2, IMAGE_CUT);  
  101.             break;  
  102.         default:  
  103.             break;  
  104.         }  
  105.     }  
  106.   
  107.     // 获取裁剪图片意图的方法  
  108.     private Intent getImageClipIntent() {  
  109.         Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);  
  110.         // 实现对图片的裁剪,必须要设置图片的属性和大小  
  111.         intent.setType("image/*"); // 设置属性,表示获取任意类型的图片  
  112.         intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true"  
  113.         intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果  
  114.         intent.putExtra("aspectY", 1);  
  115.         intent.putExtra("outputX", 80);  
  116.         intent.putExtra("outputY", 80);  
  117.         intent.putExtra("return-data", true);  
  118.         return intent;  
  119.     }  
  120. }  


布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>  
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical" >  
  5.   
  6.     <Button   
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="wrap_content"  
  9.         android:text="选择图片"  
  10.         android:id="@+id/imageSelectButton"/>  
  11.     <Button   
  12.         android:layout_width="fill_parent"  
  13.         android:layout_height="wrap_content"  
  14.         android:text="选择图片进行裁剪"  
  15.         android:id="@+id/imageCutButton"/>  
  16.     <!-- 用于显示裁剪后的图片 -->  
  17.     <ImageView   
  18.         android:layout_width="wrap_content"  
  19.         android:layout_height="wrap_content"  
  20.         android:id="@+id/imageView"/>  
  21.   
  22. </LinearLayout>  
0 0