imageview开发中经常使用的功能-裁剪和适合屏幕-打开系统的图片库

1.写 布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="fill_parent"
	android:layout_height="fill_parent">
	<Button android:layout_width="fill_parent" android:id="@+id/selectImageBtn"
		android:layout_height="wrap_content" android:text="选择图片" />
	<Button android:layout_width="fill_parent" android:id="@+id/cutImageBtn"
		android:layout_height="wrap_content" android:text="选择图片进行裁剪" />
	<!-- 用于显示图片的信息 -->
	<ImageView android:id="@+id/imageview" android:layout_width="wrap_content"
		android:layout_height="wrap_content"></ImageView>
</LinearLayout>


2.写代码:

打开系统的图片库:

intent要是没有指定uri就是实现一个动作:

使用一个intent请求回传数据:

位图可以有多种转换方式(就是说有很多可以直接转换为bitmap的这样一个形式,在这里就是直接利用一个数组,将这个数组裁剪后,在返回一个数组,实际上就相当于将这个图片实现了裁剪):

其实需要说明的就是这个代码有两个监听,这是最简单的地方,也往往是最难理解的地方。因为这里是有多个按钮但是在这里使用的是一个监听,因此在这里需要判断,到底我需要执行谁的监听。在就是在启动一个intent的时候,这里也是同样的道理。都是启动一个intent去获取一个数据,然后就是根据这个intent去响应,但是到底是哪一个intent呢,我们又需要做什么响应呢,在这里我们就需要进行判断了。


package com.example.marvinedittext2;

import android.R.integer;
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.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;

public class Main extends Activity implements OnClickListener {
	/** Called when the activity is first created. */
	private Button selectImageBtn;
	private Button cutImageBtn;
	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);
		selectImageBtn = (Button) this.findViewById(R.id.selectImageBtn);
		cutImageBtn = (Button) this.findViewById(R.id.cutImageBtn);
		imageView = (ImageView) this.findViewById(R.id.imageview);
		selectImageBtn.setOnClickListener(this);
		cutImageBtn.setOnClickListener(this);
		// imageView.setImageBitmap(bm);
	}

	//这里首先拿最简单的来讲:最简单的就是直接调用另外一个activity。或者是直接调用一个页面出来,或者是只是用来传递之后然后来处理一些数据。
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		// TODO Auto-generated method stub
		super.onActivityResult(requestCode, resultCode, data);
		if (resultCode == RESULT_OK) {
			// 处理图片按照手机的屏幕大小显示
			if (requestCode == IMAGE_SELECT) {
				Uri uri = data.getData();   //获得图片的路径
				int dw = getWindowManager().getDefaultDisplay().getWidth();// 获得屏幕的宽度
				int dh = getWindowManager().getDefaultDisplay().getHeight() / 2;
				try {
					//实现对图片的裁剪的类, 是一个匿名内部类。
					BitmapFactory.Options factory = new BitmapFactory.Options();
					factory.inJustDecodeBounds = true;// 如果设置为true,允许查询图片不是按照像素分配给内存。
					Bitmap bmp = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, factory);
					
					// 对图片的宽度和高度对应手机的屏幕进行匹配。
					int hRatio = (int) Math.ceil(factory.outHeight / (float) dh);
					// 如果大于1 表示图片的高度大于手机屏幕的高度
					int wRatio = (int) Math.ceil(factory.outWidth / (float) dw);
					// 如果大于1 表示图片的宽度大于手机屏幕的宽度
					// 缩放到1/radio的尺寸和1/radio^2像素
					if (hRatio > 1 || wRatio > 1) {
						if (hRatio > wRatio) {
							factory.inSampleSize = hRatio;
						} else {
							factory.inSampleSize = wRatio;
						}
					}
					// 对
					factory.inJustDecodeBounds = false;
					// 使用BitmapFactory对图片进行适屏的操作,
					bmp = BitmapFactory.decodeStream(getContentResolver()
							.openInputStream(uri), null, factory);
					imageView.setImageBitmap(bmp);
				} catch (Exception e) {
					
				}
				// 表示裁剪图片
			} else if (requestCode == IMAGE_CUT) {
				Bitmap bitmap = data.getParcelableExtra("data");
				imageView.setImageBitmap(bitmap);
			}
		}
	}
	
	// 因为这里的类是同时在监听者多个那么就需要用组件的id来直接判断。
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.selectImageBtn:
			// 如何提取手机的图片的,并且进行选择图片的功能
			Intent intent = new Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);// 打开手机的图片库
			startActivityForResult(intent, IMAGE_SELECT);
			break;

		case R.id.cutImageBtn:
			Intent intent2 = getImageClipIntent();
			startActivityForResult(intent2, IMAGE_CUT);
			break;
		}
	}

	// 在这里只是准备好一个 intent,实际的调用就是    startActivityForResult(intent, IMAGE_SELECT)  这一段代码。
	private Intent getImageClipIntent() {
		Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);
		// 实现对图片的裁剪,必须要设置图片的属性和大小
		intent.setType("image/*");// 获取任意的图片类型
		intent.putExtra("crop", "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;
	}

}


 

3.总结:还是对监听机制不是很了解,也就是说在一个方法进行多个监听的基础上,自己首先需要进行判断,到底是谁启动的这个监听呢。这就需要作出一个判断。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值