2011-11-27 9 views
3

오버레이에 대한 위해 LayoutInflater/ViewStub을 사용하는 방법 : 내 응용 프로그램의 첫 시작에는 실제로 프로그래밍 방식으로 변경 조회수 매우 확신하지 않다, 나는이 문제를 다음 한

, 내가 주를위한 오버레이를 갖고 싶어 화면에는 사용자가 설정해야하는 두 가지 중요한 옵션이 있으므로 설정을 살펴보아야합니다.

AlertDialog을 사용하지 않고 마법사를 사용하고 싶지 않습니다. 그래서, 나는 Go SMS와 비슷한 접근 방식을 취하고 첫 번째 시작에서 오버레이를 생성하기로 결정했습니다.

일반 메뉴 : Normal

먼저 시작 : enter image description here

그래서 이러한 문제는 내가 가진 :

  1. 내가 말했듯이, 나는 돈 내가 만든 모형은 다음과 같습니다 너무 많은 공간이 필요하고 언어와 화면에 독립적이지 않기 때문에 첫 번째 시작시 오버레이 스크린 샷을 사용하고 싶지 않습니다.
  2. 가 나는 PNG로 원을 것이다,하지만 난 이미지에 그것을 넣어하는 방법을 정확히 모르는
  3. 텍스트와 같은 문제
  4. 그리고 마지막으로 나는 이상 반투명 흰색을 데려 가고 싶다는 앱. 그것은 좋을지라도 반드시 아이콘의 구멍이 필요하지는 않습니다.

이 경우 당신은 내가 여기 시작을 얻을 필요가, 당신은 그래서 pastebin

에서 그것을 얻을 수, 레이아웃 소스를 필요가 어떻게 그것을 실현하기 위해 LayoutInflater 또는 ViewStub 등을 사용하는 것이 좋습니다 경우, 나는 그것에 대한 경험이 전혀 없기 때문에 ...

고마워!

/편집 : 더 잘 정리 된 새로운 레이아웃을 업로드했습니다.

답변

1

나는 클라이언트가 전체 화면이 더 하얀색이되어야하는 응용 프로그램을 보길 원했습니다 ("투명"이라고 말했음). 오버레이 연설 거품.
덕분에 다행히 레이아웃이 복잡하지 않게되었습니다.

두 가지 방법으로 투명 효과를 얻을 수 있습니다. 배경이 흰색이거나 모든 뷰를 호출 할 수 있습니다. setAlpha() 메서드를 사용하거나 반투명 한 흰색 오버레이를 만들 수 있습니다.
오버레이를 사용하는 경우 오버레이를 통해 불투명 한 버튼을 표시하는 방법을 찾아야합니다. 약간 복잡 할 수 있습니다. 첫 번째 옵션을 사용하면 불투명 뷰에서 setAlpha (1)을 표시하여 표시 할 수 있습니다.

setAlpha() 메소드는 api 버전 11 이상에서만 사용할 수 있으므로 이전 버전을 타겟팅하는 경우 약간 더 복잡한 방법으로 수행해야 할 수 있습니다. 뷰에 사전 벌집 알파를 설정
예 : 귀하의 버튼에

레이아웃 (너무 그들과 유사하게, 당신이 원하는 그러나 그들을 만들 할 수 있습니다 그들을 통해 루프) :에서

<LinearLayout 
    android:id="@+id/button1" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 
    <ImageView 
     android:tag="image" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/tile"/> 
    <TextView 
     android:tag="text" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textColor="#FF000000" 
     android:text="button1"/> 
</LinearLayout> 

당신의 프로그램, 당신은 버튼을 투명하게 할 때 :

LinearLayout l = (LinearLayout) findViewById(R.id.button1); 
((ImageView)l.findViewWithTag("image")).setAlpha(0x7F); 
((TextView)l.findViewWithTag("text")).setTextColor(0x7F000000); 



때 시간을 투명 효과를 어떻게 만들지 결정한 후에는 오버레이 텍스트/거품을 표시하는 방법을 결정해야합니다. 이 레이아웃을 새 레이아웃의 영향을받지 않도록 전체 레이아웃 위에 별도의 레이어에 넣을 가능성이 큽니다.
이를 달성하는 한 가지 방법은 루트 레이아웃 요소를 FrameLayout으로 변경 한 다음 이에/표시를 만드는 것입니다. 예컨대 : 소개가 표시되면

