我在Windows上做C#多年后回到Android,想把我的通用应用程序移植到Android上。这是基于cribbage的Solitaire版本。基本上,我所做的是定义了一个包含许多预定义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手做的。下面是卡片组和drawCard,用户拖动的那个):
<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);
以下是布局的样子:
对于冗长的帖子感到抱歉,但我想尝试确保我在这里有足够的信息让我的问题有意义。