2017-02-18 8 views
8

मैं के शीर्ष पर ImageView के भीतर एक छवि पर कुछ साधारण फोटो मैनिपुलेशन पर अपना हाथ आजमा रहा हूं, जिसकी औसत 200dp ऊंचाई है और इसके माता-पिता की चौड़ाई से मेल खाता है।एंड्रॉइड - ड्रैग और फसल मुद्दे

मैं एक कस्टम onTouchListener वर्ग है, जो एक matrix बनाता है और ImageView

खींचें भीतर छवि तब्दील को लागू किया है:

case MotionEvent.ACTION_MOVE: 
    if (mode == DRAG) { 
     matrix.set(savedMatrix); 
     matrix.postTranslate(v.getX(), event.getY() - start.y); 
    } 
    break; 

यह पूरी तरह से काम करता है, यह y पर छवि खींच लेता है अक्ष केवल। लेकिन जब उपयोगकर्ता रिलीज़ करता है तो मैं छवि को ImageView क्षेत्र की सीमाओं तक फसल करना चाहता हूं।

फसल:

case MotionEvent.ACTION_UP: 
    if (mode == DRAG) { 
     Bitmap bitmap = drawableToBitmap(view.getDrawable()); 
     Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight()); 
     view.setImageBitmap(result); 
     } 
     break; 

यह सही आकार के लिए छवि फसलों, लेकिन केवल imageView नहीं दिखाई सीमाओं की पृष्ठभूमि के ऊपर से। Bitmap वर्ग फ़ंक्शन createBitmap(int x, int y, int width, int height) पर कॉल के साथ मेरी एकमात्र धारणा view.getTop() शीर्ष पर शुरू हो रही है।

तो, मेरा प्रश्न है: मैं दृश्य दृश्य सीमाओं और पृष्ठभूमि/मैट्रिक्स सीमाओं के शीर्ष के बीच अंतर की गणना कैसे कर सकता हूं?

The dark blue area is the ImageView

नोट: छवि एक चित्र (नीली) को प्रदर्शित करता है जो एक गतिविधि के शीर्ष पर स्थित है (सियान देख क्षेत्रों सिर्फ पृष्ठभूमि ImageView के अदृश्य सीमाओं, गतिविधि नहीं हैं)

मैं इस बात पर जोर देना चाहता हूं कि मैं इसे प्राप्त करने के लिए किसी तीसरे पक्ष के पुस्तकालयों का उपयोग नहीं करना चाहता हूं।

यदि आवश्यक हो तो मैं अतिरिक्त कोड प्रदान करने के इच्छुक हूं।

अद्यतन:

पूर्ण onTouch विधि:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    ImageView view = (ImageView) v; 
    // Dump touch event to log 
    dumpEvent(event); 

    // Handle touch events here... 
    switch (event.getAction() & MotionEvent.ACTION_MASK) { 
     case MotionEvent.ACTION_DOWN: 
      savedMatrix.set(matrix); 
      start.set(v.getX(), event.getY()); 
      mode = DRAG; 
      originalY.y = (int) event.getY(); 
      break; 
     case MotionEvent.ACTION_UP: 
      if (mode == DRAG) { 
     Bitmap bitmap = drawableToBitmap(view.getDrawable()); 
     Bitmap result = Bitmap.createBitmap(bitmap,view.getLeft(), view.getTop(), view.getWidth(), view.getHeight()); 
     view.setImageBitmap(result); 
     } 
     break; 
     case MotionEvent.ACTION_POINTER_UP: 
      mode = NONE; 
      break; 
     case MotionEvent.ACTION_MOVE: 
      if (mode == DRAG) { 
       matrix.set(savedMatrix); 
       matrix.postTranslate(v.getX(), event.getY() - start.y); 
      } 
      break; 
    } 
    view.setImageMatrix(matrix); 
    return true; // indicate event was handled 
} 
+0

