2015-04-21 52 views
0

我正在製作一個應用程序,在屏幕上隨機顯示圓圈。圓圈是紅色或綠色。該應用程序的目的是當有人觸及一個綠色圓圈時會發生一些好的事情,比如他們將分數添加到他們的分數中。當點擊一個紅色的圓圈時,就會發生一些不好的事情,比如新的活動已經開始,頁面顯示你失敗了。這是我的這個應用程序的代碼。在這段代碼中,我沒有收到任何錯誤,在logcat中什麼都沒有,一切正常。屏幕上隨機顯示的圓圈以及默認爲0的分數。我在這個應用程序中遇到的問題是,當點擊紅色或綠色的圓圈時,什麼都不會發生。當有人在我的應用程序上觸摸到一個紅色圓圈時,什麼也沒有發生

public DrawingView(Context context) { 
     super(context); 
     // TODO Auto-generated constructor stub 

    } 
    RectF rectf = new RectF(0, 0, 200, 0); 

    private static final int w = 100; 
    public static int lastColor = Color.BLACK; 
    private final Random random = new Random(); 
    private final Paint paint = new Paint(); 
    private final int radius = 230; 
    private final Handler handler = new Handler(); 
    public static int redColor = Color.RED; 
    public static int greenColor = Color.GREEN; 
    int randomWidth = 0; 
    int randomHeight = 0; 
    public static int addPoints = 0; 


    private final Runnable updateCircle = new Runnable() { 
     @Override 
     public void run() { 
      lastColor = random.nextInt(2) == 1 ? redColor : greenColor; 
      paint.setColor(lastColor); 
      invalidate(); 
      handler.postDelayed(this, 1000); 

     } 
    }; 

    @Override 
    protected void onAttachedToWindow() { 
     super.onAttachedToWindow(); 
     handler.post(updateCircle); 
    } 

    @Override 
    protected void onDetachedFromWindow() { 
     super.onDetachedFromWindow(); 
     handler.removeCallbacks(updateCircle); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     // your other stuff here 
     if(random == null){ 
      randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
      randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 
     }else { 
      randomWidth =(int) (random.nextInt(Math.abs(getWidth()-radius/2)) + radius/2f); 
      randomHeight = (random.nextInt((int)Math.abs((getHeight()-radius/2 + radius/2f)))); 
     } 

     canvas.drawCircle(randomWidth, randomHeight, radius, paint); 

     paint.setColor(Color.BLACK); 
     paint.setTextSize(150); 
     canvas.drawText("Score: " + addPoints, 120, 300, paint); 
    } 

    public boolean onTouch(View v, MotionEvent event) { 
    int x = (int) event.getX(); 
    int y = (int) event.getY(); 
    if(isInsideCircle(x, y) == true){ 
     //Do your things here 
     if(redColor == lastColor){ 
      Intent i = new Intent(v.getContext(), YouFailed.class); 
      v.getContext().startActivity(i); 
     } else { 
      addPoints++; 
     } 
    }else { 

    } 
    return true; 
} 

public boolean isInsideCircle(int x, int y){ 
    if ((((x - randomWidth)*(x - randomWidth)) + ((y - randomHeight)*(y - randomHeight))) < ((radius)*(radius))){ 
    return true; 
    } 
    return false; 
} 


} 
+0

你確定你的觸摸(X,Y)都在裏面圈?爲什麼你不檢查它是哪個'動作',即'DOWN','MOVE'或'UP'。 @Paul – Pooja

+1

把調試點放在這裏「int x =(int)event.getX();」並確保它得到執行 –

回答

0
  1. 你的看法可能不會實現View.OnTouchListener接口,因此它不調用onTouch()方法。

  2. 您的視圖未通過視圖的View.setOnTouchListener(View.OnTouchListener)方法設置View.OnTouchListener。

Android Developer Reference - View.OnTouchListener

感覺不對的視圖實現這個接口來聽自己無論哪種方式。相反,你可能想看看View.onTouchEvent(MotionEvent event)方法;也許它服務於你的目的(或者在這種情況下它應該應該)。監聽器接口應該由外部組件來實現。說,例如,如果你想使你的TextView聽每一個按鈕或ImageView的被觸摸時,可以擴展的TextView /按鈕,使他們實現Listener接口,然後將它傳遞給您觀爲setOnTouchListener(View.OnTouchListener)的參數。

但是,所有視圖都有一個名爲onTouchEvent()的方法。如果你想監聽事件視圖本身這View.onTouchEvent()方法應該是使用,因爲它是默認名稱每當觀點,以及感動。如果您需要使用此方法參考視圖本身,請致電this,因爲視圖本身將是您當前的範圍。

Android Developer Reference - View.onTouchEvent(MotionEvent event)

如果你不喜歡這樣,你需要爲了做使你的代碼的工作就是改變你的onTouch()法這樣的onTouchEvent()的覆蓋:(觸摸動作還增加了覈查普加由湯姆和建議,這樣你就沒有考慮到MOVEUP事件。更改爲DOWN根據UP時要觸發事件)

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     if(isInsideCircle(x, y) == true) { 
      //Do your things here 
      if(redColor == lastColor){ 
       Intent i = new Intent(v.getContext(), YouFailed.class); 
       this.getContext().startActivity(i); 
      } else { 
       addPoints++; 
      } 
     } else { 
      //Handle case not inside the circle 
     } 
    } 

    return true; 
} 
+0

非常感謝!我認爲擴展視圖類與它的接口?我試圖實現它,但日食不會讓我 –

0

的上210方法意在與OnTouchListener一起使用,並且通常會在自定義視圖類之外定義。例如:

this.setOnTouchListener(new OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      // touch handling code 
      return true; 
     } 
    }); 

在你正在尋找您的自定義視圖中的觸摸事件的情況下,你應該實現onTouchEvent方法。您可能還需要檢查或者ACTION_UPACTION_DOWN或您要處理多點觸摸事件。

@Override 
public boolean onTouchEvent(MotionEvent event) { 

    boolean result = false; 

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

     int x = (int) event.getX(); 
     int y = (int) event.getY(); 

     if(isInsideCircle(x, y) == true) { 
      //Do your things here 
      if(redColor == lastColor){ 
       Intent i = new Intent(v.getContext(), YouFailed.class); 
       v.getContext().startActivity(i); 
      } else { 
       addPoints++; 
      } 
      result = true; 
     } 
    } 

    return result; 
} 

詳情請參見以下內容: Input Events

相關問題