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();//获得手机屏幕的高度
获得手机屏幕的长宽值之后,我们便可以以此来对图片的宽度和高度进行适屏匹配了,具体方法如下:
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裁剪的实现
如果图片的尺寸不符合我们需求,就需要对图片进行裁剪操作。在裁剪之前,我们需要设置图片的裁剪规格,具体做法如下:
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助手轻松搞定。
实现的效果
主界面:
适应屏幕:
裁剪图片:
显示裁剪图片到ImagView:
源代码:
MainActivity.java
- import java.io.FileNotFoundException;
- import android.app.Activity;
- import android.content.Intent;
- import android.graphics.Bitmap;
- import android.graphics.BitmapFactory;
- import android.net.Uri;
- import android.os.Bundle;
- import android.util.Log;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.Toast;
- public class MainActivity extends Activity implements OnClickListener {
- private Button imageSelectBtn;
- private Button imageCutBtn;
- private ImageView imageView;
- // 声明两个静态整型变量,用于意图的返回标志
- private static final int IMAGE_SELECT = 1; // 选择图片
- private static final int IMAGE_CUT = 2; // 裁剪图片
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- setupViews();
- }
- // 我的一贯作风呵呵
- public void setupViews() {
- imageSelectBtn = (Button) findViewById(R.id.imageSelectButton);
- imageSelectBtn.setOnClickListener(this);
- imageCutBtn = (Button) findViewById(R.id.imageCutButton);
- imageCutBtn.setOnClickListener(this);
- imageView = (ImageView) findViewById(R.id.imageView);
- }
- @Override
- protected void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- if (resultCode == RESULT_OK) {
- // 处理图片按照手机屏幕大小显示
- if (requestCode == IMAGE_SELECT) {
- // 获得图片的路径
- Uri uri = data.getData();
- // 获得屏幕宽度
// 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; // 屏幕高度(像素) - try {
- // 实现对图片裁剪的类,是一个匿名内部类
- BitmapFactory.Options factory = new BitmapFactory.Options();
- // 如果设置为true,允许查询图片不是按照像素分配内存
- factory.inJustDecodeBounds = true;
- Bitmap bmp = BitmapFactory.decodeStream(
- getContentResolver().openInputStream(uri), null,
- factory);
- // 对图片的高度和宽度对应手机屏幕进行匹配
- // 宽度之比
- int wRatio = (int) Math.ceil(factory.outWidth / (float) dw);
- // 高度之比
- int hRatio = (int) Math.ceil(factory.outHeight / (float) dh);
- // 如果wRatio大于1,表示图片的宽度大于屏幕宽度,类似hRatio
- if (wRatio > 1 || hRatio > 1) {
- // inSampleSize>1则返回比原图更小的图片
- if (hRatio > wRatio) {
- factory.inSampleSize = hRatio;
- } else {
- factory.inSampleSize = wRatio;
- }
- }
- // 该属性为false则允许调用者查询图片无需为像素分配内存
- factory.inJustDecodeBounds = false;
- // 再次使用BitmapFactory对象图像进行适屏操作
- bmp = BitmapFactory.decodeStream(getContentResolver()
- .openInputStream(uri), null, factory);
- imageView.setImageBitmap(bmp);
- } catch (FileNotFoundException e) {
- e.printStackTrace();
- }
- } else if (requestCode == IMAGE_CUT) { // 裁剪图片
- // 一定要和"return-data"返回的标签"data"一致
- Bitmap bmp = data.getParcelableExtra("data");
- imageView.setImageBitmap(bmp);
- }
- }
- }
- @Override
- public void onClick(View v) {
- switch (v.getId()) {
- case R.id.imageSelectButton:
- // 如何提取手机的图片,并且进行图片的选择
- Intent intent = new Intent(
- Intent.ACTION_PICK,
- android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
- startActivityForResult(intent, IMAGE_SELECT);
- break;
- case R.id.imageCutButton:
- Intent intent2 = getImageClipIntent();
- startActivityForResult(intent2, IMAGE_CUT);
- break;
- default:
- break;
- }
- }
- // 获取裁剪图片意图的方法
- private Intent getImageClipIntent() {
- Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
- // 实现对图片的裁剪,必须要设置图片的属性和大小
- intent.setType("image/*"); // 设置属性,表示获取任意类型的图片
- intent.putExtra("crop", "true");// 设置可以滑动选选择区域的属性,注意这里是字符串"true"
- intent.putExtra("aspectX", 1);// 设置剪切框1:1比例的效果
- intent.putExtra("aspectY", 1);
- intent.putExtra("outputX", 80);
- intent.putExtra("outputY", 80);
- intent.putExtra("return-data", true);
- return intent;
- }
- }
布局文件main.xml
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical" >
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="选择图片"
- android:id="@+id/imageSelectButton"/>
- <Button
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="选择图片进行裁剪"
- android:id="@+id/imageCutButton"/>
- <!-- 用于显示裁剪后的图片 -->
- <ImageView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:id="@+id/imageView"/>
- </LinearLayout>
- imageView实现图片适屏和裁剪图片的功能
- ImageView实现适屏和裁剪图片的功能
- ImageView的使用,实现本地图片的适屏显示和裁剪功能。
- Android之UI学习篇七:ImageView实现适屏和裁剪图片的功能
- 【Android 开发】:UI控件之 ImageView 实现适屏和裁剪图片的功能
- ImageView实现图片裁剪和显示功能
- ImageView实现图片适屏与裁剪
- ImageView实现图片适屏与裁剪
- android困惑之UI---imageView实现对图片的选取,和裁剪功能。。。。
- ImageView和系统图片裁剪器实现设置用户头像
- Android学习笔记19:ImageView实现图片适屏与裁剪
- 安卓控件使用系列15:ImageView适屏和裁剪图片
- Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- canvas实现图片裁剪功能
- SilvetLight 实现的一个上传图片时功能动态裁剪部分区域和缩放图片的功能
- 利用PHP结合GD实现图片裁剪和缩略图功能
- iOS实现裁剪框和图片剪裁功能
- OS实现裁剪框和图片剪裁功能
- ordereddict can't import
- Shell脚本: Windows下可用源码 转换为 Linux下可用源码
- 概率dp题,掷骰子
- 30 eclipce 创建模板
- ObjectARX各个版本下载
- ImageView实现适屏和裁剪图片的功能
- BZOJ 1044: [HAOI2008]木棍分割
- HDU 4985 Little Pony and Permutation(置换)
- 关于unity android防止设备休眠
- C#多线程、跨线程、窗体同步、进度条
- Bitbucket使用说明与SourceTree的使用
- 学习Git——创建版本库(一)
- android rest
- dump service