Windows で C# を何年も使用した後、Android に戻ってきたばかりで、ユニバーサル アプリを Android に移植したいと考えていました。クリベッジに基づいたソリティアのバージョンです。基本的に、私が行ったことは、事前に定義された ImageView の場所を含む相対的なレイアウトを定義することです。最初に、カードのダミー値を使用してすべてを入力し、レイアウトが適切に見えるようにしました。それが終わったら、ゲーム ロジックの実装に移ります。デッキ「drawCard」からカードをドラッグするときに、ユーザーが空 (かつ有効な) ImageView オブジェクトのいずれかでカードを離すと、drawCard の値は、それが解放された空の ImageView オブジェクトに割り当てられ、drawCard元の位置に戻る必要がありますが、デッキの次のカードに基づいて新しい値になります。私の問題は、ドロー カードの位置を計算して、有効な ImageView ターゲット上にあるかどうかを判断することです。XML は次のとおりです。
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:id="@+id/gamePage"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context="com.cardgames.tony.solitairecribbage.GamePageActivity"
tools:showIn="@layout/activity_game_page"
android:background="#041a01">
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/hand1Card1"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"/>
<!--android:src="@drawable/aofc"/>-->
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/hand1Card2"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginTop="36dp"/>
<!--android:src="@drawable/c3ofs"/-->
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/hand1Card3"
android:layout_alignBottom="@+id/hand2Card4"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="34dp" />
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/hand1Card4"
android:layout_below="@+id/hand1Card1"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
(同様の宣言が他の 3 つのハンドに対して行われます。以下は、カード デッキと、ユーザーがドラッグしているドローカードです):
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/cardDeck"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_marginBottom="113dp"
android:src="@drawable/b1fv"/>
<ImageView
android:layout_width="90dp"
android:layout_height="106dp"
android:id="@+id/drawCard"
android:layout_alignTop="@+id/cardDeck"
android:layout_toRightOf="@+id/cardDeck"
android:layout_toEndOf="@+id/cardDeck"/>
私が昔やっていたことは、絶対位置を使用して、カードの有効な「ドロップ ゾーン」を計算することでした。相対的なレイアウトでは、これを行う方法がわかりません。理想的には、ドラッグしているカードの死点座標と、有効な「ドロップ ゾーン」の左上と右下の座標を計算します。座標がこれらの値の間にある場合、カードは解放され、元の場所にも新しいカードが引き出されます。
ここに私がやっていることのスニペットがありますが、正確な値が得られません:
case MotionEvent.ACTION_UP: {
//Getting X and Y coordinates for event position
float tempX = event.getX();
float tempY = event.getY();
//Attempt to get dead center point for card being dragged:
int height = finalTempCardPicture.getDrawable().getIntrinsicHeight();
int width = finalTempCardPicture.getDrawable().getIntrinsicWidth();
tempX += width/2;
tempY += height/2;
有効なドロップ ゾーンを計算してみてください。
//fixCardPosition tries to place the card in a valid empty ImageView
if (!fixCardPosition(tempX, tempY))
{
//Return the draw card to the deck if the move is invalid
layoutParams.topMargin = drawOriginY;
layoutParams.leftMargin = drawOriginX;
v.setLayoutParams(layoutParams);
}
場所を特定しようとするロジックは次のとおりです。
public boolean isDraggedToFirstHand(int xCoord, int yCoord)
{
int topLeftExtentX;
int topLeftExtentY;
int bottomRightExtentX;
int bottomRightExtentY;
ImageView tempImage;
tempImage = (ImageView)findViewById(R.id.hand1Card1);
topLeftExtentX = tempImage.getLeft();
topLeftExtentY = tempImage.getTop();
tempImage = (ImageView)findViewById(R.id.hand1Card4);
bottomRightExtentX = tempImage.getRight();
bottomRightExtentY = tempImage.getBottom();
return (xCoord >= topLeftExtentX && yCoord >= topLeftExtentY && xCoord < bottomRightExtentX && yCoord < bottomRightExtentY);
レイアウトは次のようになります。
長い投稿で申し訳ありませんが、質問を理解するのに十分な情報がここにあることを確認したかったのです。