2011-03-20 10 views
20

내 생각은 서로 위에 두 개의 이미지를 겹치게하고 onTouch에 터치 한 반경에서 상단 이미지를 투명하게 만들어야 하단 이미지가 노출됩니다. 내가 원 생각터치시 비트 맵의 ​​특정 영역을 투명하게 만듭니다.

 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 
} 

문제는 다음과 같습니다 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); 

하고 투명하게 아래처럼 페인트가 있습니다

이 내가이 개 이미지를 오버레이하는 방법입니다 바로 2 개의 이미지를 정의 된 반경에서 투명하게 만드십시오. 어떻게 최상위 비트 맵 만 투명하게 만들 수 있습니까?

+0

뭔가 같아요 내 페인트에 문제가 있습니다 :

는 기본적으로 뭔가를하려고합니다. – SteD

+0

해결책은 Android 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

두 번째 캔버스를 사용하지 않고이 작업을 시도했지만 xfer 모드를 사용할 수 없습니다. "오버레이"는 가변 비트 맵입니다. – 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

관련 문제