2012-10-31 26 views
5

Chcę przyciąć obraz z galerii lub aparatu, a także uzyskać współrzędne X i Y dla oryginalnego obrazu, a nie przycięte.Współrzędne Androida do drukowania

Wymagam tych współrzędnych, aby użyć ich w żądaniu POST, gdzie przesyłam oryginalny obraz i współrzędne przycięcia.

Jak to zrobić?

+1

Proszę załączyć kod jak się masz przeciwstawiając się obrazowi. – vasart

+0

Nie ma kodu, ponieważ nie wiem jak. – BarkovAndrey

+0

@BarkovAndrey, czy masz pomysł, jak to zrobić? Mam do czynienia z podobnym problemem, wciąż próbując dowiedzieć się, jak to zrobić .. – San

Odpowiedz

0

Należy użyć klasy DragRectView, aby odczytać wszystkie zdarzenia dotykowe i zdarzenia ruchu, a następnie narysować prostokąt na płótnie. Za pomocą funkcji onTouchEvent można uzyskać współrzędne z wartości X i 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); 
     } 
    } 
} 

A to będzie główną metodą:

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

Odpowiedź z lockdawn pracował dla mnie, ale musiałem poprawić tę linię ...

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

myślę linię powinno być:

Math.max(mEndX, mStartX), Math.max(mEndY,  mStartY))); 
Powiązane problemy