触摸时OnTouch未运行

时间:2017-06-19 15:43:13

标签: java android

我运行代码时没有收到任何错误,但触摸屏幕时没有任何反应。全局变量select的值应该改变,但没有任何反应。

这是代码

public class NonmultiplierSixGame extends AppCompatActivity {   
  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_nonmultiplier_six_game);
  }
}

activity_nonmultiplier_six_game:

<?xml version="1.0" encoding="utf-8"?>

<android.support.constraint.ConstraintLayout   
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="com.example.alexandermain.example_5.NonmultiplierSixGame">





    <com.example.alexandermain.example_5.views.NonmultiplierSixView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/nonmultiplierSixView"
        android:background="@color/colorPrimary"
        />


</android.support.constraint.ConstraintLayout>

NonmultiplierSixView类:

public class NonmultiplierSixView extends View implements View.OnTouchListener{



@Override
protected void onDraw(Canvas canvas){
//bunch of shapes
}


@Override
public boolean onTouch(View v, MotionEvent event) {
    switch(event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            Globals.SetSelect(1);
            break;
        case MotionEvent.ACTION_UP:
            Globals.SetSelect(2);
            break;

    }

    return true;
}



public NonmultiplierSixView(Context context, AttributeSet attrs) {
    super(context, attrs);
}
}

编辑: 这是Globals类 公共课Globals {

public static int select=-2;
public static void SetSelect(int t) {
    select = t;
}
public static int GetSelect() {
    return(select);
}

}

4 个答案:

答案 0 :(得分:1)

实现OntouchListener时,需要在Context上设置监听器。

只需在构造函数中添加它: 它应该是这样的:

public NonmultiplierSixView(Context context, AttributeSet attrs) {
    super(context, attrs);
    setOnTouchListener(this);
}

答案 1 :(得分:0)

我是一个非常缺乏经验的程序员,但我今天早些时候创建了onTouch监听器,工作正常,

尝试将onTouch方法更改为以下内容:

        public boolean onTouch(View v, MotionEvent event) {

            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    Globals.SetSelect(1);
                    return false;
                case MotionEvent.ACTION_UP:
                    Globals.SetSelect(2);
                    return false;
            }
            return false;
        }

如果它不适合你,我会提前抱歉..

答案 2 :(得分:0)

不需要实现View.OnTouchListener View类已经有onTouchEvent(MotionEvent event)方法。试试这个:

@Override
public boolean onTouchEvent(MotionEvent event) {
switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                                           break;
                case MotionEvent.ACTION_MOVE:
                                           break;
                case MotionEvent.ACTION_UP:
                                           break;
            }
           return true;
       }

它肯定会起作用。并检查this

答案 3 :(得分:0)

onDraw方法不断重复。 所以,也许,即使你触摸你的对象,每次都会因为onDraw而重新绘制到它的初始位置。 所以你想做的是例如设置一个布尔值isPostionned,所以你的对象只会在初始位置被绘制一次。 所以布尔值最初是假的,然后在绘制项目后将其设置为true。

例如:在NonmultiplierSixView类中声明

boolean isPositionned = false;

比onDraw:

if (!isPositionned){
   //code to position you object
   isPositionned = true;
    }

(这是为了你的意图是移动形状)