Java 当有人触摸我的应用程序上的红色圆圈时,什么都不会发生

Java 当有人触摸我的应用程序上的红色圆圈时,什么都不会发生,java,android,touch-event,Java,Android,Touch Event,我正在制作一个在屏幕上随机显示圆圈的应用程序。圆圈不是红色就是绿色。该应用程序的目的是,当有人触摸到一个绿色圆圈时,一些好事就会发生,比如他们的分数会增加。当一个红色圆圈被点击时,一些不好的事情发生了,比如一个新的活动开始了,页面上说你失败了或者什么的。这是我的应用程序代码。在这段代码中,我没有收到任何错误,logcat中没有任何内容,一切正常。圆圈在屏幕上随机显示,分数默认为0。我在这个应用程序中遇到的问题是,当单击红色或绿色圆圈时,什么都不会发生 public DrawingView(Con

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


}
publicDrawingView(上下文){
超级(上下文);
//TODO自动生成的构造函数存根
}
RectF RectF=新的RectF(0,0,200,0);
专用静态最终int w=100;
公共静态int lastColor=Color.BLACK;
私有最终随机=新随机();
私人最终油漆=新油漆();
专用最终整数半径=230;
私有最终处理程序=新处理程序();
公共静态int redColor=Color.RED;
公共静态int greenColor=Color.GREEN;
int-randomWidth=0;
int-randomHeight=0;
公共静态int addPoints=0;
private final Runnable updateCircle=new Runnable(){
@凌驾
公开募捐{
lastColor=random.nextInt(2)==1?红色:绿色;
paint.setColor(lastColor);
使无效();
handler.postDelayed(这个,1000);
}
};
@凌驾
受保护的无效数据附加到DOWINDOW(){
super.onAttachedToWindow();
handler.post(更新循环);
}
@凌驾
受保护的无效onDetachedFromWindow(){
super.onDetachedFromWindow();
handler.removeCallbacks(updateCircle);
}
@凌驾
受保护的void onDraw(画布){
super.onDraw(帆布);
//你的其他东西在这里
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));
}否则{
randomWidth=(int)(random.nextInt(Math.abs(getWidth()-radius/2))+radius/2f);
randomHeight=(random.nextInt((int)Math.abs((getHeight()-radius/2+radius/2f));
}
画布。画圈(随机宽度、随机高度、半径、绘制);
油漆。设置颜色(颜色。黑色);
油漆.尺寸(150);
canvas.drawText(“分数:+addPoints,120300,paint”);
}
公共布尔onTouch(视图v,运动事件){
int x=(int)event.getX();
int y=(int)event.getY();
如果(isInsideCircle(x,y)=真){
//在这里做你的事情
if(redColor==lastColor){
Intent i=新Intent(v.getContext(),YouFailed.class);
v、 getContext().startActivity(i);
}否则{
addPoints++;
}
}否则{
}
返回true;
}
公共布尔IsInsidercle(整数x,整数y){
如果(((x-随机宽度)*(x-随机宽度))+((y-随机高度)*(y-随机高度))<((半径)*(半径))){
返回true;
}
返回false;
}
}
  • 您的视图可能没有实现接口,因此它没有调用
    onTouch()
    方法

  • 您的视图未通过视图的
    view.setOnTouchListener(view.OnTouchListener)
    方法设置为view.OnTouchListener

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

    但是,所有视图都有一个名为
    onTouchEvent()
    的方法。如果希望侦听视图本身中的事件,则应使用此方法,因为在默认情况下,只要触摸到视图,就会调用此方法。如果您需要使用这种方法引用视图本身,您可以调用
    this
    ,因为视图本身就是您当前的范围

    如果您这样做,为了使代码正常工作,您需要做的就是将
    onTouch()
    方法更改为对
    onTouchEvent()的重写,如下所示:(还添加了Pooja和Tom建议的触摸动作验证,因此您不需要考虑
    移动
    向上
    事件。根据您想要触发事件的时间,更改
    向上
    向下


    onTouch
    方法用于
    OnTouchListener
    ,通常在自定义视图类之外定义。例如:

        this.setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                // touch handling code
                return true;
            }
        });
    
    如果您正在自定义视图中查找触摸事件,则应实现
    onTouchEvent
    方法。您可能还需要检查
    ACTION\u UP
    ACTION\u 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;
    }
    
    有关更多详细信息,请参见以下内容:

    您确定您的触摸(x,y)在圆圈内吗?为什么不检查它是哪个
    动作,即
    向下
    移动
    向上
    @paul将调试点放在这里“int x=(int)event.getX()”并确保它被执行谢谢!我以为扩展视图类会占用它的接口?我试图实现它,但eclipse不允许
    
    @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;
    }