2011-03-20 11 views
20

मेरा विचार एक दूसरे के शीर्ष पर और टच पर 2 छवियों को ओवरलैप करना है, शीर्ष छवि को स्पर्श किए गए त्रिज्या पर पारदर्शी बनाया जाना चाहिए, इस प्रकार नीचे की छवि को उजागर करना। this post मेंटचमैप के कुछ क्षेत्र को स्पर्श पर पारदर्शी बनाएं

 Bitmap bmOverlay = Bitmap.createBitmap(bmp1.getWidth(), bmp1.getHeight(), bmp1.getConfig()); 
     Canvas canvas = new Canvas(bmOverlay); 
     canvas.drawBitmap(bmp1, new Matrix(), null); 
     canvas.drawBitmap(bmp2, new Matrix(), null); 

मैं देखा है और यह पारदर्शी बनाने के लिए नीचे की तरह एक पेंट है:

 mPaint = new Paint(); 
     mPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC)); 
     mPaint.setColor(Color.TRANSPARENT); 
     mPaint.setAntiAlias(true); 

public void onDraw(Canvas canvas) { 
      canvas.drawCircle(40, 40, 30, mPaint); //hardcode to test 
} 

समस्या है, मुझे लगता है कि वृत्त

यह कैसे मैं 2 ओवरले छवियों है सीधे परिभाषित त्रिज्या पर 2 छवियों को पारदर्शी बनाएं, मैं केवल शीर्ष बिटमैप पारदर्शी कैसे बना सकता हूं?

+0

कुछ मेरी पेंट मुझे लगता है कि के साथ गलत है:

मूल रूप से की तरह कुछ प्रयास करें। – SteD

+0

समाधान एंड्रॉइड 4.x पर पूरी तरह से काम करता है लेकिन 2.x पर सर्कल पीछे की छवि दिखाने के बजाय काले हैं। कोई उपाय? – Ixx

उत्तर

36
import android.app.Activity; 
import android.content.Context; 
import android.graphics.Bitmap; 
import android.graphics.Bitmap.Config; 
import android.graphics.BlurMaskFilter.Blur; 
import android.graphics.BitmapFactory; 
import android.graphics.BlurMaskFilter; 
import android.graphics.Canvas; 
import android.graphics.Color; 
import android.graphics.Paint; 
import android.graphics.PorterDuff.Mode; 
import android.graphics.PorterDuffXfermode; 
import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 

public class StartActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(new TouchView(this)); 


    } 

    class TouchView extends View{ 
     Bitmap bgr; 
     Bitmap overlayDefault; 
     Bitmap overlay; 
     Paint pTouch; 
     int X = -100; 
     int Y = -100; 
     Canvas c2; 

     public TouchView(Context context) { 
      super(context); 

      bgr = BitmapFactory.decodeResource(getResources(),R.drawable.bgr); 
      overlayDefault = BitmapFactory.decodeResource(getResources(),R.drawable.over); 
      overlay = BitmapFactory.decodeResource(getResources(),R.drawable.over).copy(Config.ARGB_8888, true); 
      c2 = new Canvas(overlay); 

      pTouch = new Paint(Paint.ANTI_ALIAS_FLAG);   
      pTouch.setXfermode(new PorterDuffXfermode(Mode.SRC_OUT)); 
      pTouch.setColor(Color.TRANSPARENT); 
      pTouch.setMaskFilter(new BlurMaskFilter(15, Blur.NORMAL)); 


     } 

     @Override 
     public boolean onTouchEvent(MotionEvent ev) { 

      switch (ev.getAction()) { 

       case MotionEvent.ACTION_DOWN: { 

        X = (int) ev.getX(); 
        Y = (int) ev.getY(); 
        invalidate(); 

        break; 
       } 

       case MotionEvent.ACTION_MOVE: { 

         X = (int) ev.getX(); 
         Y = (int) ev.getY(); 
         invalidate(); 
         break; 

       }   

       case MotionEvent.ACTION_UP: 

        break; 

      } 
      return true; 
     } 


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

      //draw background 
      canvas.drawBitmap(bgr, 0, 0, null); 
      //copy the default overlay into temporary overlay and punch a hole in it       
      c2.drawBitmap(overlayDefault, 0, 0, null); //exclude this line to show all as you draw 
      c2.drawCircle(X, Y, 80, pTouch); 
      //draw the overlay over the background 
      canvas.drawBitmap(overlay, 0, 0, null); 

     } 


    } 


} 
+0

मैंने इसे दूसरे कैनवास के बिना करने की कोशिश की लेकिन एक्सफर मोड काम नहीं कर सका। ध्यान दें कि "ओवरले" एक परिवर्तनीय बिटमैप है। – Lumis

+1

उत्तर के लिए धन्यवाद, यह पूरी तरह से काम करता है! – SteD

+1

आपका स्वागत है। यह एक दिलचस्प समस्या थी और मुझे आश्चर्य हुआ कि यह उतना आसान नहीं था जितना मैंने शुरू में सोचा था। ऐसा लगता है कि xfer मोड बिटमैप से प्राप्त कैनवास के साथ अपेक्षित काम करते हैं, लेकिन कैनवास के साथ नहीं जो दृश्य से संबंधित है। यही कारण है कि मैंने c2 – Lumis

0

हे, आपको अपने पोस्ट के अंदर जवाब मिल गया है!

public void onDraw(Canvas canvas) {  
    if (myPaintFlag) { 
     canvas.drawBitmap(bmp1, new Matrix(), null); 
     canvas.drawBitmap(bmp2, new Matrix(), mPaint); 
    } 
    else { 
     canvas.drawBitmap(bmp1, new Matrix(), mPaint); 
     canvas.drawBitmap(bmp2, new Matrix(), null); 
    } 
} 
+0

मैंने बिटमैप को आकर्षित करने के लिए mPaint का उपयोग करने का प्रयास किया, लेकिन यह पूरी स्क्रीन केवल काला रंग बन जाएगा। मेरा अनुमान है कि यह पूरे बिटमैप को पारदर्शी बना रहा है? – SteD

+0

यह हो सकता है। ड्रा ऑर्डर बदलने का प्रयास करें। – user432209

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