android之照相、相冊裁剪功能的实现过程
16lz
2021-01-23
今天无聊做了一些照相、相冊裁剪功能,希望能够帮到大家!
不多说了,贴代码实际一点:
首先是XML:
<ImageButton android:id="@+id/imageButton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/xiaoma" /> <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:text="获取图片" /> <ImageView android:id="@+id/imageView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_below="@+id/imageButton1" android:background="@drawable/xiaoma"/>
然后贴一下主activity:
/** * @Title: PicCutDemoActivity.java * @Package com.xiaoma.piccut.demo * @Description: 图片裁剪功能測试 * @author XiaoMa */public class PicCutDemoActivity extends Activity implements OnClickListener {private ImageButton ib = null;private ImageView iv = null;private Button btn = null;private String tp = null;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);//初始化init();}/** * 初始化方法实现 */private void init() {ib = (ImageButton) findViewById(R.id.imageButton1);iv = (ImageView) findViewById(R.id.imageView1);btn = (Button) findViewById(R.id.button1);ib.setOnClickListener(this);iv.setOnClickListener(this);btn.setOnClickListener(this);}/** * 控件点击事件实现 * * 由于有朋友问不同控件的背景图裁剪怎么实现, * 我就在这个地方用了三个控件,仅仅为了自己记录学习 * 大家认为无用的能够跳过啦 */@Overridepublic void onClick(View v) {switch (v.getId()) {case R.id.imageButton1:ShowPickDialog();break;case R.id.imageView1:ShowPickDialog();break;case R.id.button1:ShowPickDialog();break;default:break;}}/** * 选择提示对话框 */private void ShowPickDialog() {new AlertDialog.Builder(this).setTitle("设置头像...").setNegativeButton("相冊", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int which) {dialog.dismiss();/** * 刚開始,我自己也不知道ACTION_PICK是干嘛的,后来直接看Intent源代码, * 能够发现里面非常多东西,Intent是个非常强大的东西,大家一定细致阅读下 */Intent intent = new Intent(Intent.ACTION_PICK, null);/** * 以下这句话,与其他方式写是一样的效果,假设: * intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI); * intent.setType(""image/*");设置数据类型 * 假设朋友们要限制上传到server的图片类型时能够直接写如:"image/jpeg 、 image/png等的类型" * */intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,"image/*");startActivityForResult(intent, 1);}}).setPositiveButton("拍照", new DialogInterface.OnClickListener() {public void onClick(DialogInterface dialog, int whichButton) {dialog.dismiss();/** * 以下这句还是老样子,调用高速拍照功能,至于为什么叫高速拍照,大家能够參考例如以下官方 * 文档,you_sdk_path/docs/guide/topics/media/camera.html * */Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);//以下这句指定调用相机拍照后的照片存储的路径intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(Environment.getExternalStorageDirectory(),"xiaoma.jpg")));startActivityForResult(intent, 2);}}).show();}@Overrideprotected void onActivityResult(int requestCode, int resultCode, Intent data) {switch (requestCode) {// 假设是直接从相冊获取case 1:startPhotoZoom(data.getData());break;// 假设是调用相机拍照时case 2:File temp = new File(Environment.getExternalStorageDirectory()+ "/xiaoma.jpg");startPhotoZoom(Uri.fromFile(temp));break;// 取得裁剪后的图片case 3:/** * 非空推断大家一定要验证,假设不验证的话, * 在剪裁之后假设发现不惬意,要又一次裁剪,丢弃 */if(data != null){setPicToView(data);}break;default:break;}super.onActivityResult(requestCode, resultCode, data);}/** * 裁剪图片方法实现 * @param uri */public void startPhotoZoom(Uri uri) {/* * 至于以下这个Intent的ACTION是怎么知道的,大家能够看下自己路径下的例如以下网页 * yourself_sdk_path/docs/reference/android/content/Intent.html */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", 150);intent.putExtra("outputY", 150);intent.putExtra("return-data", true);startActivityForResult(intent, 3);}/** * 保存裁剪之后的图片数据 * @param picdata */private void setPicToView(Intent picdata) {Bundle extras = picdata.getExtras();if (extras != null) {Bitmap photo = extras.getParcelable("data");Drawable drawable = new BitmapDrawable(photo);/** * 以下凝视的方法是将裁剪之后的图片以Base64Coder的字符方式上 * 传到server,QQ头像上传採用的方法跟这个相似 *//*ByteArrayOutputStream stream = new ByteArrayOutputStream();photo.compress(Bitmap.CompressFormat.JPEG, 60, stream);byte[] b = stream.toByteArray();// 将图片流以字符串形式存储下来tp = new String(Base64Coder.encodeLines(b));这个地方大家能够写下给server上传图片的实现,直接把tp直接上传就能够了,server处理的方法是server那边的事了,吼吼假设下载到的server的数据还是以Base64Coder的形式的话,能够用以下方式转换为我们能够用的图片类型就OK啦...吼吼Bitmap dBitmap = BitmapFactory.decodeFile(tp);Drawable drawable = new BitmapDrawable(dBitmap);*/ib.setBackgroundDrawable(drawable);iv.setBackgroundDrawable(drawable);}}
主要代码已贴完成!
试试吧
更多相关文章
- Android中TextView中内容不换行的解决方法
- UI控件--EditText
- 控件布局_LinearLayout
- LinearLayout 内部控件居中
- Android模拟、实现、触发系统按键事件的方法
- Android常用控件总结
- android 2.2+ 完全退出程序的方法
- C# mono android 图片上传进度条实现
- android MediaPlayer出现RuntimeException: failure code: -38崩