2012-04-06 14 views
2

私と私の同僚はアンドロイド用のカードゲームを開発しようとしています。特定のプレイヤーの カードが画面の下部に表示され、彼の相手のカードが右上と画面の左上端に表示されます。Android - 実行時にImageViewの位置を変更する

http://i39.tinypic.com/i1lhsm.jpg

我々だろう非常に次の機能を追加するのと同じように: カード(OnClickListener)のいずれかをクリックすると、彼が選択したカードがプレーヤーの他のカードの数ピクセル上に上がります。 ユーザーが別のカードを選択した場合、前のカードは元の位置(画面の一番下)に戻り、新しいカードが上昇します。

画面全体をRelativeLayoutに表される:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/game_layout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:background="#196DBB"> 


    <RelativeLayout android:id="@+id/battle_field" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 
    </RelativeLayout> 

    <TextView 
     android:id="@+id/left_name" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentLeft="true" 
     android:layout_width="wrap_content" 
     android:layout_height="30dp" 
     android:textColor="#FFFFFF" /> 

    <RelativeLayout android:id="@+id/left_cards" 
     android:layout_alignParentLeft="true" 
     android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/left_name"> 
    </RelativeLayout> 
    <TextView 
     android:id="@+id/my_name" 
     android:layout_width="wrap_content" 
     android:layout_height="30dp" 
     android:textColor="#FFFFFF" 
     android:layout_alignParentBottom="true" 
     android:layout_marginBottom="40dp" 
     android:layout_centerHorizontal="true"/> 


    <TextView 
     android:id="@+id/right_name" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentRight="true" 
     android:layout_width="wrap_content" 
     android:layout_height="30dp" 
     android:textColor="#FFFFFF" /> 

    <RelativeLayout android:id="@+id/right_cards" 
     android:orientation="vertical" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_below="@id/right_name" 
     android:layout_alignParentRight="true"> 
    </RelativeLayout> 

</RelativeLayout> 

画面の下部に表示されているカードは、のonCreate時、実行時に追加される:

fillLinearLayout(parseAndFillArray(myCardsArray), R.id.game_layout); 

の実装fillLinearLayoutは以下の通りです:

private void fillLinearLayout(LinkedList<Integer> cards, int linearID){ 
     int myCardsNum = cards.size(); 
     int cardWidth = (linearID == R.id.game_layout)? cardWidthHorizontal:cardWidthVertical; 
     RelativeLayout myCardsLayout = (RelativeLayout) findViewById(linearID); 
     if (linearID != R.id.game_layout) myCardsLayout.removeAllViews(); 
     for (int i = 0 ; i < myCardsNum ; i++){ 
      ImageView card = (ImageView)LayoutInflater.from(WelcomeScreen.this).inflate(R.layout.card_view, null); 
      card.setImageResource(cards.get(i)); 
      card.setId(cards.get(i)); 
      RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int)(cardWidth*dp), LayoutParams.WRAP_CONTENT); 
      if (linearID != R.id.game_layout) params.addRule(RelativeLayout.ALIGN_PARENT_TOP, -1); 
      else params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1); 
      int leftMargin = (linearID == R.id.game_layout)? (int)((i*cardMarginVertical)*dp) : 0; 
      int topMargin = (linearID == R.id.game_layout)? 0 : (int)(((i % (10))*cardMarginVertical + 35)*dp); 
      int rightMargin = 0; 
      int bottomMargin = 0; 
      params.setMargins(leftMargin, topMargin, rightMargin, bottomMargin); 
      card.setLayoutParams(params); 
      if (linearID == R.id.game_layout) card.setOnClickListener(OnCardClick(card)); 
      myCardsLayout.addView(card); 
     } 
} 

カードが接着されていますparams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1) コード行の画面の下部に表示されます。

ユーザがcertianカードを押すと、のonClick関数が呼び出されている:

private View.OnClickListener OnCardClick(final ImageView card) { 
     return new View.OnClickListener() { 
      public void onClick(View v) { 
       RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams)v.getLayoutParams(); 
       params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, (int)(10*dp)); 
      } 
     }; 
    } 

問題は、これが押されたカードの位置に影響を与えないことです。彼はちょうど彼の所に残っている。 ルールALIGN_PARENT_BOTTOMがあまりにも強すぎると思います。そのため、onClick関数はカードに影響しません。 誰もこれを解決する方法を考えることができますか?

答えて

2

私はそれを理解しました。将来的にはこれで苦労する人々のために :

私はRelativeLayoutにカードのImageViewのを包み、名前my_card_view.xmlの下に別のレイアウトファイルにそれを入れている:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content"> 
    <ImageView android:layout_height="wrap_content" 
     android:layout_width="50dp" 
     android:scaleType="fitXY" 
     android:adjustViewBounds="true"> 
    </ImageView> 
</RelativeLayout> 

画面の下部に表示されているカードのonCreate中、ランタイムに追加される:

fillMyCards(parseAndFillArray(myCardsArray)); 

はfillMyCardsの実装は以下の通りである:

private void fillMyCards(LinkedList<Integer> cards){ 
    int size = cards.size(); 
    RelativeLayout layout = (RelativeLayout) findViewById(R.id.game_layout); 
    for (int i = 0 ; i < size ; i++){ 
     RelativeLayout card = (RelativeLayout)LayoutInflater.from(WelcomeScreen.this).inflate(R.layout.my_card_view, null); 
     card.setGravity(Gravity.CENTER); 
     ImageView cardImage = (ImageView)card.getChildAt(0); 
     cardImage.setImageResource(cards.get(i)); 
     card.setId(cards.get(i)); 
     RelativeLayout.LayoutParams cardParams = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
     cardParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM, -1); 
     int leftPadding =(int)((i*cardMarginHorizontal)*dp); 
     int topPadding = 0; 
     int rightPadding = 0; 
     int bottomPadding = 0; 
     card.setPadding(leftPadding, topPadding, rightPadding, bottomPadding); 
     card.setLayoutParams(cardParams); 
     cardImage.setOnTouchListener(this); 
     layout.addView(card); 
    } 
} 

そして今、我々はのonClickに次のコードを追加することで、カードの位置を変更することができます。

RelativeLayout parent = (RelativeLayout) view.getParent(); 
parent.setPadding(0, 0, 0, (int)(10*dp));