本實例的功能是將用戶選擇的圖片裁剪后放入ImagView,布局文件是個Button和ImageView。為了圖片的正常顯示,我們在裁剪后先將裁剪好的圖片先存放到SD卡中,這樣就能在以后開啟應用的時候直接調用了。
main_activity.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <Button android:id="@+id/image_tailer_button_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerHorizontal="true" android:layout_centerVertical="true" android:text="裁剪圖片" /> <ImageView android:id="@+id/user_imageView_id" android:layout_width="300dp" android:layout_height="300dp" android:layout_above="@+id/image_tailer_button_id" android:layout_centerHorizontal="true" android:layout_marginBottom="100dp" android:src="@drawable/ic_launcher" /> </RelativeLayout>
MainActivity.java
package com.kale.imagetailor; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.drawable.BitmapDrawable; import android.net.Uri; import android.os.Bundle; import android.provider.MediaStore; 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 { private String tag = getClass().getSimpleName(); private static Uri imageUri; Button imageTailorBt; ImageView userIV; File file; FileManager fm; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewInit(); fm = new FileManager(); try { file = fm.creatSDFile("Kale Image", "userImage.jpg"); } catch (IOException e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } /** *每次開啟時判斷設置什么圖片,如果有自定義的圖片了,那么就用用戶自己的頭像 */ private void setUserImage(){ userIV.setImageResource(R.drawable.ic_launcher); //從sd卡中得到圖片資源 String filepath = fm.getFileWholePath(); Bitmap bm = BitmapFactory.decodeFile(filepath); if(bm != null){ //BtimapDrawable是Drawable的子類,最終直接使用bd對象即可。 userIV.setImageDrawable(new BitmapDrawable(bm)); } else{ userIV.setImageResource(R.drawable.ic_launcher); } } private void viewInit(){ userIV = (ImageView)findViewById(R.id.user_imageView_id); imageTailorBt = (Button)findViewById(R.id.image_tailer_button_id); imageTailorBt.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO 自動生成的方法存根 changeUserImage(); } }); } /** *改變用戶頭像的方法,這里設定一個intent交給activity去處理 */ protected void changeUserImage(){ Toast.makeText(getApplicationContext(), "更換頭像", 0).show(); imageUri = Uri.parse("file:///sdcard/temp.jpg"); Intent intent = null; 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);// 設置剪切框1:1比例的效果 intent.putExtra("outputX", 600); intent.putExtra("outputY", 600); intent.putExtra("scale", true); intent.putExtra("return-data", false); intent.putExtra(MediaStore.EXTRA_OUTPUT,imageUri); intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString()); intent.putExtra("noFaceDetection", false); // no face detection startActivityForResult(intent, 1); } /** * @param uri * @return 一個bitmap對象,用來設置圖片 */ private Bitmap decodeUriAsBitmap(Uri uri){ Bitmap bitmap = null; try { bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri)); } catch (FileNotFoundException e) { e.printStackTrace(); return null; } return bitmap; } /** * 用來設置圖片,並保持的本地 */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); //不正確的情況下 if(resultCode != Activity.RESULT_OK){ Log.e(tag, "requestCode = " + requestCode); Log.e(tag, "resultCode = " + resultCode); Log.e(tag, "data = " + data); return; } else{ Log.d(tag, "CHOOSE_A_BIG_PICTURE: data = " + data); if(imageUri != null){ Bitmap photo = decodeUriAsBitmap(imageUri); try { //保存到本地文件 File pictureFile = file; FileOutputStream fos = new FileOutputStream(pictureFile); photo.compress(Bitmap.CompressFormat.JPEG, 100, fos); fos.close(); Toast.makeText(this, "設置成功~", 0).show(); } catch (FileNotFoundException e) { e.printStackTrace(); Toast.makeText(this, "保存路徑不存在", 0).show(); } catch (IOException e) { e.printStackTrace(); Toast.makeText(this, "設置圖片失敗", 0).show(); } } } setUserImage(); } }
里面用到的將圖片存放到SD卡中的類
FileManager.java
package com.kale.imagetailor; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import android.os.Environment; /** * @tips : * <!-- 讀寫SD卡的權限 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> * @date :2014-6-30 */ public class FileManager { private String SD_PATH; private String fileName; private String dirName; public String getSD_PATH() { return SD_PATH; } public FileManager() { //得到當前外部存儲設備的目錄 SD_PATH = Environment.getExternalStorageDirectory() + "/"; } /** * 在SD卡上創建文件 * * @throws IOException */ public File creatSDFile(String dirName ,String fileName) throws IOException { this.fileName = fileName; this.dirName = dirName; File file = new File(creatSDDir(dirName), fileName); return file; } public String getFileWholePath(){ return SD_PATH + dirName + "/" + fileName; } /** * 在SD卡上創建目錄 * * @param dirName */ public File creatSDDir(String dirName) { File dir = new File(SD_PATH + dirName); dir.mkdir(); return dir; } /** * 判斷SD卡上的文件夾是否存在 */ public boolean isFileExist(String fileName ,String dirName){ File file = new File(SD_PATH +dirName+"/"+ fileName); return file.exists(); } /** * 將一個InputStream里面的數據寫入到SD卡中 */ public File saveToSdCard(String dirName,String fileName,InputStream input){ File file = null; OutputStream output = null; try{ //創建目錄 creatSDDir(dirName); //建立文件 file = creatSDFile(dirName ,fileName); output = new FileOutputStream(file); byte buffer [] = new byte[5 * 1024]; int count = 0; while((count = input.read(buffer)) != -1){ String str = new String(buffer,0,count); //str = new String(str.getBytes("iso-8859-1"),"utf-8"); System.out.println("---------File Manager----start--------"); System.out.println(str); System.out.println("---------File Manager-----end-------"); output.write(buffer); } output.flush(); } catch(Exception e){ e.printStackTrace(); } finally{ try{ output.close(); } catch(Exception e){ e.printStackTrace(); } } return file; } }