这篇文章主要介绍“Android怎么实现手势划定区域裁剪图片”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Android怎么实现手势划定区域裁剪图片”文章能帮助大家解决问题。
需求:
拍照,然后对图片进行处理,划定矩形区域,将矩形区域裁剪下来
思路:
1、使用系统相机拍照,拍完返回,对图片进行压缩和存储。
2、新建一个activity处理图片裁剪,利用自定义view在画布上画出矩形区域。
3、根据坐标信息生成裁剪图片并存储。
部分核心代码:
1、调用系统相机拍照
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); // 默认系统相机
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;//绘画标记位
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;//绘画选择区域
private int capX;//绘画开始的横坐标
private int capY;//绘画开始的纵坐标
private int capM;//绘画结束的横坐标
private int capN;//绘画结束的纵坐标
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;
}
/**
* 判断是否相应的图片格式
*/
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:这里需要针对部分机型做适配
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();
}
}