2013-06-26 5 views
5

जो मैं करना चाहता हूं वह है कि मेरे एंड्रॉइड एप्लिकेशन के उपयोगकर्ता को चेहरे पर अंक चुनने और उस स्पर्श से एक्स और वाई निर्देशांक पुनर्प्राप्त करने दें। कृपया नीचे दी गई तस्वीर देखें।चयन से केंद्र बिंदु XY निर्देशांक पुनर्प्राप्त करें

Coordinates from face

मैं उपयोगकर्ता चयन वर्ग के आकार को बदलने में सक्षम होना चाहते हैं।

अभी तक मेरे पास नीचे कोड है, लेकिन मुझे ईमानदारी से पता नहीं है कि वहां से कहाँ जाना है। मैं आयत को चित्रित करने और स्थानांतरित करने के बारे में कैसे जा सकता हूं (और उसके बाद एक्स और वाई केंद्रपॉइंट निर्देशांक वापस कर सकते हैं)? I'm sure there's an Android feature for this.

private void selectImg(){ 
    //retrieve X and Y values from touch 
    surfaceView.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View view, MotionEvent pos) { 
      //retrieve position when user finishes touch 
      if (pos.getAction() == MotionEvent.ACTION_UP){ 
        Log.d("X",String.valueOf(pos.getX())); 
        Log.d("Y",String.valueOf(pos.getY())); 
      } 
      return true; 
     } 
    });  
} 

धन्यवाद!

उपयोगी हो सकता है: Custom Android Image Crop https://github.com/dtitov/pickncrop/blob/master/src/com/github/pickncrop/MainActivity.java

+0

आप परिणाम छवि पोस्ट कर सकने में मदद करता है अगर मैं इस छवि है कि चयनित पीला आयत तो बड़ा कैसे परिणाम वाला की तरह लग रहा है बनाते हैं? – KOTIOS

उत्तर

1

खैर अगर मैं अपने कोड के अनुसार आप एक SurfaceView उपयोग कर रहे हैं तो यह अंदर आकर्षित करने के लिए आप स्वीकार किए जाते हैं जवाब hereprivate void drawMyStuff(final Canvas canvas) अंदर आप आयतों आप चाहते हैं आकर्षित करने के लिए कोड रखना होगा जहां पढ़ सकते हैं सही ढंग से समझ, और हर बार जब आप कुछ बदलते हैं (निर्देशांक की तरह) SurfaceView को फिर से निकालने के लिए invalidate() पर कॉल करें।

इसके अलावा आप अपना खुद का कस्टम View बना सकते हैं और इसके अंदर आकर्षित कर सकते हैं, आप एक प्रोजेक्ट उदाहरण देख सकते हैं जिसका उपयोग मैं अपने प्रोजेक्ट here में कर रहा हूं।

आपके पास Canvas का उपयोग करके SurfaceView के अंदर आयतों को आकर्षित करने के लिए स्पर्श के समन्वय (x, y) निर्देशांक हैं।यहाँ कुछ कोड आप संदर्भ के लिए उपयोग कर सकते हैं, तुम सब करने के लिए है (एक्स, वाई) द्वारा संख्या को बदलने का समन्वय करता है जहाँ आप आकर्षित करने के लिए चाहते हैं:

Paint paint = new Paint(); 
paint.setColor(Color.BLACK); 
paint.setStrokeWidth(3); 
canvas.drawRect(30, 30, 80, 80, paint); 
paint.setStrokeWidth(0); 
paint.setColor(Color.CYAN); 
canvas.drawRect(33, 60, 77, 77, paint); 
paint.setColor(Color.YELLOW); 
canvas.drawRect(33, 33, 77, 60, paint); 

अब आप अपने आयत आकार बदलने के लिए आप को बचाने के लिए होगा कहीं समन्वयित करता है, आप अपने आयत के लिए निर्देशांक को बचाने के लिए Rect का उपयोग कर सकते हैं। फिर उन्हें फिर से आकार देने के लिए आप टचस्क्रीन से निर्देशांक पढ़ सकते हैं और देख सकते हैं कि वे आपके कुछ आयताकार निर्देशांक के पास हैं या नहीं। मैं करीब कहता हूं क्योंकि कोने के समन्वय को ठीक करना मुश्किल होगा, आपको यह देखना होगा कि यह उदाहरण के लिए कोने के चारों ओर + -10 पिक्सेल में है या नहीं। आयताकार आकार का ख्याल रखना शायद उन 10 पिक्सेल आयताकार चौड़ाई या ऊंचाई हैं।

अंत में ACTION_DOWN पर आप कोने पर नज़र रखने के रूप में मैं पहले लिख सकते हैं और ACTION_UP पर ले कोने के नए निर्देशांक आप ACTION_DOWN पर पहले पता लगाया है, तो, आप invalidate() फोन अपने आयतों पुनः बनाने का और आपका काम हो गया!

मुझे आशा है कि तुम मुझे समझा और आप किसी तरह :)

4

मुझे यकीन है कि आप कैसे अनुप्रयोग के बहुत कुछ किया है नहीं कर रहा हूँ। हालांकि, आपको वर्गों को खींचने वाले बनाम वर्गों को स्थानांतरित करने की पहचान करने के लिए एक तरीका चाहिए। आप इसे बटन से कर सकते हैं या आप इसे डिज़ाइन पर कर सकते हैं (अंदर के वर्ग से आगे बढ़ें और सीमा से खिंचाव)।

@Override 
    public boolean onTouch(View view, MotionEvent pos) { 
     //retrieve position when user finishes touch 
     if (pos.getAction() == MotionEvent.ACTION_UP){ 
       Log.d("X",String.valueOf(pos.getX())); 
       Log.d("Y",String.valueOf(pos.getY())); 
     } 
     //pseudo code 
     //if user is dragging 
      //get new dragged position 
      //if boundaries are being dragged 
       //redraw square to match new dragged position (requires some math to stretch properly) 
      //else if inside boundaries being dragged 
       //redraw the square to new dragged position (center it) 

     return true; 
    } 

आपको वर्गों को फिर से निकालने के उदाहरणों को देखना होगा। मुझे यकीन नहीं है कि आप उन्हें पहली जगह कैसे खींच रहे हैं।

संपादित करें: यहां कुछ उपयोगी स्रोत हैं।

Moving image with touch events

Android: How to stretch an image to the screen width while maintaining aspect ratio?

2

चूंकि आप पहले से स्पर्श की बात हो रही है सब आप कर सकते हैं एक आयत बनाएं या चौराहे के आसपास है: यदि आप दो गठबंधन, आप आसानी से अपने लक्ष्य तक पहुँचने में सक्षम होना चाहिए यह डिफ़ॉल्ट आकार

Point touchPoint=new Point(x, y); 
Paint paint = new Paint(); 
paint.setColor(Color.parseColor("#00CCFF")); 
canvas.drawRect(x, y, x+100, y+100, paint); 

फिर आयत में स्पर्श के बिंदु के आधार पर आप या तो आयताकार खींच सकते हैं या स्केल कर सकते हैं।
एक Google ट्यूटोरियल है जिसका उपयोग आप आयताकार खींचने और स्केल करने के लिए कर सकते हैं।
लिंक के नीचे खोजें।
http://developer.android.com/training/gestures/scale.html

संबंधित मुद्दे