博客
关于我
PopupWindow 以及拍照、裁剪
阅读量:445 次
发布时间:2019-03-06

本文共 13854 字,大约阅读时间需要 46 分钟。

实现这样的效果

圆角图片的自定义控件直接拷进来,和com一个等级
想要弹出内容可以使用悬浮窗
layout_pupup
 

 activity_main:view是阴影

 

push_bottom_in

   push_bottom_in2

  push_bottom_out

styles

  SelectPhotoPopupWindow

public class SelectPhotoPopupWindow extends PopupWindow {    private Button btn_take_photo, btn_pick_photo, btn_cancel;    public SelectPhotoPopupWindow(Context context, OnClickListener onClickListener) {        View contentView = View.inflate(context, R.layout.layout_pupup, null);        /*         * View contentView = View.inflate(MainActivity.this, R.layout.file_item_pop, null);                int width = ViewGroup.LayoutParams.MATCH_PARENT;                int height = itemView.getHeight();                System.out.println("height:" + height);                popupWindow = new PopupWindow(contentView, width, height);                /*点击popupWindow范围以外的地方,让popupWindow消失*/        //                popupWindow.setOutsideTouchable(true);        //                popupWindow.setBackgroundDrawable(new BitmapDrawable());        //         */        this.setContentView(contentView);        this.setWidth(ViewGroup.LayoutParams.MATCH_PARENT);        this.setHeight(ViewGroup.LayoutParams.WRAP_CONTENT);        /**点击popupWindow范围以外的地方,让popupWindow消失*/        this.setOutsideTouchable(true);        this.setBackgroundDrawable(new BitmapDrawable());        //找到对应的控件        btn_take_photo = (Button) contentView.findViewById(R.id.btn_take_photo);        btn_pick_photo = (Button) contentView.findViewById(R.id.btn_pick_photo);        btn_cancel = (Button) contentView.findViewById(R.id.btn_cancel);                btn_take_photo.setOnClickListener(onClickListener);        btn_pick_photo.setOnClickListener(onClickListener);        btn_cancel.setOnClickListener(onClickListener);        //加入动画        this.setAnimationStyle(R.style.AnimBottom);    }}

MainActivity

public class MainActivity extends Activity implements OnClickListener {    protected static final int CODE_TAKE_PHOTO = 100;    protected static final int CODE_PICK_PHOTO = 101;    private static final int CODE_ZOOM_PHOTOT = 102;    private String sdCardPath = Environment.getExternalStorageDirectory().getAbsolutePath();    private File tempFile = new File(sdCardPath + "/" + "tempFile.jpg");    private View root;    private SelectPhotoPopupWindow selectPhotoPopupWindow;    private View viewMask;    private CheckBox cb;    private CircleImageView civ;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        viewMask = findViewById(R.id.viewMask);        root = findViewById(R.id.rl_root);        cb = (CheckBox) findViewById(R.id.cb);        civ = (CircleImageView) findViewById(R.id.civ);        civ.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                if (cb.isChecked()) {                    PhotoUtilChange.getPhotoDialog(MainActivity.this, CODE_TAKE_PHOTO, CODE_PICK_PHOTO, tempFile);                } else {                    selectPhotoPopupWindow = PhotoUtilChange.getPicPopupWindow(MainActivity.this, MainActivity.this,                            root);                    AnimationUtils.showAlpha(viewMask);                }            }        });        viewMask.setOnClickListener(new OnClickListener() {            @Override            public void onClick(View v) {                if (selectPhotoPopupWindow != null) {                    selectPhotoPopupWindow.dismiss();                    AnimationUtils.hideAlpha(viewMask);                }            }        });    }    @Override    public void onClick(View v) {        selectPhotoPopupWindow.dismiss();        switch (v.getId()) {        case R.id.btn_cancel:            Toast.makeText(getApplicationContext(), "cancle", 0).show();            AnimationUtils.hideAlpha(viewMask);            break;        case R.id.btn_take_photo://拍照            //1.发起拍照的intent            PhotoUtilChange.takePhoto(MainActivity.this, CODE_TAKE_PHOTO, tempFile);            break;        case R.id.btn_pick_photo://从相册选择            //1.发起从相册选择的intent            PhotoUtilChange.pickPhoto(MainActivity.this, CODE_PICK_PHOTO, tempFile);            break;        default:            break;        }    }    @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        switch (requestCode) {        case CODE_TAKE_PHOTO://拍照            //2.处理拍照的结果-->去裁剪            PhotoUtilChange.onPhotoFromCamera(MainActivity.this, CODE_ZOOM_PHOTOT, tempFile.getAbsolutePath(), 1, 1);            break;        case CODE_PICK_PHOTO://从相册选择            //2.处理从相册选择的结果-->去裁剪            PhotoUtilChange.onPhotoFromPick(MainActivity.this, CODE_ZOOM_PHOTOT, tempFile.getAbsolutePath(), data, 50,                    50);            break;        case CODE_ZOOM_PHOTOT://裁剪            //3.裁剪完成            Bitmap zoomBitMap = PhotoUtilChange.getZoomBitMap(data, MainActivity.this);            //4.修改头像            civ.setImageBitmap(zoomBitMap);            break;        default:            break;        }        super.onActivityResult(requestCode, resultCode, data);    }}

PhotoUtilChange

/*** * billy修改版 * 头像上传工具类 调用 getPhoto 在onactivityResult 调用 * onPhotoFromCamera * onPhotoFromPick */public class PhotoUtilChange {	/**	 * 因为处理不同	 * 	 * @param takePhotoCode	 *            Uri originalUri = data.getData();	 *            image=ImageUtil.getBitmapFromUrl(originalUri.toString());	 ********************************************************************************** 	 * @param pickPhotoCode	 *            Bundle extras = data.getExtras(); image = (Bitmap)	 *            extras.get("data");	 * @param tempFile	 *            拍照时的临时文件 需要zoom时	 * **/	public static boolean getPhotoDialog(final Activity activity, final int takePhotoCode, final int pickPhotoCode,			final File tempFile) {		final CharSequence[] items = { "相册", "拍照" };		AlertDialog dlg = new AlertDialog.Builder(activity).setTitle("选择图片")				.setItems(items, new DialogInterface.OnClickListener() {					public void onClick(DialogInterface dialog, int item) {						if (item == 1) {							Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");							getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));							activity.startActivityForResult(getImageByCamera, takePhotoCode);						} else {							Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);							getImage.addCategory(Intent.CATEGORY_OPENABLE);							getImage.setType("image/jpeg");							activity.startActivityForResult(getImage, pickPhotoCode);						}					}				}).create();		dlg.show();		return true;	}	public static SelectPhotoPopupWindow getPicPopupWindow(Context context, OnClickListener itemsOnClick,			View viewAttach) {		//实例化SelectPicPopupWindow		SelectPhotoPopupWindow menuWindow = new SelectPhotoPopupWindow(context, itemsOnClick);		//显示窗口		menuWindow.showAtLocation(viewAttach, Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置		return menuWindow;	}	public static boolean takePhoto(Activity activity, int takePhotoCode, File tempFile) {		Intent getImageByCamera = new Intent("android.media.action.IMAGE_CAPTURE");		getImageByCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(tempFile));		activity.startActivityForResult(getImageByCamera, takePhotoCode);		return true;	}	public static boolean pickPhoto(Activity activity, int imageCode, File tempFile) {		Intent getImage = new Intent(Intent.ACTION_GET_CONTENT);		getImage.addCategory(Intent.CATEGORY_OPENABLE);		getImage.setType("image/jpeg");		activity.startActivityForResult(getImage, imageCode);		return true;	}	/**	 * 拍照获取图片的方式 用于切割的图片大小被限制在500,500	 * 	 * @param context	 * @param zoomCode	 * @param temppath	 *            拍照前生成的临时路劲	 * @return 新的路劲	 */	public static String onPhotoFromCamera(final Activity context, final int zoomCode, final String temppath,			final int aspectX, final int aspectY) {		try {			Bitmap btp = getLocalImage(new File(temppath), 1000, 1000);			compressImage(btp, new File(temppath + "temp.jpg"), 30);			photoZoom(context, Uri.fromFile(new File(temppath + "temp.jpg")), Uri.fromFile(new File(temppath)),					zoomCode, aspectX, aspectY);		} catch (Exception e) {			Toast.makeText(context, "图片加载失败", 1000).show();		}		return temppath;	}	/**	 * 图片切割完调用 如果还需要 Bitmap 调用getLocalImage	 * 	 * @param path	 * @param rw	 * @param rh	 * @param compress	 * @return	 */	public static File onPhotoZoom(String path, int rw, int rh, int compress) {		File f = new File(path);		Bitmap btp = PhotoUtilChange.getLocalImage(f, rw, rh);		compressImage(btp, f, compress);		return f;	}	/**	 * 相册获取图片,用于切割的图片大小被限制在500,500	 * 	 * @param context	 * @param zoomCode	 * @param temppath	 *            希望生成的路劲	 * @param data	 */	public static void onPhotoFromPick(final Activity context, final int zoomCode, final String temppath,			final Intent data, final int aspectX, final int aspectY) {		try {			Bitmap btp = checkImage(context, data);			compressImage(btp, new File(temppath + "temp.jpg"), 30);			PhotoUtilChange.photoZoom(context, Uri.fromFile(new File(temppath + "temp.jpg")),					Uri.fromFile(new File(temppath)), zoomCode, aspectX, aspectY);		} catch (Exception e) {			Toast.makeText(context, "图片加载失败", 1000).show();		}	}	/**	 * data 中检出图片	 * 	 * @param activity	 * @param data	 * @return	 */	public static Bitmap checkImage(Activity activity, Intent data) {		Bitmap bitmap = null;		try {			Uri originalUri = data.getData();			String path = getRealPathFromURI(activity, originalUri);			File f = activity.getExternalCacheDir();			String pp = f.getAbsolutePath();			if (path.indexOf(pp) != -1) {				path = path.substring(path.indexOf(pp), path.length());			}			bitmap = getLocalImage(new File(path), 1000, 1000);		} catch (Exception e) {		} finally {			return bitmap;		}	}	/**	 * 通过URI 获取真实路劲	 * 	 * @param activity	 * @param contentUri	 * @return	 */	public static String getRealPathFromURI(Activity activity, Uri contentUri) {		Cursor cursor = null;		String result = contentUri.toString();		String[] proj = { MediaStore.Images.Media.DATA };		cursor = activity.managedQuery(contentUri, proj, null, null, null);		if (cursor == null)			throw new NullPointerException("reader file field");		if (cursor != null) {			int column_index = cursor.getColumnIndexOrThrow(MediaColumns.DATA);			cursor.moveToFirst();			result = cursor.getString(column_index);			if (Integer.parseInt(Build.VERSION.SDK) < 14) {				cursor.close();			}		}		return result;	}	/**	 * 图片压缩 上传图片时建议compress为30	 * 	 * @param bm	 * @param f	 */	public static void compressImage(Bitmap bm, File f, int compress) {		if (bm == null)			return;		File file = f;		try {			if (file.exists()) {				file.delete();			}			file.createNewFile();			OutputStream outStream = new FileOutputStream(file);			bm.compress(android.graphics.Bitmap.CompressFormat.JPEG, compress, outStream);			outStream.flush();			outStream.close();		} catch (FileNotFoundException e) {			e.printStackTrace();		} catch (IOException e) {			e.printStackTrace();		}	}	/**	 * 由本地文件获取希望大小的文件	 * 	 * @param f	 * @return	 */	public static Bitmap getLocalImage(File f, int swidth, int sheight) {		File file = f;		if (file.exists()) {			try {				file.setLastModified(System.currentTimeMillis());				FileInputStream in = new FileInputStream(file);				BitmapFactory.Options options = new BitmapFactory.Options();				options.inJustDecodeBounds = true;				BitmapFactory.decodeStream(in, null, options);				int sWidth = swidth;				int sHeight = sheight;				int mWidth = options.outWidth;				int mHeight = options.outHeight;				int s = 1;				while ((mWidth / s > sWidth * 2) || (mHeight / s > sHeight * 2)) {					s *= 2;				}				options = new BitmapFactory.Options();				options.inSampleSize = s;				options.inPreferredConfig = Bitmap.Config.RGB_565;				options.inPurgeable = true;				options.inInputShareable = true;				try {					// 4. inNativeAlloc 属性设置为true,可以不把使用的内存算到VM里					BitmapFactory.Options.class.getField("inNativeAlloc").setBoolean(options, true);				} catch (Exception e) {				}				in.close();				// 再次获取				in = new FileInputStream(file);				Bitmap bitmap = BitmapFactory.decodeStream(in, null, options);				in.close();				return bitmap;			} catch (FileNotFoundException e) {				e.printStackTrace();			} catch (Exception e) {				e.printStackTrace();			} catch (Error e) {				System.gc();				return null;			}		}		return null;	}	/**	 * aspectY Y对于X的比例 outputX X 的宽	 * **/	public static void photoZoom(Activity activity, Uri uri, Uri outUri, int photoResoultCode, int aspectX, int aspectY) {		Intent intent = new Intent("com.android.camera.action.CROP");		intent.setDataAndType(uri, "image/*");		intent.putExtra("crop", "true");		// aspectX aspectY 是宽高的比例		if (aspectY > 0) {			intent.putExtra("aspectX", aspectX);			intent.putExtra("aspectY", aspectY);		}		intent.putExtra("scale", aspectX == aspectY);		intent.putExtra("return-data", true);		intent.putExtra("outputFormat", Bitmap.CompressFormat.JPEG.toString());		intent.putExtra(MediaStore.EXTRA_OUTPUT, outUri);		intent.putExtra("noFaceDetection", true); //		activity.startActivityForResult(intent, photoResoultCode);	}	/**	 * 保存zoom之后的图片	 * @param data zoom后的intent	 * @param context 上下文	 * @return	 */	public static Bitmap getZoomBitMap(Intent data, Context context) {		try {			Bundle extras = data.getExtras();			if (extras != null) {				Bitmap bitmap = extras.getParcelable("data");				return bitmap;			}		} catch (Exception e) {			e.printStackTrace();			Toast.makeText(context, "出现未知异常,请尝试其他图片", Toast.LENGTH_SHORT).show();		}		return null;	}}

  

 

 

 

 

转载地址:http://rntfz.baihongyu.com/

你可能感兴趣的文章
mcrypt加密以及解密过程
查看>>
go等待N个线程完成操作总结
查看>>
Python 之网络式编程
查看>>
SpringCloud微服务(03):Hystrix组件,实现服务熔断
查看>>
网站故障公告1:使用阿里云RDS之后一个让人欲哭无泪的下午
查看>>
上周热点回顾(6.9-6.15)
查看>>
上周热点回顾(5.9-5.15)
查看>>
上周热点回顾(1.23-1.29)
查看>>
云计算之路-阿里云上:14:20-14:55博客后台2台服务器都CPU 100%引发的故障
查看>>
Python 简明教程 --- 20,Python 类中的属性与方法
查看>>
QBlog V2.5 源码开放下载(ASP.NET 番外系列之开端)
查看>>
稀疏数组
查看>>
Android MediaPlayer setDataSource failed
查看>>
虚拟机搭建hadoop环境
查看>>
Hibernate入门(四)---------一级缓存
查看>>
[Python学习笔记]组织文件
查看>>
Spring Boot 2.x基础教程:构建RESTful API与单元测试
查看>>
dojo/request模块整体架构解析
查看>>
互联网App应用程序测试流程及测试总结
查看>>
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
查看>>