अपनी स्क्रीन गोली मार दी, किसी भी बिटमैप आप पूरे स्क्रीन में पृष्ठभूमि में सेट या आप किसी भी ऊंचाई सेट करूँ में, मुझे पता है तुम 200dp डाल दिया है, लेकिन मैं छवि के अपने दृश्य क्षेत्र है कि बटन पर क्लिक काटी जानी चाहिए सोचता है, इसलिए यदि आप प्रदान करते हैं मुझे वास्तविक छवि के साथ अपनी स्क्रीन जानकारी तो मैं बेखटके आप में मदद मिलेगी .. –

+0

imageView अंदर छवि स्क्रीन की चौड़ाई के लिए क्रॉप किया जाएगा और ऊंचाई पर इसके कट किया जा रहा आधारित (सामान्य पैमाने फसल) का कहना है, तो उपयोगकर्ता को खींच सकते हैं मूल छवि की ऊंचाई जितनी अधिक जगह प्रदान करती है, यह कोई भी छवि होगी (जो न्यूनतम स्क्रीन की चौड़ाई फिट होती है)। केवल बात यह है कि इस में तय हो गई है, imageView ही की ऊंचाई है, मैट्रिक्स आकार गतिशील है, जो मैट्रिक्स शीर्ष और imageView शीर्ष के बीच की दूरी का मतलब है भी गतिशील –

उत्तर

0

गतिविधि की जड़ ऊंचाई की गणना करने के लिए, हम

int height = this.getWindow().getDecorView().getHeight(); 

उपयोग कर सकते हैं या आप

के रूप में प्रदर्शन मीट्रिक का उपयोग करके
DisplayMetrics metrics = context.getResources().getDisplayMetrics(); 
int width = metrics.widthPixels; 
int height = metrics.heightPixels; 

या एक वैश्विक लेआउट श्रोता

जोड़ने
ViewTreeObserver vtObserver = view.getViewTreeObserver(); 
vtObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
@Override 
public void onGlobalLayout() { 
    // check if the view's height and/or width > 0 
    // don't forget to remove the listener when done using removeOnGlobalLayoutListener 
} 

});

+0

कृपया सवाल फिर से पढ़ें। मैं दृश्यमान छवि दृश्य क्षेत्र (नीला) (और उस दृश्य क्षेत्र के शीर्ष की सीमाओं का मूल्य पृष्ठभूमि/मैट्रिक्स सीमाओं (सियान) के शीर्ष पर सीमाओं की तलाश में हूं। ImageView के नीचे गतिविधि के भीतर बहुत सारे विजेट होंगे ताकि गतिविधि की ऊंचाई अनावश्यक हो। –

0

कोड कुछ संदर्भ का अभाव है, लेकिन मुझे लगता है कि जब उपयोगकर्ता खींचकर शुरू होता है आप नए savedMatrix और start बिंदु बना सकते हैं और हर बार onTouchListener कहा जाता है को अपडेट करने या किसी और मुझे समझ नहीं आता कि कैसे अपने कोड बिल्कुल काम करता है।

इसका मतलब है कि यदि ऐसा है तो कि आप वास्तव में अनुवाद आप savedMatrix में की जरूरत है, तो क्यों वहाँ से सही यह नहीं मिलता है? मुझे लगता है कि आप की जरूरत की तरह

int top = savedMatrix.getValues()[Matrix.MTRANS_Y] 

मैं इसे जांच न की हो और Matrix काफी अच्छी तरह से की आंतरिक संरचना को पता नहीं है कुछ है, तो आप top के हस्ताक्षर को उलटने के लिए आवश्यकता हो सकती।

सिडेनोटे: यह स्पष्ट नहीं है कि matrix.postTranslate(v.getX(), event.getY() - start.y); में आप v.getX() क्यों पास करते हैं। शायद यह ठीक काम करता है क्योंकि v.getX() आपके परिदृश्य में हमेशा 0 है।

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