相机或相册选择图片
2016-03-29 16:09
92 查看
选择用户头像时有拍照和从相册选取两种方式,这首先来定义下选择方式的界面,仿ios底部弹出选择框,使用继承dialog方式实现。
在构造方法里初始化,这dialog实际是放了个竖向的LinearLayout,添加一个个textview显示。
设置完样式接下来就是用户设置菜单项和点击事件了
界面调用时new一个show就可以了,接下来就是点击选择图片,由于拍照要在onactivityresult里拿到图片路径,这里将选择图片写成一个activity。
使用时继承该activity,然后在点击事件里调用useCamera或selectPhoto方法,重写onSelectPic方法,得到图片uri和路径。
如果要剪裁图片,参数传true,重写onCrop。
在构造方法里初始化,这dialog实际是放了个竖向的LinearLayout,添加一个个textview显示。
private void init(Context context) { this.context = context; linearLayout = new LinearLayout(context); linearLayout.setPadding(8, 0, 8, 0); linearLayout.setOrientation(LinearLayout.VERTICAL); params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params.setMargins(0, 0, 0, 1);//菜单项每条间留一点空隙就行了 params_cancel = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT); params_cancel.setMargins(0, 8, 0, 8);//最后一个放取消按钮,上下边距稍微大点 requestWindowFeature(Window.FEATURE_NO_TITLE);//对话框没有title,要不上面一块黑 setContentView(linearLayout); initWindow(getWindow()); } //设置dialog窗口样式 private void initWindow(Window window) { WindowManager.LayoutParams params = window.getAttributes(); params.width = WindowManager.LayoutParams.MATCH_PARENT; params.height = WindowManager.LayoutParams.WRAP_CONTENT; params.gravity = Gravity.BOTTOM;//设置宽高,位置在底部 params.dimAmount = 0.2f;//对话框后面黑色不透明度 window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); window.setAttributes(params); }
设置完样式接下来就是用户设置菜单项和点击事件了
public void setMenus(String[] menus, OnItemClickListener onItemClickListener) { for (int i = 0; i < menus.length + 1; i++) { Button button = new Button(context); if (i == menus.length) { button.setText("取消"); button.setLayoutParams(params_cancel); } else { button.setText(menus[i]); button.setLayoutParams(params); } button.setTextSize(18); button.setTag(i); button.setOnClickListener(this); button.setBackgroundResource(R.drawable.item_list_bg); linearLayout.addView(button); } this.onItemClickListener = onItemClickListener; } public void onClick(View v) { int position = (int) v.getTag(); if (onItemClickListener != null) { onItemClickListener.onItemClick(position); } dismiss(); }
界面调用时new一个show就可以了,接下来就是点击选择图片,由于拍照要在onactivityresult里拿到图片路径,这里将选择图片写成一个activity。
//使用拍照方式获取图片,参数为是否剪裁图片 protected void useCamera(boolean isCrop) { this.isCrop = isCrop; File file = new File(directory, "IMG_" + TimeUtil.getCurTime("yyyyMMdd_HHmmss") + ".jpg"); uri = Uri.fromFile(file); Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); startActivityForResult(intent, REQUEST_CAMERA); } //从相册选取图片 protected void selectPhoto(boolean isCrop) { this.isCrop = isCrop; Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); startActivityForResult(intent, REQUEST_PHOTO); } //剪裁图片 private void crop(Uri uri) { Intent intent = new Intent("com.android.camera.action.CROP"); intent.setDataAndType(uri, "image/*"); // crop为true是设置在开启的intent中设置显示的view可以剪裁 intent.putExtra("crop", "true"); // aspectX aspectY 是宽高的比例 intent.putExtra("aspectX", 1); intent.putExtra("aspectY", 1); // outputX,outputY 是剪裁图片的宽高 intent.putExtra("outputX", 300); intent.putExtra("outputY", 300); intent.putExtra("return-data", true); intent.putExtra("noFaceDetection", true); startActivityForResult(intent, REQUEST_CROP); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (resultCode == RESULT_OK) { switch (requestCode) { case REQUEST_CAMERA: if (isCrop) { crop(uri);//去剪裁 } else { //选完照片调用的方法,子类重写该方法 onSelectPic(uri, getUriPath(uri)); } break; case REQUEST_PHOTO: uri = data.getData(); if (isCrop) { crop(uri); } else { onSelectPic(uri, getUriPath(uri)); } break; case REQUEST_CROP://剪裁完 Bitmap bitmap = data.getParcelableExtra("data"); saveBitmap(bitmap, cropFile); String path = cropFile.getAbsolutePath(); onCrop(bitmap, path);//如果选取时剪裁了子类重写该方法 break; } } } //将图片保存到文件里 private void saveBitmap(Bitmap bitmap, File file) { FileOutputStream fos = null; try { fos = new FileOutputStream(file); bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (IOException e) { e.printStackTrace(); } } } } //选完图片拿到uri,根据uri拿到图片path protected String getUriPath(Uri uri) { Cursor cursor = getContentResolver().query(uri, null, null, null, null); if (cursor != null) { cursor.moveToFirst(); String path = cursor.getString(cursor.getColumnIndex("_data")); cursor.close(); return path; } return uri.getPath(); } //有的奇葩手机选完图片后图片会倒过来,这里拿到图片的旋转方向 private int getDegree(String path) { int degree = 0; try { ExifInterface exifInterface = new ExifInterface(path); int orientation = exifInterface.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: degree = 90; break; case ExifInterface.ORIENTATION_ROTATE_180: degree = 180; break; case ExifInterface.ORIENTATION_ROTATE_270: degree = 270; break; } } catch (IOException e) { e.printStackTrace(); } return degree; } //将图片旋转 private Bitmap rotateBitmap(Bitmap bitmap, int degree) { Matrix matrix = new Matrix();//matrix是一个3*3的矩阵,可以实现图片的旋转缩放平移,createbitmap时可以用到这参数 matrix.postRotate(degree); Bitmap b = null; try { b = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); } catch (Exception e) { e.printStackTrace(); } if (b == null) { return bitmap; } if (b != bitmap) { bitmap.recycle(); } return b; }
使用时继承该activity,然后在点击事件里调用useCamera或selectPhoto方法,重写onSelectPic方法,得到图片uri和路径。
如果要剪裁图片,参数传true,重写onCrop。
相关文章推荐
- Linux 防火墙 iptables基本操作
- Java学习笔记-eclipse配置
- 什么是 Web API
- junit批量测试
- PHP的Yii框架中View视图的使用进阶
- bzoj 2820 莫比乌斯反演
- interactivePopGestureRecognizer 完美使用
- 判断后边的点是否在前边的区域呢i
- 反射对应泛型参数的调用
- tomcat 部署项目,不加项目名 直接访问
- Java编程提高性能时需注意的地方
- cleanmymac定时清理与垃圾监测
- 【OpenCV】OpenCV输入处理(鼠标事件_键盘事件_滑块事件)
- poj-1837 Balance【dp】
- 修復jquery的tablesorter对加了千分位的数字无法正确排序的bug
- 人工智能3:通过搜索进行问题求解
- 为什么32位系统又叫x86系统呢?
- 将图片保存到手机的指定目录
- 搭建nginx反向代理用做内网域名转发
- shell常用命令总结