2012-10-31 38 views
5

我想從圖庫或照相機裁剪圖像,並獲取原始圖像的裁剪座標X和Y,而不是裁剪的圖像。Android作物座標

我需要這些座標以便在POST請求中使用它們,在那裏我發送原始圖像和裁剪的座標。

我該怎麼做?

+1

請附上代碼你是怎麼回事採用圖像。 – vasart

+0

沒有代碼,因爲我不知道如何。 – BarkovAndrey

+0

@BarkovAndrey,你知道如何解決這個問題嗎?我面臨類似的問題,仍然試圖找出如何做到這一點。 – San

回答

0

您需要使用DragRectView類讀取所有觸摸事件和運動事件,然後在Canvas中繪製一個矩形。使用onTouchEvent函數,您可以從X和Y值中獲取座標。

import android.content.Context; 
import android.graphics.Canvas; 
import android.graphics.Paint; 
import android.graphics.Rect; 
import android.text.TextPaint; 
import android.util.AttributeSet; 
import android.view.MotionEvent; 
import android.view.View; 

public class DragRectView extends View { 

    private Paint mRectPaint;  
    private int mStartX = 0; 
    private int mStartY = 0; 
    private int mEndX = 0; 
    private int mEndY = 0; 
    private boolean mDrawRect = false; 
    private TextPaint mTextPaint = null; 

    private OnUpCallback mCallback = null; 

    public interface OnUpCallback { 
     void onRectFinished(Rect rect); 
    } 

    public DragRectView(final Context context) { 
     super(context); 
     init(); 
    } 

    public DragRectView(final Context context, final AttributeSet attrs) { 
     super(context, attrs); 
     init(); 
    } 

    public DragRectView(final Context context, final AttributeSet attrs,  final int defStyle) { 
     super(context, attrs, defStyle); 
     init(); 
    } 

    public void setOnUpCallback(OnUpCallback callback) { 
     mCallback = callback; 
    } 

    private void init() { 
     mRectPaint = new Paint(); 
      mRectPaint.setColor(getContext().getResources().getColor(android.R.color.holo_gr een_light)); 
     mRectPaint.setStyle(Paint.Style.STROKE); 
     mRectPaint.setStrokeWidth(5); 

     mTextPaint = new TextPaint(); 
      mTextPaint.setColor(getContext().getResources().getColor(android.R.color.holo_gr een_light)); 
     mTextPaint.setTextSize(20); 
    } 

    @Override 
    public boolean onTouchEvent(final MotionEvent event) { 

     switch (event.getAction()) { 
      case MotionEvent.ACTION_DOWN: 
       mDrawRect = false; 
       mStartX = (int) event.getX(); 
       mStartY = (int) event.getY(); 
       invalidate(); 
       break; 

      case MotionEvent.ACTION_MOVE: 
       final int x = (int) event.getX(); 
       final int y = (int) event.getY(); 

       if (!mDrawRect || Math.abs(x - mEndX) > 5 || Math.abs(y -  mEndY) > 5) { 
        mEndX = x; 
        mEndY = y; 
        invalidate(); 
       } 

       mDrawRect = true; 
       break; 

      case MotionEvent.ACTION_UP: 
       if (mCallback != null) { 
        mCallback.onRectFinished(new Rect(Math.min(mStartX,  mEndX), Math.min(mStartY, mEndY), 
          Math.max(mEndX, mStartX), Math.max(mEndY,  mStartX))); 
       } 
       invalidate(); 
       break; 

      default: 
       break; 
     } 

     return true; 
    } 

    @Override 
    protected void onDraw(final Canvas canvas) { 
     super.onDraw(canvas); 

     if (mDrawRect) { 
      canvas.drawRect(Math.min(mStartX, mEndX), Math.min(mStartY, mEndY), 
        Math.max(mEndX, mStartX), Math.max(mEndY, mStartY), mRectPaint); 
      canvas.drawText(" (" + Math.abs(mStartX - mEndX) + ", " + Math.abs(mStartY - mEndY) + ")", 
        Math.max(mEndX, mStartX), Math.max(mEndY, mStartY),  mTextPaint); 
     } 
    } 
} 

,這將是主要的方法:

import android.app.Activity; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Rect; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 

    private static final String TAG = "MainActivity"; 
    Bitmap Imag; 
    ImageView view; 
    TextView text; 
    int picw, pich; 
    int pix[]; 
    int x1, x2, y1, y2; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     final DragRectView view2 = (DragRectView)  findViewById(R.id.dragRect); 
     Imag = BitmapFactory.decodeResource(getResources(), R.drawable.rgb); 
     picw = Imag.getWidth(); 
     pich = Imag.getHeight(); 
     view = (ImageView) findViewById(R.id.image); 
     view.setImageBitmap(Imag); 
     text = (TextView) findViewById(R.id.tex); 
     pix = new int[picw * pich]; 

     if (null != view2) { 
      view2.setOnUpCallback(new DragRectView.OnUpCallback() { 
       @Override 
       public void onRectFinished(final Rect rect) { 
        x1 = rect.left; 
        y1 = rect.top; 
        x2 = rect.right; 
        y2 = rect.bottom; 

        Toast.makeText(getApplicationContext(), "Coordenadas (" + x1 + ", " + y1 + ", " + x2 + ", " + y2 + ")", Toast.LENGTH_LONG).show(); 
       } 
      }); 
     } 
    } 
}  
0

從lockdawn回答爲我工作,但我不得不糾正這一行...

Math.max(mEndX, mStartX), Math.max(mEndY,  mStartX))); 

我覺得行應該是:

Math.max(mEndX, mStartX), Math.max(mEndY,  mStartY)));