2011-12-14 2 views
-1

Situtation :이미지 마스크를 구현하는 방법은 무엇입니까?

사용자가 클릭 한 화면의 부분에 따라 사용자가 어떤 것을 트리거 할 수있게 해주는 작은 응용 프로그램을 작성 중입니다. 테디 베어의 그림을 상상해보십시오. 코를 클릭하면 "코"라고 말합니다. 내가 한 일은 레이아웃 xml에 LinearLayout을 넣는 것입니다. 화면 크기를 다르게해야하기 때문에 xml 레이아웃 파일에서 배경을 설정하지 않았습니다.

조각 형태의 XML :

<FrameLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/viewMain"    
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:visibility="visible" >  
    <LinearLayout 
     android:id="@+id/viewThouShaltRespondToClicks" 
      android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:clickable="true" 
     android:orientation="vertical" 
     android:longClickable="true" 
     android:visibility="visible" /> 

    <!-- mask --> 
    <LinearLayout 
    android:id="@+id/viewInvisibleMask" 
    android:visibility="invisible" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    </LinearLayout> 
</FrameLayout> 

그리고 그 활동에서 onCreate 이벤트에 나는 디스플레이 해상도를 확인하고 setBackgroundResource를 통해() 적절한 배경을 설정합니다. 각 해상도마다 배경 이미지를 준비했습니다.

final Point QVGA = new Point(240,320); // portrait 
// Obtain the screen resolution if the device 
Display defaultDisplay = ((WindowManager)this.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); 
Point displayResolution = new Point(defaultDisplay.getWidth(), defaultDisplay.getHeight()); 
if (displayResolution.equals(QVGA)) 
     { 
      viewThouShaltRespondToClicks.setBackgroundResource(R.drawable.image_to_be_clicked_upon_240x320); 
viewInvisibleMask.setBackgroundResource(R.drawable.mask_240x320); 

     } 
else if ... // check for another resolution 

리소스의 이미지가 올바른 크기가 아닌 경우에도 화면 크기로 확대/축소됩니다. 배경 이미지의 너비 - 높이 비율이 디스플레이의 비율과 비슷하고 결과 이미지가 많이 kewed되지 않는 한 괜찮습니다. 그러나 아래에 설명 된 문제가 있습니다.

클릭 한 영역을 탐지하기 위해 영역 자체가 불규칙한 모양 일 수 있습니다. 다음 접근 방식을 취했습니다. 흰색 배경과 클릭 가능한 영역이 다른 색상으로되어있는 경우에만 배경 이미지와 동일한 크기의 이미지 마스크 (bmp)를 만듭니다. 색상이 영역을 식별합니다. 내가해야만하는 것은 클릭 이벤트의 좌표를 얻는 것뿐입니다 (여기서는 문제 없음). 마스크 이미지로 이동하여이 좌표의 픽셀 색상을 읽습니다. 문제는 마스크 이미지의 크기가 올바르지 않다는 것입니다. 내 장치에서는 1200x700으로 설정되어 있지만 다른 장치에서는 임의의 크기가 필요합니다.

첫 번째 질문 : 보이지 않는 레이아웃을 배경 이미지를로드하고 펼쳐서/축소하여 표시 레이아웃에 대해 자체적으로 크기를 표시하도록 설득 할 수있는 방법이 있습니까?

또 다른 방법은 마스크 이미지 (bmp, png)를 일부 메모리 구조에로드하고 크기를 표시하기 위해 크기를 조정하는 것입니다. 내가 좋아하는 뭔가를 시도했다 :

BitmapFactory.Options options = new BitmapFactory.Options(); 
options.inScaled = false; // do not scale 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
bitmapMask = BitmapFactory.decodeResource(this.getResources(), R.drawable.mask, options); 
// on this place stretch shrink should follow but I have no idea how 

하지만 적절한 크기로 비트 맵의 ​​크기를 조절하는 방법을 모르겠어요.

제안 사항?

답변

0

첫 번째 질문 : 예, 마스크 이미지가 포함 된 레이아웃에서 별도의보기를 가질 수 있으며 android:visibility=invisible으로 보이지 않도록 설정할 수 있습니다.

두 번째 질문 : Bitmap.getPixel()으로 비트 맵에서 픽셀 값을 읽을 수 있습니다. Docs are here.

+1

주의 깊게 읽는 독자는 이미 마스크보기를 보이지 않게 만들었습니다. 문제는 배경 이미지가 실제보기 크기와 일치하지 않는 임의의 크기 (필자의 경우 1200x700)를 가정한다는 것입니다. getPixel() 메서드는 나에게도 알려져 있습니다.문제는 비트 맵을 적절한 크기로 조절하는 방법을 모르겠다는 것입니다. – Anderson

0

간단한 제안. 실제 이미지 뒤에있는 이미지 뷰에 참조 이미지를 가질 수 있습니다. 따라서 두 이미지는 정확히 동일한 방식으로로드되고 ImageViews에 배치 된 다음 상대 프로필에 삽입됩니다. 그렇게하면 크기가 같아야하며 그 중 하나만 표시됩니다.

이 방법을 사용하는 것이 좋지 않을 수도 있습니다. 작동 여부를 잘 모르겠지만 시도해 볼 수는 있습니다.

+0

나는 당신이 의미하는 것을 얻는 지 확신 할 수 없다. 그것에 대해 자세히 설명해 주시겠습니까? – Anderson

+0

원본 이미지와 터치 색상이있는 이미지를 포함하도록 RelativeLayout을 만듭니다. RelativeLayout을 사용하면 뷰를 서로 위에 놓을 수 있습니다. 따라서 터치 칼라 이미지를 원래의 것보다 뒤지게하십시오. 이미지가 포함 된 ImageViews는 동일한 속성을 가져야합니다. 이렇게하면 이미지의 크기가 정확히 동일하게 조정됩니다 (로드하는 이미지가 같은 크기 인 경우). 그런 다음 원래 이미지의 터치를 그 뒤에있는 이미지의 색상에 매핑 할 수 있어야합니다. –

관련 문제