2013-07-07 3 views
0

지금 내 레이아웃이 전체 화면을 차지하고 이미지를 표시하는 Fragment으로 구성되도록했습니다. 나는 추가로 View이 그 위에 있고 전체 화면을 차지하도록 만들고 싶다. 그 최상위 레이어에서, 나는 처음에는 모든 것을 검정색으로 색칠 할 수 있고, 그 다음에는 투명한 (알파?) 특정 스폿을 만들고 그 뒤에있는 조각에 표시된 이미지를 드러내기를 원합니다. 그래서 기본적으로 스크린은 뒤에서 이미지가 보여지는 몇 개의 점을 제외하고는 모두 검은 색이 될 것입니다. 프로그래밍 방식으로 결정할 것입니다. 안드로이드가 제공하는 수많은 그래픽과 뷰를 살펴 보았지만 어디서부터 시작해야하는지 전혀 모른다. 알파의 일부 스팟에서 모두 검게 보이기를 원하면 SurfaceView에 적합합니까?"잘라낸"레이아웃 만들기

올바른보기를 선택하면 onDraw() 메서드를 무시한 다음 canvas.setBody(black)과 같은 작업을 수행 한 다음 알파 모양을 추가 할 것입니다. 도형이 배경색에 올바르게 영향을 줍니까?

public class MaskView extends View { 

    private Set<Rect> mRects = new HashSet<Rect>(); 
    private Paint mUnmaskPaint = new Paint(); 
    { 
     paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR)); 
    } 

    /** 
    * Add an unmasking rectangle to this view's background. 
    * 
    * @param rect 
    *   a rectangle used to unmask the background 
    */ 
    public void addUnmaskRect(Rect rect) { 
     mRects.add(rect); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawColor(Color.BLACK); 
     for (Rect r : mRects) { 
      canvas.drawRect(r, mUnmaskPaint); 
     } 
    } 

} 

귀하의 Fragment : 당신의 마스킹 View를 들어

답변

1

,이 같은 onDraw(Canvas)에서 그들을 (유사 Rect의 또는 무언가) 지역은 마스크를 해제 할 수있는 추적하고 그릴 수있는 사용자 지정보기를 만들 수 있습니다 (또는 마스크 해제 영역을 추적하는 모든 항목)은 RectMaskView 번으로 addUnmaskRect(Rect) 번으로 전달합니다. 보기가 다시 그려 질 때마다 (Rect을 완료 할 때마다 invalidate()에 전화하는 것을 기억하십시오) 먼저 검정색으로 채워지고 검정색 배경이 사각형으로 제거됩니다. 사각형의 좌표는보기의 좌표 공간으로 설정해야하지만, 기본 이미지가 정확히 동일한 영역을 차지하는 경우 상대적으로 간단해야합니다 (View.getLocationInWindow(int[]) 메소드도 참조하십시오).

+0

'canvas.drawCircle (100, 100, 30, mUnmaskPaint);'와 같은 unmask 페인트 예제를 사용해 보았습니다. 그러면 앱이 닫히지 만 충돌은 발생하지 않습니다. LogCat에서'07-07 20 : 04 : 29.806 : A/libc (26164) : 0x00000004 (code = 1)에 치명적 신호 11 (SIGSEGV), 스레드 26164 ()'에서 볼 수 있습니다. 어떤 생각? 나는 가깝다고 느낀다. –

+0

다행입니다! 그러나 onDraw()에서 새 객체를 만드는 것에 대해서는 조심해야합니다 ... 가능한 한 가볍습니다. 프로젝트에서 Android Lint를 실행하면 같은 것을 말하는 경고가 표시 될 수 있습니다. 가장 좋은 방법은 페인트를 만들고 다른 곳에 설치 한 다음보기의 수명 동안 인스턴스 변수로 메모리에 유지하는 것입니다. – happydude

관련 문제