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