在不同的布局中相交两个图像

时间:2016-08-11 04:18:29

标签: android

How it looks

我希望在LinearLayout向ImageView2滑动时检查ImageView与ImageView2之间的交集。   我使用了Rect,但是它没有工作,ImageView2只是通过它而没有相交。 请帮帮我!!

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="true" >


<ImageView
    android:id="@+id/tile"
    android:layout_width="30dp"
    android:layout_height="30dp"
    android:src="@drawable/tile" />

   <LinearLayout
    android:id="@+id/l1"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:weightSum="100" >

    <ImageView
        android:id="@+id/b1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="50"
        android:background="#000"
        android:src="@drawable/b" />

    <ImageView
        android:id="@+id/b2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="70dp"
        android:layout_weight="50"
        android:background="#000"
        android:src="@drawable/b" />
</LinearLayout>

@SuppressLint("NewApi") 
public class MainActivity extends Activity {
    Rect tileRect = new Rect();
    Rect b1Rect = new Rect();
    Rect b2Rect = new Rect();
    ImageView tile,b1,b2;
    RelativeLayout layout;
    LinearLayout l1;

    final Handler h = new Handler();
    Boolean tileRight=false;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);


        init();
         move();

    }


    private void init() {
        // TODO Auto-generated method stub




        b1 = (ImageView)findViewById(R.id.b1);
        b2 = (ImageView)findViewById(R.id.b2);
        tile = (ImageView)findViewById(R.id.tile);
        layout = (RelativeLayout)findViewById(R.id.layout);
        l1 = (LinearLayout)findViewById(R.id.l1);
         tile.setX(320);
        tile.setY(800);


        l1.setVisibility(View.VISIBLE);

    }


    public void move()
    {
        final int delay = 45;
        h.postDelayed(new Runnable()
        {

            @Override
            public void run() {
                // TODO Auto-generated method stub

                layout.setOnTouchListener(new View.OnTouchListener() {

                    @Override
                    public boolean onTouch(View arg0, MotionEvent event) {
                        // TODO Auto-generated method stub

                        if(event.getAction() == MotionEvent.ACTION_UP)
                        {

                            if(tileRight==true)
                                tileRight=false;
                            else
                                tileRight=true;

                        return true;
                        }

                        return false;
                    }
                });


            if(tileRight==true)
            {
              if(tile.getX()>600f)
              {
                  tile.setX(tile.getX()); 
              }

              else{
                tile.setX(tile.getX()+speedTile);

                    }
            }
            else{
                 if(tile.getX()<40f)
                  {
                      tile.setX(tile.getX()); 
                  }
                 else{
                tile.setX(tile.getX()-speedTile);

                 }

            }

            tile.getHitRect(tileRect);
            b1.getHitRect(b1Rect);
            b2.getHitRect(b2Rect);

            if(Rect.intersects(tileRect, b1Rect) || Rect.intersects(tileRect, b2Rect))
            {
                gameOver();

            }



            l1.setY(l1.getY()+10f);


            h.postDelayed(this, delay);
            }



        },delay);


    }
    private void gameOver() {

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

2 个答案:

答案 0 :(得分:0)

Android的View具有getLocationOnScreen()方法,可以显示视图的绝对位置。 https://developer.android.com/reference/android/view/View.html#getLocationOnScreen(int[])

答案 1 :(得分:0)

出现此问题的原因是在布局膨胀之前使用了view.getHitRect()。

任何视图的位置或测量API(如getWidth(),getTop(),getRight()等)都将返回0(getHitRect()使用(0,0,0,0)初始化Rect)在视图膨胀之前的onCreate()或onResume()中。

在您的情况下,处理程序的延迟时间似乎比查看通货膨胀更早地执行交叉逻辑。

您可以从视图中postrun()方法会在视图膨胀后执行,然后获取视图的测量参数或Rect。< / p>

以下是一个例子:

public class MyTestActivity extends AppCompatActivity{

    int mNumberOfViewsInitialized = 0;

    ImageView mImageViewRight, mImageViewLeft;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sliding_image_activity);

        mImageViewLeft = (ImageView) findViewById(R.id.image_view_left);
        mImageViewRight = (ImageView) findViewById(R.id.image_view_right);

        // calling method here will log that the views do not intersect
        // which happens because they haven't been inflated yet.
        // doViewsOverlap();


        mImageViewLeft.post(new Runnable(){

            @Override
            public void run() {
                mNumberOfViewsInitialized++;
                intersectionLogic();
            }
        });

        mImageViewRight.post(new Runnable(){

            @Override
            public void run() {
                mNumberOfViewsInitialized++;
                intersectionLogic();
            }
        });
    }

    private void intersectionLogic(){
        /* the constant could be something else, depending 
         on the number of views you'd like to test intersection for*/
        if(mNumberOfViewsInitialized == 2){
            doViewsOverlap(mImageViewLeft,mImageViewRight);
        }
    }

   private void doViewsOverlap(final View firstView, final View secondView){

        Rect leftRect = new Rect();
        firstView.getHitRect(leftRect);

        Rect rightRect = new Rect();
        secondView.getHitRect(rightRect);

        if(Rect.intersects(leftRect,rightRect) || Rect.intersects(rightRect,leftRect))
            Log.v("intersects","views intersect");
        else
            Log.v("intersects","views do not intersect");
    }
}

我使用了一个不动画/移动图像的布局,但是当移动图像时也会出现同样的问题

<ImageView
    android:id="@+id/image_view_left"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_alignParentLeft="true"
    android:background="@android:color/holo_blue_dark"
    android:src = "@mipmap/ic_launcher"/>

<ImageView
    android:id="@+id/image_view_right"
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_alignParentRight="true"
    android:background="@android:color/holo_green_dark"
    android:gravity="end"
    android:src="@mipmap/ic_launcher"/>

RelativeLayout中包含的图片。

以下是用户界面的截图:

enter image description here

此问题与此相关:If I call getMeasuredWidth() or getWidth() for layout in onResume they return 0

希望这有帮助。