2016-11-23 9 views
0

Android에서 2048 게임을 만들어야합니다.4x4 GridLayout이 프로그래밍 방식으로 Android에 채워집니다.

보드의 경우 GridLayout을 사용하고 프로그래밍 방식으로 설정해야합니다.

원래 게임과 마찬가지로 4x4 그리드가됩니다.

카드의 경우 TextView와 함께 FrameLayout을 사용하고 가운데에 카드를 사용해야합니다. 내가 할 수있는

public class Card extends FrameLayout { 

    private int number = 0; 
    private TextView txtNumber; 

    public Card(Context context, int n) { 
     super(context); 

     LayoutParams params = new LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); 
     params.gravity = Gravity.CENTER; 

     txtNumber = new TextView(context); 
     txtNumber.setTextSize(30); 
     txtNumber.setLayoutParams(params); 

     this.addView(txtNumber); 

     setNumber(n); 
    } 

    public int getNumber() { 
     return number; 
    } 

    public void setNumber(int number) { 
     this.number = number; 

     this.setBackgroundColor(ContextCompat.getColor(getContext(), number == 0 ? R.color.colorCard : R.color.colorCardActive)); 
     txtNumber.setText(number == 0 ? "" : "" + number); 
    } 
} 

아무것도 원래 같은 (더 나은 더 보이게 -

public class Board extends GridLayout { 

    private final int BOARD_WIDTH = 4; 
    private final int BOARD_HEIGHT = 4; 

    private Card[][] cards; 

    public Board(Context context) { 
     super(context); 

     initBoard(); 
    } 

    public Board(Context context, AttributeSet attrs) { 
     super(context, attrs); 

     initBoard(); 
    } 

    public Board(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 

     initBoard(); 
    } 

    public void initBoard() { 

     this.setBackgroundColor(ContextCompat.getColor(getContext(), R.color.colorBoard)); 
     this.setRowCount(BOARD_HEIGHT); 
     this.setColumnCount(BOARD_WIDTH); 

     Random random = new Random(); 

     cards = new Card[BOARD_WIDTH][BOARD_HEIGHT]; 

     for (int x = 0; x < BOARD_WIDTH; x++) { 

      for (int y = 0; y < BOARD_HEIGHT; y++) { 

       int n = random.nextInt(2); 
       cards[x][y] = new Card(this.getContext(), (n * 2)); 
      } 
     } 
    } 

    public void addCardsToBoard() { 

     for (int x = 0; x < BOARD_WIDTH; x++) { 

      for (int y = 0; y < BOARD_HEIGHT; y++) { 

       GridLayout.LayoutParams param = new LayoutParams(); 
       param.height = LayoutParams.WRAP_CONTENT; 
       param.width = LayoutParams.WRAP_CONTENT; 
       param.setGravity(Gravity.CENTER); 
       param.columnSpec = GridLayout.spec(x); 
       param.rowSpec = GridLayout.spec(y); 
       param.topMargin = 50; 

       Card c = cards[x][y]; 
       c.setLayoutParams(param); 

       this.addView(cards[x][y], 230, 230); 
      } 
     } 

    } 

} 

가 :

My result screenshot

Original game screenshot

내가 이미 가지고있는 것입니다 경기).

어떤 조언이나 조언을 부탁드립니다.

+0

'나는 2048 게임을 만들어야합니다.'... ** 다른 하나 ** ?? 그리고 왜 xml 레이아웃에 GridView를 만드는 대신 GridLayout을 프로그래밍 방식으로 만들지 않았습니까? –

+0

@Rotwang 네, 또 하나, 바로 연습 할 수있는 좋은 방법입니까? 그리고 그것들은 시작 지침입니다. XML에서 그렇게하는 것이 좋을까요? – Matthiee

답변

0

가로 및 세로 간격을 GridLayout에 추가합니다. GridLayout은 해당 열과 행에 적용 할 수 있습니다.

view.setHorizontalSpacing(10); 
view.setVerticalSpacing(10); 
+0

GridView에 해당하지 않습니까? – Matthiee

+0

네, 맞습니다. Card 클래스 생성자의 params에 패딩을 추가합니다. 여기에서 매개 변수에 대한 가중치 (LayoutParams)를 설정합니다. 그것은 2048 게임 UI와 같은 UI를 보여줍니다. –