微信公众号:IT90s最前线(IT资讯,实用干货)
通过一个Imageview来显示我们获得图片。
xml中我们写一个ImageView即可,用来显示我们的编辑效果,首先要说的是获取图片和通过相机来进行获取图片是两种不同的方式,而且可以说是差别比较大的。
那么我们首先来说一下从相册来获取的方式,同是给出一些图片的处理方式,来让图片能够很好的适应屏幕,同时也可以避免图片过大导致内存溢出的问题,导致程序死掉。
首先我们要获取屏幕的高度和宽度,通过这个我们用于后来的图片的大小处理。
<span style="font-size:18px;"> Display display = getWindowManager().getDefaultDisplay();
DisplayMetrics metric = new DisplayMetrics();
display.getMetrics(metric);
width = metric.widthPixels; // 屏幕宽度(像素)
height = metric.heightPixels; // 屏幕高度(像素)</span>
首先我们要做的是从相册进行获取图片,这里的action和Intent,在此先说一下,具体的将在下一篇博客中进行阐述我们在新建每一个activity的时候会发现都有一个action,有一个属性就是action name,我么可以对这个name进行自定义,这个action就代表了我们要执行的操作,这就是我们在开启拍照的时候,可能会有一个Dialog来让我们进行选择,比如说有美颜相机和本地的相机。
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setType("image/*");// 相片类型
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(intent, 1);
通过个我们就可以开启我们本地的相册或者是其它的一些应用来进行获取图片了,这里还有一个问题就是我们在Dialog首次选择后,以后可能就不能够进行更改了,如何来更改呢?这可能会让一些人无从下手了,当我们做了设置之后,也就说当我们选择了这个应用作为默认应用之后,我们就无法对其进行修改,这是因为当我们选择了这个应用之后,系统会自动的在我们所选择的这个应用中做一个默认的设置,我们只要还原设置就好了,记住不是清除数据。
然后是对相机的调用
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(
Environment.getExternalStorageDirectory(), "image.jpg")));
startActivityForResult(intent, 2);
相机的调用和对本地相册的调用还是有一定的差距的,那就是我们调用本地的相册,我们的图片在本地都已经有保存了,但是对于相机来说就不同了,因为我们要在本地保存一下然后再进行贴图。
然后我们还需要一个回调函数对返回的数据进行处理一下。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
switch (requestCode) {
case 1:
ContentResolver resolver = getContentResolver();
Uri originalUri = data.getData();
try {
Bitmap photo = MediaStore.Images.Media.getBitmap(resolver,
originalUri);
if (photo != null) {
float scaleWidth = (width - 15)
/ ((float) photo.getWidth());
float scaleHeight = scaleWidth;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newbm = Bitmap.createBitmap(photo, 0, 0,
photo.getWidth(), photo.getHeight(), matrix,
true);
photo.recycle();
image1 = new ImageView(this);
image1.setImageBitmap(newbm);
image1.setId(110);
RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
lp1.leftMargin=5;
editContent.addView(image1,lp1);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
break;
case 2:
//我们在拍照的时候设置好了基本的路径,所以我们只需要根据路径来进行寻找
Bitmap bitmap = BitmapFactory.decodeFile(Environment.getExternalStorageDirectory()+"/image.jpg");
//下面是对图片的处理,处理完之后要对之前的图片进行回收,防止内存出现问题
float scaleWidth = (width - 15)/ ((float) bitmap.getWidth());
float scaleHeight = scaleWidth;
Matrix matrix = new Matrix();
matrix.postScale(scaleWidth, scaleHeight);
Bitmap newbm = Bitmap.createBitmap(bitmap, 0,0, bitmap.getWidth(),bitmap.getHeight(),matrix,true);
bitmap.recycle();
image1.setImageBitmap(newbm);
break;
}
}
super.onActivityResult(requestCode, resultCode, data);
}