Android 要编辑图像中的裁剪形状吗
我正在从事Android项目,在该项目中,我在自定义视图中裁剪图像,并成功地获得该裁剪图像。现在,我想编辑绘制的形状或根据需要移动该形状。我想编辑绘制的形状,通过触摸和拖动线与完美的边界 这是我的 我越来越像这样了 现在我想在图像上移动造型线或拖动造型线 这是我的自定义视图代码Android 要编辑图像中的裁剪形状吗,android,canvas,crop,custom-view,Android,Canvas,Crop,Custom View,我正在从事Android项目,在该项目中,我在自定义视图中裁剪图像,并成功地获得该裁剪图像。现在,我想编辑绘制的形状或根据需要移动该形状。我想编辑绘制的形状,通过触摸和拖动线与完美的边界 这是我的 我越来越像这样了 现在我想在图像上移动造型线或拖动造型线 这是我的自定义视图代码 public class SomeView extends View implements OnTouchListener { private Paint paint; public static Lis
public class SomeView extends View implements OnTouchListener {
private Paint paint;
public static List<Point> points;
int DIST = 2;
boolean flgPathDraw ;//= true;
public Uri orignalUri;
float origianlheight=0.0f,originalwidth=0.0f,heightratio=0.0f,widthratio=0.0f;
public static int REQUEST_CODE=2;
Point mfirstpoint = null;
boolean bfirstpoint = false;
Point mlastpoint = null;
boolean cropflag=false;
Bitmap bitmap = null;//BitmapFactory.decodeResource(getResources(),R.drawable.bg_crop);
Context mContext;
public void setBitmap(Bitmap bmp,Uri uri){
orignalUri=uri;
points = new ArrayList<Point>();
setFocusable(true);
setFocusableInTouchMode(true);
DisplayMetrics metrics = mContext.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
origianlheight=bmp.getHeight();
originalwidth=bmp.getWidth();
bitmap=bmp;
if (originalwidth > origianlheight) {
Matrix matrix = new Matrix();
matrix.postRotate(90);
bmp = Bitmap.createBitmap(bmp, 0, 0,
bmp.getWidth(), bmp.getHeight(), matrix,
true);
}
//if(origianlheight>originalwidth){
heightratio=height/origianlheight;
// }else{
widthratio=width/originalwidth;
// }
bitmap=Bitmap.createScaledBitmap(bmp, (int)(bmp.getWidth()*widthratio),(int)(bmp.getHeight()*widthratio), true);
// bitmap=bmp;
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0));
paint.setStrokeWidth(5);
paint.setColor(Color.WHITE);
flgPathDraw = true;
this.setOnTouchListener(this);
points = new ArrayList<Point>();
bfirstpoint = false;
cropflag=false;
}
public void clear(){
setFocusable(true);
setFocusableInTouchMode(true);
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0));
paint.setStrokeWidth(5);
paint.setColor(Color.WHITE);
this.setOnTouchListener(this);
points = new ArrayList<Point>();
bfirstpoint = false;
flgPathDraw = true;
cropflag=false;
invalidate();
}
public SomeView(Context c) {
super(c);
mContext = c;
setFocusable(true);
setFocusableInTouchMode(true);
/* DisplayMetrics metrics = c.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
origianlheight=bitmap.getHeight();
originalwidth=bitmap.getWidth();
//if(origianlheight>originalwidth){
heightratio=height/origianlheight;
// }else{
widthratio=width/originalwidth;
// }
bitmap=Bitmap.createScaledBitmap(bitmap, (int)(originalwidth*widthratio),(int)(origianlheight*widthratio), true);*/
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0));
paint.setStrokeWidth(5);
paint.setColor(Color.WHITE);
this.setOnTouchListener(this);
points = new ArrayList<Point>();
bfirstpoint = false;
// flgPathDraw = true;
cropflag=false;
}
public SomeView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setFocusable(true);
setFocusableInTouchMode(true);
/* DisplayMetrics metrics = context.getResources().getDisplayMetrics();
int width = metrics.widthPixels;
int height = metrics.heightPixels;
origianlheight=bitmap.getHeight();
originalwidth=bitmap.getWidth();
//if(origianlheight>originalwidth){
heightratio=height/origianlheight;
// }else{
widthratio=width/originalwidth;
// }
bitmap=Bitmap.createScaledBitmap(bitmap, (int)(originalwidth*widthratio),(int)(origianlheight*widthratio), true);*/
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.STROKE);
paint.setPathEffect(new DashPathEffect(new float[] { 10, 20 }, 0));
paint.setStrokeWidth(5);
paint.setColor(Color.WHITE);
this.setOnTouchListener(this);
points = new ArrayList<Point>();
bfirstpoint = false;
// flgPathDraw = true;
cropflag=false;
}
public void onDraw(Canvas canvas) {
if(bitmap!=null)
canvas.drawBitmap(bitmap, 0, 0,paint);
Path path = new Path();
boolean first = true;
for (int i = 0; i < points.size(); i += 2) {
Point point = points.get(i);
if (first) {
first = false;
path.moveTo(point.x, point.y);
} else if (i < points.size() - 1) {
Point next = points.get(i + 1);
path.quadTo(point.x, point.y, next.x, next.y);
} else {
mlastpoint = points.get(i);
path.lineTo(point.x, point.y);
}
}
canvas.drawPath(path, paint);
}
@Override
public boolean onTouch(View view, MotionEvent event) {
// if(event.getAction() != MotionEvent.ACTION_DOWN)
// return super.onTouchEvent(event);
Point point = new Point();
point.x = (int) event.getX();
point.y = (int) event.getY();
if (flgPathDraw) {
if (bfirstpoint) {
if (comparepoint(mfirstpoint, point)) {
// points.add(point);
points.add(mfirstpoint);
flgPathDraw = false;
// showcropdialog();
cropflag=true;
} else {
points.add(point);
}
} else {
points.add(point);
}
if (!(bfirstpoint)) {
mfirstpoint = point;
bfirstpoint = true;
}
}
invalidate();
Log.e("Hi ==>", "Size: " + point.x + " " + point.y);
if (event.getAction() == MotionEvent.ACTION_UP) {
Log.d("Action up*******~~~~~~~>>>>", "called");
mlastpoint = point;
if (flgPathDraw) {
if (points.size() > 12) {
if (!comparepoint(mfirstpoint, mlastpoint)) {
flgPathDraw = false;
points.add(mfirstpoint);
// showcropdialog();
cropflag=true;
}
}
}
}
return true;
}
private boolean comparepoint(Point first, Point current) {
int left_range_x = (int) (current.x - 3);
int left_range_y = (int) (current.y - 3);
int right_range_x = (int) (current.x + 3);
int right_range_y = (int) (current.y + 3);
if ((left_range_x < first.x && first.x < right_range_x)
&& (left_range_y < first.y && first.y < right_range_y)) {
if (points.size() < 10) {
return false;
} else {
return true;
}
} else {
return false;
}
}
public void fillinPartofPath() {
Point point = new Point();
point.x = points.get(0).x;
point.y = points.get(0).y;
points.add(point);
invalidate();
}
public void resetView() {
points.clear();
paint.setColor(Color.WHITE);
paint.setStyle(Style.STROKE);
flgPathDraw = true;
invalidate();
}
/* private void showcropdialog() {
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
Intent intent;
switch (which) {
case DialogInterface.BUTTON_POSITIVE:
// Yes button clicked
// bfirstpoint = false;
intent = new Intent(mContext, CropActivity.class);
intent.putExtra("crop", true);
intent.putExtra("heightratio", heightratio);
intent.putExtra("widthratio", widthratio);
intent.putExtra("URI", orignalUri.toString());
mContext.startActivity(intent);
break;
case DialogInterface.BUTTON_NEGATIVE:
// No button clicked
intent = new Intent(mContext, CropActivity.class);
intent.putExtra("crop", false);
intent.putExtra("heightratio", heightratio);
intent.putExtra("widthratio", widthratio);
intent.putExtra("URI", orignalUri.toString());
mContext.startActivity(intent);
bfirstpoint = false;
// resetView();
break;
}
}
};
AlertDialog.Builder builder = new AlertDialog.Builder(mContext);
builder.setMessage("Do you Want to save Crop or Non-crop image?")
.setPositiveButton("Crop", dialogClickListener)
.setNegativeButton("Non-crop", dialogClickListener).show()
.setCancelable(false);
}*/
public void Crop(){
if(cropflag){
new SwichTask().execute();
}
}
ProgressDialog progressDialog;
private void showProgressDialog() {
if (progressDialog != null)
progressDialog.show();
else
progressDialog = ProgressDialog.show(mContext, null,"Cropping");
}
private void dismissProgressDialog() {
if (progressDialog != null) {
progressDialog.dismiss();
}
}
private class SwichTask extends AsyncTask<Void, Void, Void> {
@Override
protected void onPreExecute() {
super.onPreExecute();
showProgressDialog();
}
@Override
protected Void doInBackground(Void... params) {
System.out.println("Switch Activity is call");
Intent intent;
intent = new Intent(mContext, CropActivity.class);
intent.putExtra("crop", true);
intent.putExtra("heightratio", heightratio);
intent.putExtra("widthratio", widthratio);
intent.putExtra("URI", orignalUri.toString());
((Activity)mContext).startActivityForResult(intent,REQUEST_CODE);
return null;
}
@Override
protected void onPostExecute(Void result) {
super.onPostExecute(result);
dismissProgressDialog();
}
}
}
public类SomeView扩展了视图实现的OnTouchListener{
私人油漆;
公共静态列表点;
int-DIST=2;
布尔值flgPathDraw;//=true;
公共资源;
浮动原始高度=0.0f,原始宽度=0.0f,高宽比=0.0f,宽宽比=0.0f;
公共静态int请求_代码=2;
点mfirstpoint=null;
布尔bfirstpoint=false;
点mlastpoint=null;
布尔cropflag=false;
位图Bitmap=null;//BitmapFactory.decodeResource(getResources(),R.drawable.bg_-crop);
语境;
公共void setBitmap(位图bmp、Uri){
orignalUri=uri;
points=新的ArrayList();
设置聚焦(真);
setFocusableInTouchMode(真);
DisplayMetrics metrics=mContext.getResources().getDisplayMetrics();
int width=metrics.widthPixels;
int height=metrics.heightPixels;
origianlheight=bmp.getHeight();
originalwidth=bmp.getWidth();
位图=bmp;
if(原始宽度>原始高度){
矩阵=新矩阵();
矩阵旋转后(90);
bmp=Bitmap.createBitmap(bmp,0,0,
bmp.getWidth(),bmp.getHeight(),矩阵,
正确的);
}
//如果(原始高度>原始宽度){
高度比=高度/原始高度;
//}其他{
宽度比=宽度/原始宽度;
// }
bitmap=bitmap.createScaledBitmap(bmp,(int)(bmp.getWidth()*widthratio),(int)(bmp.getHeight()*widthratio),true);
//位图=bmp;
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.笔划);
setPathEffect(新的DashPathEffect(新的float[]{10,20},0));
油漆。设置行程宽度(5);
油漆。设置颜色(颜色。白色);
flgPathDraw=true;
this.setOnTouchListener(this);
points=新的ArrayList();
bfirstpoint=false;
cropflag=假;
}
公共空间清除(){
设置聚焦(真);
setFocusableInTouchMode(真);
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.笔划);
setPathEffect(新的DashPathEffect(新的float[]{10,20},0));
油漆。设置行程宽度(5);
油漆。设置颜色(颜色。白色);
this.setOnTouchListener(this);
points=新的ArrayList();
bfirstpoint=false;
flgPathDraw=true;
cropflag=假;
使无效();
}
公共视图(上下文c){
超级(c);
mContext=c;
设置聚焦(真);
setFocusableInTouchMode(真);
/*DisplayMetrics=c.getResources().getDisplayMetrics();
int width=metrics.widthPixels;
int height=metrics.heightPixels;
origianlheight=bitmap.getHeight();
originalwidth=bitmap.getWidth();
//如果(原始高度>原始宽度){
高度比=高度/原始高度;
//}其他{
宽度比=宽度/原始宽度;
// }
位图=位图。createScaledBitmap(位图,(int)(原始宽度*宽度比),(int)(原始高度*宽度比),true)*/
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.笔划);
setPathEffect(新的DashPathEffect(新的float[]{10,20},0));
油漆。设置行程宽度(5);
油漆。设置颜色(颜色。白色);
this.setOnTouchListener(this);
points=新的ArrayList();
bfirstpoint=false;
//flgPathDraw=true;
cropflag=假;
}
公共SomeView(上下文、属性集属性){
超级(上下文,attrs);
mContext=上下文;
设置聚焦(真);
setFocusableInTouchMode(真);
/*DisplayMetrics=context.getResources().getDisplayMetrics();
int width=metrics.widthPixels;
int height=metrics.heightPixels;
origianlheight=bitmap.getHeight();
originalwidth=bitmap.getWidth();
//如果(原始高度>原始宽度){
高度比=高度/原始高度;
//}其他{
宽度比=宽度/原始宽度;
// }
位图=位图。createScaledBitmap(位图,(int)(原始宽度*宽度比),(int)(原始高度*宽度比),true)*/
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.笔划);
setPathEffect(新的DashPathEffect(新的float[]{10,20},0));
油漆。设置行程宽度(5);
油漆。设置颜色(颜色。白色);
this.setOnTouchListener(this);
points=新的ArrayList();
bfirstpoint=false;
//flgPathDraw=true;
cropflag=假;
}
公共空白onDraw(画布){
if(位图!=null)
drawBitmap(位图,0,0,绘制);
路径路径=新路径();
布尔值优先=真;
对于(int i=0;i