簡體   English   中英

觸摸時OnTouch不運行

[英]OnTouch not running when touched

運行代碼時沒有出現任何錯誤,但是觸摸屏幕沒有任何反應。 全局變量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類public class Globals {

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

}

在實現OntouchListener時,需要在Context上設置TheListener。

只需將其添加到您的構造函數中即可:它應該像這樣:

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

我是一個沒有經驗的程序員,但是我今天早些時候創建了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;
        }

如果無法解決您的問題,請您提前表示歉意。

無需實現View.OnTouchListenerView類已經具有其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;
       }

它一定會工作。 並檢查一下

onDraw方法連續重復。 因此,也許即使您觸摸了對象,由於onDraw,它每次都被重繪到其初始位置。 因此,您想要做的是例如設置一個布爾isPostionned,這樣您的對象將僅在初始位置繪制1次。 因此布爾值最初將為false,然后在繪制項目后將其設置為true。

例如:在NonmultiplierSixView類中聲明

boolean isPositionned = false;

比在onDraw中:

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

(以防您打算移動形狀)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM