您好,登錄后才能下訂單哦!
首先在layout布局中設置按鈕和一個ImageView
<Button android:id="@+id/selectimagebtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="選擇圖片" /> <Button android:id="@+id/cutimagebtn" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="選擇圖片進行裁剪" /> <!-- 用于顯示圖片的信息 --> <ImageView android:id="@+id/imageview" android:layout_width="wrap_content" android:layout_height="wrap_content" />
在Activity上寫代碼
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private Button selectImageBtn, cutImageBtn; private ImageView imageView; // 聲明兩個靜態的整型變量,主要用于意圖的返回的標志 private static final int IMAGE_SELECT = 1;// 選擇圖片 private static final int IMAGE_CUT = 2;// 裁剪圖片 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); selectImageBtn = (Button) findViewById(R.id.selectimagebtn); cutImageBtn = (Button) findViewById(R.id.cutimagebtn); imageView = (ImageView) findViewById(R.id.imageview); // 注冊監聽事件 selectImageBtn.setOnClickListener(this); cutImageBtn.setOnClickListener(this); }
實現OnClickListener的方法,和設置裁剪圖片的方法
@Override public void onClick(View v) { switch (v.getId()) { case R.id.selectimagebtn: //如何提取手機的圖片庫,并且進行選擇圖片的功能 Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//打開手機的圖片庫 startActivityForResult(intent, IMAGE_SELECT); break; case R.id.cutimagebtn: Intent intent2 = getImageClipIntent(); startActivityForResult(intent2, IMAGE_CUT); } } private Intent getImageClipIntent() { Intent intent = new Intent(Intent.ACTION_GET_CONTENT, null);//不指定URL //實現對圖片的裁剪,必須要設置圖片的屬性和大小 intent.setType("image/*");//獲取任意的圖片類型 Set an explicit MIME data type.每個MIME類型由兩部分組成,前面是數據的大類別,例如聲音audio、圖象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; }
如果你想在Activity中得到新打開Activity關閉后返回的數據,你需要使用系統提供的startActivityForResult(Intent intent,int requestCode)方法打開新的Activity,新的Activity關閉后會向前面的Activity傳回數據,為了得到傳回的數據,你必須在前面的Activity中重寫onActivityResult(int requestCode, int resultCode,Intent data)方法
當新Activity關閉后,新Activity返回的數據通過Intent進行傳遞,Android平臺會調用前面Activity的onActivityResult()方法,把存放了返回數據的Intent作為第三個輸入參數傳入,在onActivityResult()方法中使用第三個輸入參數可以取出新Activity返回的數據。
需要返回數據或結果的,則使用startActivityForResult (Intent intent, intrequestCode)
,requestCode的值是自定義的,用于識別跳轉的目標Activity。
覆蓋onActivityResult方法
@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();//獲得圖片的路徑 Display display = getWindowManager().getDefaultDisplay(); Point point = new Point(); display.getSize(point); int width = point.x;//獲得屏幕的寬度 int height = point.y ;//屏幕高度 try { //實現對圖片的裁剪的類,是一個匿名內部類 BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; //對圖片的寬度和高度對應手機的屏幕進行匹配 Bitmap bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); //如果大于1表示圖片的高度大于手機屏幕的高度 int hRatio = (int) Math.ceil(options.outHeight / (float) height);//(int)Math.ceil是下取整 //如果大于1表示圖片的寬度大于手機屏幕的寬度 int wRatio = (int) Math.ceil(options.outWidth / (float) width); //如果hRatio或wRatio大于1,則把圖片縮放到1/radio的尺寸和1/radio^2的像素 if (hRatio > 1 || wRatio > 1) { if (hRatio > wRatio) { options.inSampleSize = hRatio; } else { options.inSampleSize = wRatio; } bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options); imageView.setImageBitmap(bitmap); }else{ //如果hRatio與wRatio為0,直接輸出 imageView.setImageBitmap(bitmap); } } catch (Exception e) { } //表示裁剪圖片 } else if (requestCode == IMAGE_CUT) { Bitmap bitmap = data.getParcelableExtra("data"); imageView.setImageBitmap(bitmap); } } }
options.inJustDecodeBounds = false/true;
我們去解析一個圖片,如果太大,就會OOM,我們可以設置壓縮比例inSampleSize,但是這個壓縮比例設置多少就是個問題,所以我們解析圖片可以分為倆個步驟,第一步就是獲取圖片的寬高,這里要設置Options.inJustDecodeBounds=true
,這時候decode的bitmap為null,只是把圖片的寬高放在Options里。
然后第二步就是設置合適的壓縮比例inSampleSize,inSampleSize為原來的1/ratio,這時候獲得合適的Bitmap。
再設置options.inJustDecodeBounds = false;重新讀出圖片bitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(uri), null, options);
以上所述是小編給大家介紹的Android ImageView實現圖片裁剪和顯示功能,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對億速云網站的支持!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。