2016-07-19 1 views
2

셰이프를 그리는 데 사용하는 사용자 지정 SurfaceView를 만들었으며 사용자는 셰이프와 상호 작용하도록 뷰를 확대/축소하고 팬 할 수 있습니다. 이 모든 것이 효과적이지만 문제는 이제 도형이 항상 상단에 그려지고 내 화면에는뿐 아니라 버튼 및 textviews와 같은 다른 뷰 위에 그려지는 것입니다. XML 레이아웃에서 여러 가지 방식으로 사용자 정의보기와 단추를 정렬하려고 시도했지만 FrameLayouts 및 RelativeLayouts (as suggested here)에 대한보기를 부모로 사용하려고했습니다.다른 뷰 위에 그리기 사용자 지정 SurfaceView 방지

버튼과 다른 레이아웃 요소를 내 사용자 정의보기 위에 띄우고 싶습니다. 아래 이미지에서 볼 수 있듯이, 내 뷰를 패닝하면 직사각형이 단추를 가린다.

내 맞춤형 SurfaceView가 모든 것을 그릴 수 없게하려면 어떻게해야합니까?

public class CustomShapeView extends SurfaceView implements Runnable, SurfaceHolder.Callback { 

/* Other implementation stuff */ 

@Override 
public void run() { 
    while (isDrawing) { 
     if (!holder.getSurface().isValid()) 
      continue; //wait till it becomes valid 

     Canvas canvas = null; 
     try { 
      canvas = holder.lockCanvas(null); 
      synchronized (holder) { 
       try { 
        lock.lock();         
        canvas.concat(sampleMatrix); 
        canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); 
        drawShapes(canvas);      
       } finally { 
        lock.unlock(); 
       } 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (canvas != null) { 
       holder.unlockCanvasAndPost(canvas); 
      } 
     }  
    } 
} 
} 

내 테스트 XML 레이아웃, 나는 뒤에있는 버튼 (왼쪽)을 만들 기대 :

enter image description here

내 그리기 코드는 서피스 뷰 SurfaceView 클래스에서 별도의 스레드에서 실행 사용자 정의보기 및 버튼 사용자 정의보기 위에 떠있다 (오른쪽)입니다 : 나는 유사한 문제에 직면하고있어

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent"> 

<Button 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Left" 
    android:id="@+id/button" 
    android:layout_alignParentBottom="true" 
    android:layout_alignParentLeft="true"/> 

<FrameLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <com.example.CustomShapeView 
     android:id="@+id/floor_plan_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     /> 
</FrameLayout> 

<RelativeLayout 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Right" 
     android:id="@+id/button2" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true"/> 
</RelativeLayout> 
</RelativeLayout> 

답변

2

내 코드에서 표면 모양이 항상 모든 것 위에 그려지는 것을 확인하는 함수 setZOrderOnTop(true);을 호출했습니다. 이 코드 조각은 단색 대신 캔버스에 대한 사용자 지정 배경을 갖기 위해 이전 개발자가 남겨 둡니다. SurfaceView를 사용하면 캔버스에 대한 사용자 정의 배경을 갖는 것과 캔버스 위에 뷰를 그릴 수 있다는 것 사이에는 절충점이 있습니다.

옵션은 사용자 정의 배경 있지만 오버레이 뷰가있을 수 setZOrderOnTop(true);으로

  1. 이다.
  2. setZOrderOnTop(false);을 사용하면 캔버스에 단색 배경 만 오버레이 할 수 있습니다 (예 : 그려지는 호출간에 지우는 canvas.drawColor(Color.WHITE);).

두 번째 옵션은 사용자 정의 배경 위에 오버레이 뷰 오버레이 값을 선택했습니다.

0

. RelativeLayout에서 움직이는 다른보기 사이에 투명 SurfaceView을 넣고 싶습니다. 그렇게하면 애니메이션보기가 때때로 사라지거나 때로는 일부만 표시 될 수도 있습니다. 이상하게 보입니다. 그런 다음 먼저 SurfaceView을 레이아웃에 놓은 다음 (하단) SurfaceView.setZOrderMediaOverlay(true)을 호출하면 SurfaceView의 내용이 창 하단에 그려지고, 맨 위에보기가 그려집니다. 레이아웃의 어느 곳에서든 SurfaceView를 놓은 다음 SurfaceView.setZOrderOnTop(true)을 호출하면 내용은 항상 창 상단과보기 상단에 그려집니다. 만약 내가보기 사이에 SurfaceView을 넣으면 그 행동은 미친 것이다. 어쩌면 그것은 SurfaceView의 내용이 분리 된 스레드에서 가져오고 GUI (메인) 스레드에서 뷰를 가져와 "싸우고"있는 이유 일 수있다. 내가 찾은 유일한 방법은 바닥이나 맨 위에 그림을 그려주는 것입니다. 첫 번째 경우에 설명 된대로 SurfaceView이 맨 아래에있는 투명한 배경을 가진 새로운 Fragment을 만들고 위에 놓고 싶은 버튼을 위에 놓으십시오 (나중에 RelativeLayout 또는 FrameLayout에 추가하십시오). 그러면이 조각을 보여줍니다. 당신이 그 아래에 갖고 싶은 콘텐츠를 보유하고있는 활동의 상단에 바라기를 나는 조금 도왔다.

관련 문제