마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

퍼즐게임 구축 중 문제(xml 부분) 캡쳐 포함

0 추천

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >
   
    <Button
     android:id="@+id/bstart"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:text="@string/bstart"
     android:layout_gravity="center" />
        
    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_gravity="center" >
    
     <ImageButton
       android:id="@+id/btn01"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg1" />
   
     <ImageButton
       android:id="@+id/btn02"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg2" />
   
    <ImageButton
      android:id="@+id/btn03"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg4" />
   
     <ImageButton
       android:id="@+id/btn04"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg5" />
   
     <ImageButton
       android:id="@+id/btn05"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg6" />
   
     <ImageButton
       android:id="@+id/btn06"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg7" />
   
     <ImageButton
       android:id="@+id/btn07"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg8" />
   
     <ImageButton
       android:id="@+id/btn08"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg9" />
   
     <ImageButton
       android:id="@+id/blank"
       android:layout_width="0dp"
       android:layout_height="wrap_content"   
       android:src="@drawable/pg3" /> 
                                 
    </FrameLayout>

    <ImageView
        android:layout_width="150dp"
        android:layout_height="150dp"
        android:layout_gravity="center"
        android:src="@drawable/pg" />
   
</LinearLayout>

 

위 START 버튼을 누르면  버튼 바로 밑에 뷰 화면에 퍼즐 게임이 시작되는데요.. 사이즈가 그 화면 그대로 퍼즐이 시작되네요 ㅠㅠㅠ 그리고 바로 밑에 이미지 화면은 그 결과화면인데.. 거기도 괜찮은거 같은데.. 퍼즐 하는 그 뷰 화면만 이상이 있는거 같네요... xml 부분에 어떻게 해야되는지... ㅠㅠ 그리고 퍼즐하는 그 뷰를 가운데로 위치하고 싶습니다.

익명사용자 님이 2013년 5월 28일 질문

2개의 답변

0 추천

FrameLayout 안에 있는 이미지버튼들 (btn01~btn08, blank) 가 중첩되어 보여지고 있어서 맨위에꺼만 보이는거네요..좌표값 처리를 JAVA 코드 내에서 처리하는것 같으니 JAVA 소스쪽을 확인하셔야 할듯 합니다

블랙넥원 (9,600 포인트) 님이 2013년 5월 28일 답변
package com.example.puzzle;

import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ImageButton;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
 private ImageButton bs[]=new ImageButton[9];
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((Button)findViewById(R.id.bstart)).setOnClickListener(start);
        bs[0]=(ImageButton)findViewById(R.id.btn01);   // 숫자 퍼즐인경우는 ImageButton 대신에 Button
        bs[1]=(ImageButton)findViewById(R.id.btn02);
        bs[2]=(ImageButton)findViewById(R.id.btn03);
        bs[3]=(ImageButton)findViewById(R.id.btn04);
        bs[4]=(ImageButton)findViewById(R.id.btn05);
        bs[5]=(ImageButton)findViewById(R.id.btn06);
        bs[6]=(ImageButton)findViewById(R.id.btn07);
        bs[7]=(ImageButton)findViewById(R.id.btn08);
        bs[8]=(ImageButton)findViewById(R.id.blank);

        
        for (int i = 0; i < bs.length; i++) {
   bs[i].setOnClickListener(click);
  }

    }
    public View.OnClickListener click=new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   ImageButton A=(ImageButton) v;
   ImageButton blank=(ImageButton) findViewById(R.id.blank);
   if(Vert(A, blank) || Hori(A, blank)){
    SwapButton(A, blank);
   }
   
   
  }
 };
    public View.OnClickListener start=new View.OnClickListener() {
  
  @Override
  public void onClick(View v) {
   int x,y;
   for ( y = 0; y < 3; y++) {
    for ( x = 0; x < 3; x++) {
     bs[y*3+x].layout(x*75, y*75, x*75+75, y*75+75);
    }
   }
   Random puzzleRandom=new Random();
   for (int i = 0; i < 1000; i++) {
       click.onClick(bs[puzzleRandom.nextInt(8)]);
   }
  }
  
 };
 protected void SwapButton(ImageButton a, ImageButton blank) {
  int Left=a.getLeft();
  int Top=a.getTop();
  int Right=a.getRight();
  int Bottom=a.getBottom();
  a.layout(blank.getLeft(), blank.getTop(), blank.getRight(), blank.getBottom());
  blank.layout(Left, Top, Right, Bottom);
  
 }
 protected boolean Hori(ImageButton a, ImageButton blank) {
  
  return (a.getTop()==blank.getTop() && Math.abs(a.getLeft()-blank.getLeft())<100);
     //Math.abs(a.getLeft()-blank.getLeft())<100 -> 버튼 한개당 75사이즈다 2개에서 1개를 뺄경우 150-100 =50
  //100보다 작기때문에 스왑이 가능
 }
 protected boolean Vert(ImageButton a, ImageButton blank) {
  
  return (a.getLeft()==blank.getLeft() && Math.abs(a.getTop()-blank.getTop())<100);
 }
}

이게 자바 소스 코드 입니다. 어디가 잘못된 건가요? ㅠ
JAVA 소스를 보고나니 원하는 양상이 안나오는 대부분의 원인은 XML 쪽에 있었네요
우선 프레임 레이아웃 내에 gravity 속성이 정상 작동하지 않으니
프레임 레이아웃을 감싸는 리니어 레이아웃을 하나 더 두시고
리니어가 프레임을 센터로 잡게하신담에
이미지 불러오기 위해 사용하신   android:src 를 android:background 로 대체해보시면 원하시는 모양이 나올듯 싶네요..
거의 다 구현되어있고 완성되었을때 완성을 판별하는 로직만 넣으시면 끝나겠는데요 ?
0 추천

FrameLayout 사용방법을 잘 못 알고 계신 듯 합니다. 제가 알고 있기로 FrameLayout에서 childView의 위치를 잡아 놓지 않으면 한 곳(FrameLayout의 왼쪽 위)에 child view가 모두 놓이게 되는 것으로 알고 있습니다. 그래서 순차적으로 포개져서 제일 마지막 이미지만 보이는 것입니다.

자바 소스에서도 처음 실행시 각 이미지버튼의 위치를 설정하는 부분이 없고 이미지를 선택 했을 때 동작하는 부분만 있으시네요.. 자바 소스 던 xml이던 둘 장 하나에 각 child view의 초기 위치값을 설정해 주셔야 할 듯 합니다.

향긋한소리 (160 포인트) 님이 2013년 5월 28일 답변
...