您好,登錄后才能下訂單哦!
這篇文章主要介紹“Android怎么實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“Android怎么實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片”文章能幫助大家解決問題。
需求:
拍照,然后對圖片進(jìn)行處理,劃定矩形區(qū)域,將矩形區(qū)域裁剪下來
思路:
1、使用系統(tǒng)相機(jī)拍照,拍完返回,對圖片進(jìn)行壓縮和存儲(chǔ)。
2、新建一個(gè)activity處理圖片裁剪,利用自定義view在畫布上畫出矩形區(qū)域。
3、根據(jù)坐標(biāo)信息生成裁剪圖片并存儲(chǔ)。
部分核心代碼:
1、調(diào)用系統(tǒng)相機(jī)拍照
String IMAGE_PATH = Environment.getExternalStorageDirectory().getPath()+ "/com.kwmax.demo/Image/"; String filename = "xxxxxx.jpeg"; File picFile = new File(IMAGE_PATH + filename); if (!picFile.exists()) { picFile.createNewFile(); } ... if(getContext().getPackageManager().getLaunchIntentForPackage("com.sec.android.app.camera") != null) { cameraIntent.setPackage("com.sec.android.app.camera"); } if (getContext().getPackageManager().getLaunchIntentForPackage("com.android.hwcamera") != null) { cameraIntent.setPackage("com.android.hwcamera"); } if (getContext().getPackageManager().getLaunchIntentForPackage("com.zte.camera") != null) { cameraIntent.setPackage("com.zte.camera"); } cameraIntent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); // 默認(rèn)系統(tǒng)相機(jī) cameraIntent.addCategory("android.intent.category.DEFAULT"); Uri pictureUri = Uri.fromFile(picFile); cameraIntent.putExtra(MediaStore.EXTRA_OUTPUT, pictureUri); startActivityForResult(intent, CAMERA_REQUEST_CODE);
2、自定義手勢矩形view
public class CaptureRectView extends View { private int x; private int y; private int m; private int n; private boolean sign;//繪畫標(biāo)記位 private Paint paint;//畫筆 public CaptureRectView (Context context) { super(context); paint = new Paint(Paint.FILTER_BITMAP_FLAG); } @Override protected void onDraw(Canvas canvas) { if(sign){ paint.setColor(Color.TRANSPARENT); }else{ paint.setColor(Color.RED); paint.setAlpha(80); paint.setStyle(Paint.Style.STROKE); paint.setStrokeWidth(15f); canvas.drawRect(new Rect(x, y, m, n), paint); } super.onDraw(canvas); } public void setSeat(int x,int y,int m,int n){ this.x = x; this.y = y; this.m = m; this.n = n; } public boolean isSign() { return sign; } public void setSign(boolean sign) { this.sign = sign; } }
3、裁剪頁面布局
<?xml version="1.0" encoding="utf-8"?> <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/drawrect_framelayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" android:clickable="true" android:orientation="vertical"> <RelativeLayout android:id="@+id/drawrect_relativelayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/black" android:orientation="vertical"> <FrameLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_above="@+id/bottom"> <LinearLayout android:id="@+id/image_zoom_view_layout" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_centerInParent="true" android:gravity="center" android:orientation="vertical"/> <ImageView android:id="@+id/capture_preview" android:layout_width="80dp" android:layout_height="80dp"/> </FrameLayout> <LinearLayout android:id="@+id/bottom" android:layout_width="fill_parent" android:layout_height="50dip" android:layout_alignParentBottom="true" android:orientation="horizontal" android:layout_marginLeft="10dp" android:layout_marginRight="10dp"> <Button android:id="@+id/btn_capture" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_weight="1" android:layout_marginRight="10dp" android:text="裁剪"/> <Button android:id="@+id/btn_cancel" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="取消"/> </LinearLayout> </RelativeLayout> </FrameLayout>
4、裁剪activity
public class DrawRectActivity extends BasicActivity implements OnClickListener, View.OnTouchListener { private String TAG = "DrawRectActivity"; private String imageString; private String imagePath; private ArrayList<String> imageList = null; private int position = 0; private int width, height; private LinearLayout layerViewLayout = null; private ImageView aiPreview; private CaptureRectView captureView;//繪畫選擇區(qū)域 private int capX;//繪畫開始的橫坐標(biāo) private int capY;//繪畫開始的縱坐標(biāo) private int capM;//繪畫結(jié)束的橫坐標(biāo) private int capN;//繪畫結(jié)束的縱坐標(biāo) private Bitmap captureBitmap; private Button cancel; private Button aiCapture; private FrameLayout frameLayout; private RelativeLayout relativeLayout; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); init(); initUI(); } private void init() { width = ImageUtils.getScreenWidth(this); height = ImageUtils.getScreenHeight(this); Intent intent = this.getIntent(); Bundle bundle = intent.getExtras(); imageString = bundle.getString("imageString"); imagePath = bundle.getString("imagePath"); position = bundle.getInt("position"); imageList = parseImageString(imagePath, imageString); } @TargetApi(Build.VERSION_CODES.JELLY_BEAN) private void initUI() { setContentView(R.layout.draw_image_rect_view); frameLayout = (FrameLayout) findViewById(R.id.drawrect_framelayout); relativeLayout = (RelativeLayout) findViewById(R.id.drawrect_relativelayout); layerViewLayout = (LinearLayout) this.findViewById(R.id.image_zoom_view_layout); btncancel = (Button) findViewById(R.id.btn_cancel); btnCapture = (Button) findViewById(R.id.btn_capture); btnPreview = (ImageView) findViewById(R.id.capture_preview); ImageView originImage = new ImageView(this); Bitmap image = ImageUtils.getBitmapFromFile(imagePath + imageList.get(position), 1); originImage.setImageBitmap(image); originImage.setLayerType(View.LAYER_TYPE_SOFTWARE, null); layerViewLayout.addView(originImage, new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); captureView = new CaptureRectView(this); originImage.setOnTouchListener(this); this.addContentView(captureView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)); if (frameLayout.isClickable()) { frameLayout.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { } }); } btncancel.setOnClickListener(this); btnCapture.setOnClickListener(this); } private ArrayList<String> parseImageString(String imagePath, String imageString) { ArrayList<String> list = new ArrayList<String>(); String allFiles = imageString.substring(imageString.indexOf("img://") + "img://".length()); String fileName = null; while (allFiles.indexOf(";") > 0) { fileName = allFiles.substring(0, allFiles.indexOf(";")); allFiles = allFiles.substring(allFiles.indexOf(";") + 1); if (checkIsImageFile(fileName) && new File(imagePath + fileName).exists()) { list.add(fileName); Log.v("ParseImageString()", "imageName=" + fileName); } else { Log.v("ParseImageString()", "bad imageName=" + fileName); } } Log.v("ParseImageString()", "imagelist.size=" + list.size()); return list; } /** * 判斷是否相應(yīng)的圖片格式 */ private boolean checkIsImageFile(String fName) { boolean isImageFormat; if (fName.endsWith(".jpg") || fName.endsWith(".gif") || fName.endsWith(".png") || fName.endsWith(".jpeg") || fName.endsWith(".bmp")) { isImageFormat = true; } else { isImageFormat = false; } return isImageFormat; } @Override public boolean onTouch(View view, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: capX = 0; capY = 0; width = 0; height = 0; capX = (int) event.getX(); capY = (int) event.getY(); break; case MotionEvent.ACTION_MOVE: capM = (int) event.getX(); capN = (int) event.getY(); captureView.setSeat(capX, capY, capM, capN); captureView.postInvalidate(); break; case MotionEvent.ACTION_UP: if (event.getX() > capX) { width = (int) event.getX() - capX; } else { width = (int) (capX - event.getX()); capX = (int) event.getX(); } if (event.getY() > capY) { height = (int) event.getY() - capY; } else { height = (int) (capY - event.getY()); capY = (int) event.getY(); } captureBitmap = getCapturePreview(this); if (null != captureBitmap) { btnPreview.setImageBitmap(captureBitmap); } break; } if (captureView.isSign()) { return false; } else { return true; } } private Bitmap getCapturePreview(Activity activity) { View view = activity.getWindow().getDecorView(); view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); Rect frame = new Rect(); activity.getWindow().getDecorView().getWindowVisibleDisplayFrame(frame); int toHeight = frame.top; //todo:這里需要針對部分機(jī)型做適配 if (width > 0 && height > 0) { bitmap = Bitmap.createBitmap(bitmap, capX, capY + 240, width, height); view.setDrawingCacheEnabled(false); return bitmap; } else { return null; } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.btn_cancel: Intent cancelintent = getIntent(); createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT); setResult(RESULT_OK, cancelintent); finish(); break; case R.id.btn_capture: Intent sureintent = getIntent(); createPendingResult(CpAIphotoAttributes.PHOTO_CAPTURE, sureintent, PendingIntent.FLAG_UPDATE_CURRENT); if (captureBitmap != null) { try { String file = IMAGE_PATH; String randomid = UUID.randomUUID().toString(); String filename = randomid+ ".jpeg"; FileOutputStream fout = new FileOutputStream(file+filename); captureBitmap.compress(Bitmap.CompressFormat.JPEG, 100, fout); sureintent.putExtra("capturePath", file+filename); sureintent.putExtra("capturefilename", filename); sureintent.putExtra("capturefileid", randomid); } catch (FileNotFoundException e) { e.printStackTrace(); } } setResult(RESULT_OK, sureintent); finish(); break; default: break; } } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { switch (keyCode) { case KeyEvent.KEYCODE_BACK: Intent cancelintent = getIntent(); createPendingResult(600, cancelintent, PendingIntent.FLAG_UPDATE_CURRENT); cancelintent.putExtra("imagePath", imagePath); cancelintent.putExtra("position", position); cancelintent.putExtra("todowhat", "cancel"); setResult(RESULT_OK, cancelintent); finish(); break; default: break; } return false; } @Override public void finish() { super.finish(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { switch (requestCode) { case 400: String text = null; Log.v("DrawRectActivity", "onActivityReault imagePath=" + imagePath + imageList.get(position)); if (StringUtil.isNotBlank(text)) { Log.v("DrawRectActivity", "onActivityReault imagePath=" + imagePath + imageList.get(position) + ";text=" + text); } else { } break; default: break; } } super.onActivityResult(requestCode, resultCode, data); } @Override protected void onDestroy() { super.onDestroy(); } }
關(guān)于“Android怎么實(shí)現(xiàn)手勢劃定區(qū)域裁剪圖片”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。