国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ImageView實現圖片裁剪和顯示功能

2019-11-07 23:59:06
字體:
來源:轉載
供稿:網友

ImageView實現圖片裁剪和顯示功能 首先在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);


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 吉木乃县| 庆云县| 轮台县| 利津县| 灵武市| 梅河口市| 新津县| 永泰县| 兴文县| 泰顺县| 徐闻县| 尼勒克县| 文成县| 山西省| 邹平县| 阿尔山市| 集安市| 泾源县| 云和县| 绿春县| 烟台市| 林芝县| 沙湾县| 微山县| 平罗县| 互助| 铅山县| 贵港市| 黄陵县| 景宁| 班戈县| 洪江市| 新竹县| 遂宁市| 卫辉市| 碌曲县| 柏乡县| 泌阳县| 万安县| 珠海市| 岑溪市|