Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> android之照相、相冊裁剪功能的實現過程

android之照相、相冊裁剪功能的實現過程

編輯:關於Android編程

今天無聊做了一些照相、相冊裁剪功能,希望可以幫到大家!

不多說了,貼代碼實際一點:

首先是XML:

 

    

然後貼一下主activity:

/**
 * @Title: PicCutDemoActivity.java
 * @Package com.xiaoma.piccut.demo
 * @Description: 圖片裁剪功能測試
 * @author XiaoMa
 */
public class PicCutDemoActivity extends Activity implements OnClickListener {

	private ImageButton ib = null;
	private ImageView iv = null;
	private Button btn = null;
	private String tp = null;
	

	/** Called when the activity is first created. */
	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		//初始化
		init();
	}
	
	/**
	 * 初始化方法實現
	 */
	private void init() {
		ib = (ImageButton) findViewById(R.id.imageButton1);
		iv = (ImageView) findViewById(R.id.imageView1);
		btn = (Button) findViewById(R.id.button1);
		ib.setOnClickListener(this);
		iv.setOnClickListener(this);
		btn.setOnClickListener(this);
	}

	
	/**
	 * 控件點擊事件實現
	 * 
	 * 因為有朋友問不同控件的背景圖裁剪怎麼實現,
	 * 我就在這個地方用了三個控件,只為了自己記錄學習
	 * 大家覺得沒用的可以跳過啦
	 */
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.imageButton1:
			ShowPickDialog();
			break;
		case R.id.imageView1:
			ShowPickDialog();
			break;
		case R.id.button1:
			ShowPickDialog();
			break;

		default:
			break;
		}
	}

	/**
	 * 選擇提示對話框
	 */
	private void ShowPickDialog() {
		new AlertDialog.Builder(this)
				.setTitle("設置頭像...")
				.setNegativeButton("相冊", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int which) {
						dialog.dismiss();
						/**
						 * 剛開始,我自己也不知道ACTION_PICK是干嘛的,後來直接看Intent源碼,
						 * 可以發現裡面很多東西,Intent是個很強大的東西,大家一定仔細閱讀下
						 */
						Intent intent = new Intent(Intent.ACTION_PICK, null);
						
						/**
						 * 下面這句話,與其它方式寫是一樣的效果,如果:
						 * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
						 * intent.setType(""image/*");設置數據類型
						 * 如果朋友們要限制上傳到服務器的圖片類型時可以直接寫如:"image/jpeg 、 image/png等的類型"
						 *
						 */
						intent.setDataAndType(
								MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
								"image/*");
						startActivityForResult(intent, 1);

					}
				})
				.setPositiveButton("拍照", new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
						dialog.dismiss();
						/**
						 * 下面這句還是老樣子,調用快速拍照功能,至於為什麼叫快速拍照,大家可以參考如下官方
						 * 文檔,you_sdk_path/docs/guide/topics/media/camera.html
						 * 
						 */
						Intent intent = new Intent(
								MediaStore.ACTION_IMAGE_CAPTURE);
						//下面這句指定調用相機拍照後的照片存儲的路徑
						intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri
								.fromFile(new File(Environment
										.getExternalStorageDirectory(),
										"xiaoma.jpg")));
						startActivityForResult(intent, 2);
					}
				}).show();
	}

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		switch (requestCode) {
		// 如果是直接從相冊獲取
		case 1:
			startPhotoZoom(data.getData());
			break;
		// 如果是調用相機拍照時
		case 2:
			File temp = new File(Environment.getExternalStorageDirectory()
					+ "/xiaoma.jpg");
			startPhotoZoom(Uri.fromFile(temp));
			break;
		// 取得裁剪後的圖片
		case 3:
			/**
			 * 非空判斷大家一定要驗證,如果不驗證的話,
			 * 在剪裁之後如果發現不滿意,要重新裁剪,丟棄
			 
			 */
			if(data != null){
				setPicToView(data);
			}
			break;
		default:
			break;

		}
		super.onActivityResult(requestCode, resultCode, data);
	}
	
	/**
	 * 裁剪圖片方法實現
	 * @param uri
	 */
	public void startPhotoZoom(Uri uri) {
		/*
		 * 至於下面這個Intent的ACTION是怎麼知道的,大家可以看下自己路徑下的如下網頁
		 * yourself_sdk_path/docs/reference/android/content/Intent.html
		 
		 */
		Intent intent = new Intent("com.android.camera.action.CROP");
		intent.setDataAndType(uri, "image/*");
		//下面這個crop=true是設置在開啟的Intent中設置顯示的VIEW可裁剪
		intent.putExtra("crop", "true");
		// aspectX aspectY 是寬高的比例
		intent.putExtra("aspectX", 1);
		intent.putExtra("aspectY", 1);
		// outputX outputY 是裁剪圖片寬高
		intent.putExtra("outputX", 150);
		intent.putExtra("outputY", 150);
		intent.putExtra("return-data", true);
		startActivityForResult(intent, 3);
	}
	
	/**
	 * 保存裁剪之後的圖片數據
	 * @param picdata
	 */
	private void setPicToView(Intent picdata) {
		Bundle extras = picdata.getExtras();
		if (extras != null) {
			Bitmap photo = extras.getParcelable("data");
			Drawable drawable = new BitmapDrawable(photo);
			
			/**
			 * 下面注釋的方法是將裁剪之後的圖片以Base64Coder的字符方式上
			 * 傳到服務器,QQ頭像上傳采用的方法跟這個類似
			 */
			
			/*ByteArrayOutputStream stream = new ByteArrayOutputStream();
			photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);
			byte[] b = stream.toByteArray();
			// 將圖片流以字符串形式存儲下來
			
			tp = new String(Base64Coder.encodeLines(b));
			這個地方大家可以寫下給服務器上傳圖片的實現,直接把tp直接上傳就可以了,
			服務器處理的方法是服務器那邊的事了,吼吼
			
			如果下載到的服務器的數據還是以Base64Coder的形式的話,可以用以下方式轉換
			為我們可以用的圖片類型就OK啦...吼吼
			Bitmap dBitmap = BitmapFactory.decodeFile(tp);
			Drawable drawable = new BitmapDrawable(dBitmap);
			*/
			ib.setBackgroundDrawable(drawable);
			iv.setBackgroundDrawable(drawable);
		}
	}


主要代碼已貼完畢!

試試吧

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved