在今天的学习中,使用了横向的滚动控件 HorizontalScrollView,并在其中添加一个横向的LinearLayout 来实现动态调用系统相机,拍摄并保存图片的一个逻辑,下面我就来进行详细的介绍。
基本思路就是 保存拍照返回的路径集合(List<ImagePath>),根据路径集合中的内容生成Bitmap(位图),然后对图片进行一定的处理(缩放,压缩)。接着创建 ImageView 实例,并将ImageView 实例添加到 LinearLayout 中。
布局我就不详细介绍了,无非就是HorizontalScrollView控件中嵌套一个子布局 LinearLayout。
代码如下:
public static ArrayList<String> filePaths ; / /图片地址的集合
@Override
protected void onResume() { //界面可见,且可与用户交互
super.onResume();
if( filePaths!=null ){
mLinearLayout.removeAllViews();
mLinearLayout.setVisibility(View.VISIBLE);
for (int i=0 ; i<= filePaths.size() ;i++){
ImageView imageView = new ImageView(this);
LinearLayout.LayoutParams params=newLinearLayout.LayoutParams(200,200);
params.rightMargin=10;
params.leftMargin=10;
imageView.setLayoutParams(params);
if ( i < filePaths.size() ) {
File file = new File( filePaths.get(i) );
if( file.exists() ){
Bitmap bitmap= BitmapFactory.decodeFile(filePaths.get(i));
imageView.setImageBitmap(bitmap);
}else{
imageView.setImageResource(R.mipmap.default_img); }
}else{
imageView.setImageResource(R.mipmap.btn_add_img);
}
mLinearLayout.addView(imageView,i);
ImageViewOnClick(imageView,i); / / ImageView 的点击事件
}
}
}
上述代码中 ,是根据 图片路径集合的长度来创建 ImageView 实例的,并添加到LinearLayout 中。默认添加一个图片,用来点击调用系统的拍照。当点击图片时,如不是默认图片,则跳转到图片详情页,否则调用系统拍照。
图片详情页使用的是 PhotoView,是一个比较常用的图片开源库,可以根据手势来缩放图片。
下面是调用系统拍照的代码:
Intent intent=new Intent( MediaStore.ACTION_IMAGE_CAPTURE);
Uri uri=Uri.fromFile(newFile(mImgPath));
intent.putExtra(MediaStore.EXTRA_OUTPUT,uri);
intent.putExtra(MediaStore.Images.ImageColumns.ORIENTATION,0);
startActivityForResult(intent,1001);
其中 mImgPath 是拍照图片保存的路径。需要自己手动生成。
然后就是 onActivityResult()方法啦,拍照后 图片的内容就保存在 mImgPath 这个路径之中。我们需要在这个方法中对 图片进行一些必要的处理。
处理的原因是,现在的手机像素非常高了,拍成的图片一般都比较大,如果不对图片进行处理,会很容易造成内存溢出,从而使你的应用崩溃。在这里推荐一个图片压缩的第三方库,Luban 压缩,可以去研究下。
图片的处理代码如下:
Bitmap bitmap= ImageTools.convertToBitmap(mImgPath,800,800); // 转换成图片
Bitmap bitmapComp=ImageTools.comp(bitmap);//进行图片压缩
ImageTools.saveBitmap(bitmapComp,mImgPath);//保存图片
if(bitmap!=null){
filePaths.add(mImgPath);
}
这里代码的基本思路就是,对拍照返回的路径中的内容转换成图片,并对图片进行压缩处理,然后将图片保存到拍照返回的路径中,最后将路径添加到集合中。