2016-08-08 5 views
1

내 말을 들으십시오. 배경 위에 다른 비트 맵 위에 겹치고 싶은 배경 비트 맵이 있습니다. 그 위에 투명 컷 아웃이 있습니다. 컷 아웃이 기본 모양이라면 아무런 문제가 없지만 두 개의 원 (잎 모양의 일종)의 교차점이되도록 컷 아웃이 필요합니다. 세 번째 비트 맵을 만들어 컷 아웃 템플릿을 만들려고했으나 컷 아웃 템플릿을 사용하지 않고 깨끗한 컷 아웃 표현을 얻지 못했습니다.투명성을 interstection으로 만들었습니다.

누구나 이런 식으로 행동 할 수 있습니까? 여기

@Override 
public void draw(Canvas canvas) { 
    float w = canvas.getWidth(); 
    float h = canvas.getHeight(); 

    // just used to set some proportions 
    float off = 300f; 

    Paint paint = new Paint(); 

    // make a background bitmap with a yellow to green gradient 
    Bitmap bitmapBkg = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888); 
    Canvas canvasBkg = new Canvas(bitmapBkg); 
    paint.reset(); 
    paint.setShader(new LinearGradient(0, h/2 - off, 0, h/2 + off, Color.YELLOW, Color.GREEN, Shader.TileMode.CLAMP)); 
    canvasBkg.drawRect(new RectF(0, 0, w, h), paint); 

    // make an overlay bitmap with a red to magenta gradient which will have the cutouts 
    Bitmap bitmapOver = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888); 
    Canvas canvasOver = new Canvas(bitmapOver); 
    paint.reset(); 
    paint.setShader(new LinearGradient(0, h/2 - off, 0, h/2 + off, Color.RED, Color.MAGENTA, Shader.TileMode.CLAMP)); 
    canvasOver.drawRect(new RectF(0, 0, w, h), paint); 

    // make a bitmap of intersecting circles to be used as the cutout shape 
    Bitmap bitmapCut = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888); 
    Canvas canvasCut = new Canvas(bitmapCut); 

    paint.reset(); 
    paint.setColor(Color.BLACK); 
    //paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); 
    canvasCut.drawCircle(w/2 - (off/2), h/2, off, paint); 

    paint.reset(); 
    paint.setColor(Color.BLACK); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.XOR)); 
    canvasCut.drawCircle(w/2 + (off/2), h/2, off, paint); 

    // apply cutout to overlay 
    paint.reset(); 
    paint.setColor(Color.BLACK); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_ATOP)); 
    canvasOver.drawBitmap(bitmapCut, 0, 0, paint); 

    // draw background and overlay onto main canvas 
    paint.reset(); 
    paint.setColor(Color.BLACK); 
    canvas.drawBitmap(bitmapBkg, 0, 0, paint); 
    canvas.drawBitmap(bitmapOver, 0, 0, paint); 
} 

내가 얻고 무엇을의 이미지입니다 : 여기 내 (간체) 시도는

enter image description here

내가이 또한 외부 부분 빨간 마젠타있을 것 얻기 위해 노력하고 있어요; 가운데의 눈 모양은 황록색이어야합니다.

+0

어쩌면 PorterDuff을 활용하여 이미지를 결합 할 수 있습니까? http://stackoverflow.com/questions/8280027/what-does-porterduff-mode-mean-in-android-graphics-what-does-it-do –

+0

그게 제가 사용하려고했던 것입니다. – trans

+0

그리고 무엇이 잘못 되었습니까? –

답변

0

트릭을 보니 또 다른 레이어가 추가되었습니다.

// make a secondary overlay that cuts out the whole circles 
    Bitmap bitmapOver2 = Bitmap.createBitmap((int) w, (int) h, Bitmap.Config.ARGB_8888); 
    Canvas canvasOver2 = new Canvas(bitmapOver2); 
    paint.reset(); 
    paint.setShader(new LinearGradient(0, h/2 - off, 0, h/2 + off, Color.RED, Color.MAGENTA, Shader.TileMode.CLAMP)); 
    canvasOver2.drawRect(new RectF(0, 0, w, h), paint); 
    paint.reset(); 
    paint.setColor(Color.BLACK); 
    paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
    canvasOver2.drawCircle(w/2 - (off/2), h/2, off, paint); 
    canvasOver2.drawCircle(w/2 + (off/2), h/2, off, paint); 

과 같이 그것을 적용 :

// draw background and overlay onto main canvas 
    paint.reset(); 
    paint.setColor(Color.BLACK); 
    canvas.drawBitmap(bitmapBkg, 0, 0, paint); 
    canvas.drawBitmap(bitmapOver2, 0, 0, paint); 
    canvas.drawBitmap(bitmapOver, 0, 0, paint); 

은 기본적으로는 속임수와 같은 것이다. 그것은 mid-tier 배경을 두 번, 한 번 전체 원형 컷 아웃 및 다른 하나는 눈 모양 컷 아웃으로 그립니다. 두 개는 원하는 효과를 내기에 적합합니다.

당연히 @ Rotung, 당신 말이 맞을 것입니다. PatharcTo()을 사용하는 것이 훨씬 더 좋은 해결책이 될 것입니다. 그 접근법을 피한 유일한 이유는 b/c arcTo()은 api 21+ 기능입니다. 지금까지 나는 api를 17+ 이상으로 유지해야했습니다. 그러나 누군가가 arcTo() 솔루션을 제공하기를 원한다면 비교할 수 있으면 멋지 겠지요.