19

मैं उपयोगकर्ता को छवि को छूने की अनुमति देने की कोशिश कर रहा हूं और फिर मूल रूप से एक परिपत्र आवर्धक दिखाएगा जो उपयोगकर्ता को छवि पर एक निश्चित क्षेत्र का बेहतर चयन करने की अनुमति देगा। जब उपयोगकर्ता स्पर्श को जारी करता है तो बड़ा हिस्सा गायब हो जाएगा। इसका उपयोग कई फोटो संपादन ऐप्स पर किया जाता है और मैं इसके अपने संस्करण को लागू करने की कोशिश कर रहा हूं। मेरे पास नीचे दिया गया कोड छविदृश्य के गोलाकार भाग को बड़ा करता है लेकिन मेरी अंगुली को छोड़ने के बाद ज़ूम को हटा या साफ़ नहीं करता है। मैं वर्तमान में canvas = new Canvas(bitMap); का उपयोग कर कैनवास में बिटमैप सेट करता हूं और फिर takenPhoto.setImageBitmap(bitMap); का उपयोग करके छविदृश्य सेट करता हूं, मुझे यकीन नहीं है कि मैं इसके बारे में सही तरीके से जा रहा हूं या नहीं। onTouch कोड के नीचे है:एंड्रॉइड - सर्कुलर ज़ूम/छवि का हिस्सा कैसे बढ़ाएं?

zoomPos = new PointF(0,0); 
     takenPhoto.setOnTouchListener(new OnTouchListener() { 

      @Override 
      public boolean onTouch(View v, MotionEvent event) { 
       int action = event.getAction(); 
        switch (action) { 
         case MotionEvent.ACTION_DOWN: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          shader.setLocalMatrix(matrix); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_MOVE: 
          zoomPos.x = event.getX(); 
          zoomPos.y = event.getY(); 
          matrix.reset(); 
          matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
          canvas.drawCircle(zoomPos.x, zoomPos.y, 20, shaderPaint); 
          takenPhoto.invalidate(); 
          break; 
         case MotionEvent.ACTION_UP: 
          //clear zoom here? 

          break; 
         case MotionEvent.ACTION_CANCEL: 
          break; 
         default: 
          break; 
      } 
        return true; 
      } 
      }); 
+0

मैं अगर मैं यह सही समझ में पता नहीं है के लिए बजाय अपने लेआउट फ़ाइल में निम्न कोड का उपयोग, लेकिन आप कह रहे हैं कि कैसे एक ज़ूम प्रभाव स्पष्ट करने के लिए एक छवि पर? एक अलग बिटमैप में मूल छवि को क्यों न सहेजें। जब उपयोगकर्ता ज़ूम का उपयोग करता है और यह आवर्धक ग्लास प्रभाव से छुटकारा पाने का समय है, तो मूल बिटमैप का उपयोग करें और इसे कैनवास पर फिर से खींचें और इस प्रकार ज़ूम के साथ छवि को मिटा दें। –

+0

नहीं, मुझे छविदृश्य पर आवर्धक सर्कल नहीं मिल रहा है। क्या आप कुछ और कक्षा साझा करेंगे, जहां कोड काम कर रहा है? –

+0

मुझे गैलरी के केंद्र में एक पारदर्शी ओवरले फ्रेम में छवि को ज़ूम करने की आवश्यकता भी है, जिसकी छवि कभी भी ज़ूम हो जाती है, कृपया – Ravi

उत्तर

16

अपना कोड अपनाना, मैं निम्नलिखित दृष्टिकोण को काम करने में सक्षम था।

onTouch समारोह में, निर्धारित करने, जहां उपयोगकर्ता को छुआ है के लिए एक वैश्विक बिंदु निर्धारित, और इंगित करते हैं कि संभवत: ज़ूम वर्तमान में सक्रिय या है कोई बूलियन सेट:, तब

@Override 
public boolean onTouch(View view, MotionEvent event) { 

    int action = event.getAction(); 

    zoomPos.x = event.getX(); 
    zoomPos.y = event.getY(); 

    switch (action) { 
    case MotionEvent.ACTION_DOWN: 
    case MotionEvent.ACTION_MOVE: 
     zooming = true; 
     this.invalidate(); 
     break; 
    case MotionEvent.ACTION_UP: 
    case MotionEvent.ACTION_CANCEL: 
     zooming = false; 
     this.invalidate(); 
     break; 

    default: 
     break; 
    } 

    return true; 
} 

OnDraw विधि में, आप भाग में ज़ूम इन किया बैठक के लिए अपने कोड का उपयोग करें:

@Override 
protected void onDraw(Canvas canvas) { 

    super.onDraw(canvas); 

    if (zooming) { 
     matrix.reset(); 
     matrix.postScale(2f, 2f, zoomPos.x, zoomPos.y); 
     mPaint.getShader().setLocalMatrix(matrix); 

     canvas.drawCircle(zoomPos.x, zoomPos.y, 100, mPaint); 
    } 
} 

ध्यान दें कि शेडर के लिए, मैं एक बिटमैप शेडर वर्णित here के रूप में है, जो साथ बनाया गया था इस्तेमाल किया:

mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image); 
mShader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); 

mPaint = new Paint(); 
mPaint.setShader(mShader); 
+0

हे धन्यवाद धन्यवाद आदमी यह निश्चित रूप से –

+0

@qzikl में सहायता करता है, कृपया आप कुछ और बता सकते हैं ? या यदि आप लिख सकते हैं कि ड्रॉ विधि कहां घोषित करें और यहां मैट्रिक्स क्या है? –

+0

हे उपरोक्त कोड के लिए धन्यवाद। क्या किसी निश्चित स्थिति पर आवर्धित ज़ूम किए गए दृश्य को दिखाने का कोई तरीका है? –

6

सबसे अच्छा तरीका है छवि में किए गए बदलाव वापस लौटने के लिए स्रोत फ़ाइल से छवि को फिर से लोड करने के लिए किया जाएगा। या वैकल्पिक रूप से, MotionEvent.ACTION_UP के दौरान मूल मैट्रिक्स लोड करते समय, परिवर्तनों से पहले एक प्रतिलिपि मूल मैट्रिक्स चर रखें।

0

आप इसे कस्टम छविदृश्य का उपयोग कर कार्यान्वित कर सकते हैं, अपने पैकेज में क्लास कोड्सफोर्मिफायर इमेज व्यू.जावा बनाएं। आप CodesforMagnifier.java पर संबंधित वर्ग के लिए कोड देख सकते हैं और बस imageView

<com.yourpackage.CodesforMagnifierImageView 
    android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/your image" /> 
संबंधित मुद्दे