2013-04-21 5 views
2

저는 경로를 렌더링하여 지구본을 그립니다. 지구의 가장자리가 매우 날카 롭고 가장자리를 부드럽게 만들어 시각적으로 매력적으로 보이고 싶습니다.방사형 그래디언트 투명도로 반지 만들기

성능 향상을 위해 은선 제거를 수행하지 않습니다. 나는 Path의 각 점 (사용자가보고있는 지구의 측면)이 보이는지 여부를 계산하고 가장 가까운 모서리로 Path를 그립니다. 이를 숨기려면 전체보기 위에 비트 맵을 그리고 지구를보기 위해 구멍을 뚫습니다.

가장자리를 부드럽게하려면 방사형 그래디언트 투명도로 반지를 만들려고합니다. 이 방법은 마스크를 만듭니다

private void createMask(int width, int height, double radius) { 

     if(radius==0){return;} 

     if (mask != null) { 
      mask.recycle(); 
     } 

     mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); 

     // create a RadialGradient 
     RadialGradient gradient = new android.graphics.RadialGradient(
       kHorizontalOffset, kVerticalOffset, 
       30f, 0x00FF0000, 0xFFFF0000, 
       android.graphics.Shader.TileMode.CLAMP); 


     // TODO move to init() 
     Paint p = new Paint(); 
     p.setShader(gradient); 
     //p.setColor(0xFF000000); 
     p.setColor(0xFFFF0000); 
     p.setStrokeWidth(20f); 
     p.setStrokeCap(Paint.Cap.ROUND); 
     p.setStyle(Paint.Style.STROKE); 
     p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER)); 

     Canvas maskCanvas = new Canvas(mask); 
     maskCanvas.drawColor(Color.BLACK); 

     final RectF rect = new RectF(); 
     rect.set((float)(kHorizontalOffset - radius + 50), (float)(kVerticalOffset - radius + 50), 
       (float)(kHorizontalOffset + radius - 50), (float)(kVerticalOffset + radius - 50)); 

     // draw transparent circle using the maskPaint 
     maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint); 

     // draw the radial gradient ring 
     maskCanvas.drawArc(rect, -90, 360, false, p); 

    } 

내 문제는 상관없이 내가 무엇을 사용 PortDuff.Mode, 난 항상 링 가장자리에서 오프셋이 예에서와 같이 고체 링 (또는 링)를 얻을 수 없다는 것입니다 그리고 내가 무슨 일이 일어나고 있는지 알 수 있도록 붉은 색으로 칠했다.

enter image description here

이 작업을하는 방법에 어떤 아이디어?

답변

1

문제는 색상을 설정하는 방법이라고 생각합니다.

색상 구성 요소는 (알파, R, G, B)이며 각각 0 ~ 255입니다. 0xFFFF0000을 쓸 때. 알파 값은 투명도를 설정합니다. 알파를 FF로 설정하면 완전히 불투명하며 00은 완전히 투명 함을 의미합니다. 그래서 알파 값을 변경하려고 시도해보십시오. 아마도 0x70FF0000과 같은 값일 것입니다.

+0

감사합니다,하지만 난 알파가 작동하는 방법을 알고있다. 가장자리 주변의 색이 바랜 모양을 얻으려면 방사형 투명도가 필요합니다. – Simon

+0

@ Simon이 도움이 될 수도 있습니다. http://stackoverflow.com/questions/8481322/create-a-radial-gradient-programmatically – Elior

+0

글쎄, 다른 접근 방식을 사용하여 답변을 찾았지만,이 시간을 보내 주셔서 감사합니다. . +1. 감사. – Simon

1

더 나은 해결책을 찾았고, 제가 원하는 것을 더 작고 빠른 방법으로 끝 냈습니다. 싫어하는게 뭐야?

private void createMask(int width, int height, double radius) { 

    if(radius==0){return;} 

    if (mask != null) { 
     mask.recycle(); 
    } 

    mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444); 

    Canvas maskCanvas = new Canvas(mask); 
    maskCanvas.drawColor(Color.BLACK); 

    maskPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.INNER)); 
    maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint); 

} 

이것의 핵심은 BlurMaskFilter 원이 경우에, 페인트 사용되는 어떤 영역의 내측 흐림 도료에 적용된다. 그것은 단지 미묘한 내가 찾던 효과가 있습니다 답변에 대한

enter image description here

관련 문제