如何在屏幕上的特定区域中放置Android ImageView对象?

时间:2016-09-13 22:36:46

标签: java android xml android-layout android-layoutparams

我在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);

以下是布局的样子:

Solitaire Layout

对于冗长的帖子感到抱歉,但我想尝试确保我在这里有足够的信息让我的问题有意义。

0 个答案:

没有答案