<FrameLayout background="#FFFF"> <!-- white background, just in case --> 
    <LinearLayout> 
     <!-- the rest of your layout --> 
    </LinearLayout> 
    <LinearLayout visibility="gone"> <!-- this will be your overlay view --> 
     <ImageView /> <!-- the arrow/ring --> 
     <TextView /> <!-- the description --> 
    </LinearLayout> 
</FrameLayout> 

, 당신은 테이블 항목의 위치에 숨겨진 오버레이 뷰의 위치를 ​​설정하는 것은 적절한 문자열/리소스에 텍스트를 변경하고보기를 표시, 설명한다.

소개가 끝나면 모든 버튼의 알파 값을 재설정하고 오버레이의 표시 여부를 다시 설정합니다.

+0

답변 해 주셔서 감사합니다. 그러나, 나는 어떻게 든 코드 작동을 얻지 못한다. 어쩌면 예제 코드를 제공 할 수 있을까요? (당신은 나를 위해 모든 것을 쓸 필요가 없습니다.) – Force

+0

setAlpha()는 벌집에서만 존재한다는 것을 알았 기 때문에 버튼의 투명도를 변경하는 코드를 추가했습니다. 나는 시간이 있기 때문에 몇 가지 예제 코드로 업데이트 할 것이다. – Jave

+0

감사합니다. 이제 완벽하게 작동합니다! :) – Force

0

ViewStub에 대한 많은 경험이 없으므로 LayoutInflater로 할 것입니다.

우선, 현재 레이아웃 위에 두 번째 레이아웃을로드해야합니다. 가장 쉬운 방법은 현재 자식 뷰가있는 FrameLayout과 첫 번째 시작시 두 번째 자식을 동적으로로드하는 것입니다. Activity에서 내용보기를로드하면 이미 생성 된 일부보기 (일부 DecorView, FrameLayout 등)에 연결됩니다. 따라서 기존 FrameLayout을 다시 사용할 수도 있고 새로 만들 수도 있습니다. 더 안정적이기 때문에 두 번째 해결책에 투표 할 것입니다 (방금 레이어의 수를 최소화하려는 경우 다른 가능성을 언급했습니다).

첫 단계로 현재 레이아웃을 FrameLayout 안에 래핑하고 ID를 부여하십시오. "@ id/root"라고합시다.

setContentView(R.layout.main); 
if (isFirstRun()) { 
    ViewGroup parent = (ViewGroup)findViewById(R.id.root); // locate the FrameLayout 
    LayoutInflater li = LayoutInflater.from(this); // get an instance of LayoutInflater 
    li.inflate(R.layout.overlay, parent); 
} 

지금까지 오버레이가로드됩니다

는 그런 다음에서 onCreate 메소드에서, 당신은 이런 식으로 뭔가를 할 수 있습니다. 오버레이를 정의하는 것은 당신에게 달려 있습니다. 미백 효과를 내기 위해서는 오버레이의 루트보기에서 다음 속성을 설정하십시오.xml 레이아웃 :

android:background="#40ffffff" 

원을 배치하려면 먼저 위치를 찾아야합니다. View.getLocationOnScreen을 사용하여 화면의 아이콘 (원 아래)의 절대 좌표를 가져올 수 있습니다.

  • 중 하나가 (오버레이에 대한) 사용자 지정보기를 만들고 수동으로 지정된 위치
  • 에 원을 그리거나 이미지 뷰를 사용하여 원을 추가하고 기반의 왼쪽 상단 여백을 조정 : 다음 두 가지 옵션을 가질 수 있습니다 좌표에서
+0

답변 주셔서 감사합니다. 그러나 LayoutInflater 파트가 작동하지 않습니다. 내가하는 일이나 내가 사용하는 레이아웃에 상관없이 아무 것도 표시되지 않습니다. – Force

+0

다른 답변 (예 :오버레이 레이아웃이 기본 레이아웃에 포함되어 있지만 기본적으로 숨겨져 있음) 또는 계층 뷰어를 사용하여 계층 구조를 더블 체크 (어쩌면 추가되었지만 어떤 이유로 표시되지 않을 수도 있음) –

+0

다른 답변도 작성하겠습니다. 이 하나를 작동 시키려면. 왜냐하면, LayoutInflater에 뭔가 잘못 되었기 때문에'LayoutInflater li = (LayoutInflater) this.getSystemService (LAYOUT_INFLATER_SERVICE);'도 시도했지만 그 중 하나는 작동하지 않았습니다 ... – Force