当有人触摸我的应用程序上的红色圆圈时没有任何反应

时间:2015-04-21 04:01:43

标签: java android ontouchevent

我正在创建一个在屏幕上随机显示圆圈的应用。圆圈为红色或绿色。该应用程序的目的是当有人触摸绿色圆圈时会发生一些好事,比如他们会将积分添加到他们的分数中。当点击一个红色圆圈时,会发生一些不好的事情,比如新活动开始,页面显示你失败了或什么的。这是我的应用程序的代码。在这段代码中我没有收到任何错误,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; 
}


}

2 个答案:

答案 0 :(得分:0)

  1. 您的视图可能未实现View.OnTouchListener接口,因此未调用onTouch()方法。

  2. 您的视图未通过视图View.setOnTouchListener(View.OnTouchListener)方法设置View.OnTouchListener。

  3. Android Developer Reference - View.OnTouchListener

    无论哪种方式,使视图实现此接口以侦听自身都是错误的。相反,您可能需要查看View.onTouchEvent(MotionEvent event)方法;也许它符合你的目的(或者在这种情况下应该)。监听器接口应该由外部组件实现。比如说,如果你想在每次触摸一个Button或ImageView时让你的TextView听,你可以扩展TextView / Button并使它们实现Listener接口,然后将它作为{{1}的参数传递给你。 }。

    但是,所有视图都有一个名为setOnTouchListener(View.OnTouchListener)的方法。如果您想要在视图中监听事件,则应使用此View.onTouchEvent()方法,因为默认情况下,只要视图是触摸,就会调用它。如果您需要使用此方法引用视图本身,请调用onTouchEvent(),因为视图本身将是您当前的范围。

    Android Developer Reference - View.onTouchEvent(MotionEvent event)

    如果您这样做,为了使您的代码有效,您需要做的就是将this方法改为覆盖onTouch(),如下所示:(还添加了触摸验证Pooja和Tom建议的行动,以免您考虑onTouchEvent()MOVE个事件。根据您想要触发的时间,更改UP DOWN事件)

    UP

答案 1 :(得分:0)

onTouch方法旨在与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