游戏中的 onTouchEvent()

onTouchEvent() in a Game

我正在使用 android 开发游戏应用程序。

The Object(a box) slides up and down. And it has to hit the objects(orange and pink balls) coming towards it from the right end of the screen that would increase his score.

There will be black balls as well(shot from the right end of the screen) which he should avoid hitting.


我遇到了

的问题
onTouchEvent(MotionEvent me)

实现代码时的功能。

我正在关注 this tutorial in this series of tutorials


我的问题:

  1. 要使用 onTouchEvent(MotionEvent me) 函数,我需要导入任何 class 吗?

  2. 本教程已在 onCreate 方法之外声明了 onTouchEvent(MotionEvent me)。没关系。但是程序没有在任何地方调用它。那么它是如何工作的呢?

  3. 按照教程中的说明编写代码后,程序无法正常运行。 activity 启动时会出现此框。但是,我一点击屏幕它就消失了。可能是什么问题?

ActivityMain.XML

<?xml version="1.0" encoding="utf-8"?>
<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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/scoreLabel"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text=" : 300"
        android:paddingLeft="10dp"
        android:gravity="center_vertical"  />

    <FrameLayout
        android:id="@+id/frame"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:id="@+id/startLabel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="30sp"
            android:layout_gravity="center_horizontal"
            android:layout_marginTop="130dp"/>

        <ImageView

            android:id="@+id/box"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/box"
            android:layout_gravity="center_vertical" />

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

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

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



    </FrameLayout>

</RelativeLayout>

MainActivity.java

package com.example.catcheggs1;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    private TextView scoreLabel;
    private TextView startLabel;
    private ImageView box;
    private ImageView orange;
    private ImageView black;
    private ImageView pink;

    //Position
    private int boxY;




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

        scoreLabel=(TextView)findViewById(R.id.scoreLabel);
        startLabel=(TextView)findViewById(R.id.startLabel);
        box=(ImageView)findViewById(R.id.box);
        orange=(ImageView)findViewById(R.id.orange);
        pink=(ImageView)findViewById(R.id.pink);
        black=(ImageView)findViewById(R.id.black);

        //Move To Out of Screen
        orange.setX(-80);
        orange.setY(-80);
        pink.setX(-80);
        pink.setY(-80);
        black.setX(-80);
        black.setY(-80);


        //Temporary
        startLabel.setVisibility(View.INVISIBLE);
        boxY=500;


    }

    public boolean onTouchEvent(MotionEvent me)
    {
       if(me.getAction()==MotionEvent.ACTION_DOWN)
       {
           boxY -= 1 ;
       }
       box.setY(boxY);

       return true;
    }
}

1.) 不,您不需要导入任何东西。

2.) 详细信息见link。 它是一个event方法,它会自动调用,你不需要调用它。 https://developer.android.com/guide/topics/ui/ui-events#java

3.) 你在触摸时使用 boxY 变量,它被分配了一个任意数字。你的问题很可能是由此引起的。而不是那样,您应该首先获得当前位置而不是调整它。 您可以通过此方法获取当前位置。

int[] location = new int[2];
imageView.getLocationOnScreen(location);

https://developer.android.com/reference/android/view/View.html#getLocationOnScreen(int[])

奖励。)onTouchEvent 是一种 activity 方法,因此您应该为特定任务使用视图自己的事件侦听器而不是 onTouchEvent。

imageView.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {   
        return true;
    }
});