logo资料库

Android实现拍照、选择图片并裁剪图片功能.pdf

第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
资料共13页,剩余部分请下载后查看
Android实现拍照、选择图片并裁剪图片功能 实现拍照、选择图片并裁剪图片功能 一、一、 实现拍照、选择图片并裁剪图片效果 实现拍照、选择图片并裁剪图片效果 按照之前博客的风格,首先看下实现效果。
二、二、 uCrop项目应用 项目应用 想起之前看到的Yalantis/uCrop效果比较绚,但是研究源码之后发现在定制界面方面还是有一点的限制,于是在它的基础上做 了修改Android-Crop,把定制界面独立出来,让用户去自由设置。下图为使用Android-Crop实现的模仿微信选择图片并裁剪 Demo。
三、三、 实现思路 实现思路 比较简单的选择设备图片裁剪,并将裁剪后的图片保存到指定路径; 调用系统拍照,将拍照图片保存在SD卡,然后裁剪图片并将裁剪后的图片保存在指定路径。 流程流程图如下所示: 图如下所示: 四、四、 选择框实现 选择框实现 这里通过PopupWindow来实现,当然也可以根据需求采用其他方式实现。实现效果如下图所示:
1. XML布局布局
break; } } PopupWindow的初始化创建、监听设置好之后,只要提供显示与隐藏两个方法就可以了。 /** * 把一个View控件添加到PopupWindow上并且显示 * * @param activity */ public void showPopupWindow(Activity activity) { popupWindow = new PopupWindow(mMenuView, // 添加到popupWindow ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); popupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); popupWindow.showAtLocation(activity.getWindow().getDecorView(), Gravity.CENTER | Gravity.BOTTOM, 0, 0); popupWindow.setAnimationStyle(android.R.style.Animation_InputMethod); // 设置窗口显示的动画效果 popupWindow.setFocusable(false); // 点击其他地方隐藏键盘 popupWindow popupWindow.update(); } /** * 移除PopupWindow */ public void dismissPopupWindow() { if (popupWindow != null && popupWindow.isShowing()) { popupWindow.dismiss(); popupWindow = null; } } OK,到这里选择框的实现就完成了。 五、使用选择框 五、使用选择框 通过我们上面对选择框的封装,使用起来就比较简单了,只需要初始化及设置选择的监听就可以啦。 1.初始化选择框 初始化选择框 mSelectPicturePopupWindow = new SelectPicturePopupWindow(mContext); mSelectPicturePopupWindow.setOnSelectedListener(this); 2.设置选择框监听 设置选择框监听 @Override public void OnSelected(View v, int position) { switch (position) { case 0: // TODO: "拍照"按钮被点击了 break; case 1: // TODO: "从相册选择"按钮被点击了 break; case 2: // TODO: "取消"按钮被点击了 break; } } 然后在Fragment上进行封装,我们取名为PictureSelectFragment。 六、拍照并保存图片 六、拍照并保存图片 调用系统的拍照,并把拍摄的图片保存到指定位置。 @Override public void OnSelected(View v, int position) { switch (position) { case 0: // "拍照"按钮被点击了 mSelectPicturePopupWindow.dismissPopupWindow(); Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); //下面这句指定调用相机拍照后的照片存储的路径 takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mTempPhotoPath))); startActivityForResult(takeIntent, CAMERA_REQUEST_CODE);
break; case 1: // TODO: "从相册选择"按钮被点击了 break; case 2: // TODO: "取消"按钮被点击了 break; } } 这里的指定位置为sd卡本目录下 mTempPhotoPath = Environment.getExternalStorageDirectory() + File.separator + “photo.jpeg”; 当拍摄照片完成时会回调到onActivityResult,我们在这里处理图片的裁剪就可以了。 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == mActivity.RESULT_OK) { switch (requestCode) { case CAMERA_REQUEST_CODE: // TODO: 调用相机拍照 break; } } super.onActivityResult(requestCode, resultCode, data); } 七、相册选择图片 七、相册选择图片 调用系统的选择图片 @Override public void OnSelected(View v, int position) { switch (position) { case 0: // "拍照"按钮被点击了 mSelectPicturePopupWindow.dismissPopupWindow(); Intent takeIntent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); // 下面这句指定调用相机拍照后的照片存储的路径 takeIntent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mTempPhotoPath))); startActivityForResult(takeIntent, CAMERA_REQUEST_CODE); break; case 1: // "从相册选择"按钮被点击了 mSelectPicturePopupWindow.dismissPopupWindow(); Intent pickIntent = new Intent(Intent.ACTION_PICK, null); // 如果限制上传到服务器的图片类型时可以直接写如:"image/jpeg 、 image/png等的类型" pickIntent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "image/*"); startActivityForResult(pickIntent, GALLERY_REQUEST_CODE); break; case 2: // TODO: "取消"按钮被点击了 break; } } 当拍选择图片完成时会回调到onActivityResult,在这里处理选择的返回结果。 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == mActivity.RESULT_OK) { switch (requestCode) { case CAMERA_REQUEST_CODE: // TODO: 调用相机拍照 break; case GALLERY_REQUEST_CODE: // TODO: 直接从相册获取 break; } } super.onActivityResult(requestCode, resultCode, data); } 八、使用Crop裁剪图片 八、使用 裁剪图片 裁剪图片,这里设置宽高比为1:1,最大尺寸为512*512,当然可以根据自己的需求来设置。
/** * 裁剪图片方法实现 * * @param uri */ public void startCropActivity(Uri uri) { UCrop.of(uri, mDestinationUri) .withAspectRatio(1, 1) .withMaxResultSize(512, 512) .withTargetActivity(CropActivity.class) .start(mActivity, this); } CropActiivty裁剪完成时会回调到onActivityResult,在这里处理选择的返回结果。 @Override public void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == mActivity.RESULT_OK) { switch (requestCode) { case CAMERA_REQUEST_CODE: // 调用相机拍照 File temp = new File(mTempPhotoPath); startCropActivity(Uri.fromFile(temp)); break; case GALLERY_REQUEST_CODE: // 直接从相册获取 startCropActivity(data.getData()); break; case UCrop.REQUEST_CROP: // TODO: 裁剪图片结果 break; case UCrop.RESULT_ERROR: // TODO: 裁剪图片错误 break; } } super.onActivityResult(requestCode, resultCode, data); } CropActivity的界面如下所示:
分享到:
收藏