检测onTouch中的MouseEvent是否位于绘制到自定义视图画布的圆圈内。

时间:2011-08-01 08:59:24

标签: android ontouchlistener

我正在尝试从一个Android应用程序开始,在此之前我需要做以下事情: 我有一个从View类扩展的类和实现View.onTouchListener接口。现在,我在onDraw()方法中绘制了一个圆圈,以便圆圈出现在应用程序的开头。现在,当用户触摸(实际点击)圆圈时,我想做点什么。所以,我在这里要做的第一件事就是在圆圈的触摸上显示一个toast msg。我尝试使用以下代码但没有任何反应。请帮我找到解决方案。

这是View类:

    package com.exam.trial;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Toast;

public class pad extends View implements View.OnTouchListener{

Paint paint;
public pad(Context context) {
    super(context);
    // TODO Auto-generated constructor stub
    paint = new Paint();
}


public boolean onTouch(View v, MotionEvent event) {
switch(event.getAction()){
    case MotionEvent.ACTION_DOWN: {
        if (event.getX()>70 && event.getX()<130 && event.getY()>70 && event.getY()<130)
        {
            Toast toast = Toast.makeText(getContext(), "Works fine", Toast.LENGTH_SHORT);
            toast.show();
        }
        return true;
    }

}
return false;
}


@Override
public void onDraw(Canvas canvas)
{
    paint.setColor(Color.YELLOW);
    canvas.drawCircle(100, 100, 50, paint);
}

}

这是我的开始活动:

package com.exam.trial;

import android.app.Activity;
import android.os.Bundle;

public class TrialActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    pad p = new pad(this);

    setContentView(p);
}
}

3 个答案:

答案 0 :(得分:9)

onTouch回调将捕获视图上的任何手指触摸作为原始X / Y坐标。如果您想知道用户是否点击了视图中的圆圈,则必须确定给定的X / Y坐标是否在圆圈内。

这是一个简单的功能:

private boolean inCircle(float x, float y, float circleCenterX, float circleCenterY, float circleRadius) {
    double dx = Math.pow(x - circleCenterX, 2);
    double dy = Math.pow(y - circleCenterY, 2);

    if ((dx + dy) < Math.pow(circleRadius, 2)) {
        return true;
    } else {
        return false;
    }
}

您需要修改代码,以便圆圈的中心x,y位置是类字段,并相应地更新onTouch方法:

private float mCircleCenterX;
private float mCircleCenterY;
private float mCircleRadius;

public boolean onTouch(View v, MotionEvent event) {
    switch(event.getAction()){
        case MotionEvent.ACTION_DOWN:
            if (inCircle(event.getX(), event.getY(), mCircleCenterX, mCircleCenterY, mCircleRadius)) {
                Toast toast = Toast.makeText(getContext(), "Works fine", Toast.LENGTH_SHORT).show();
            }
            return true;
    }
    return false;
}

答案 1 :(得分:-1)

请添加以下代码以使视图可聚焦,这意味着可以触摸它,并将ontouch侦听器设置为您构建的新pad p。像,

setFocusable(true);
setOnTouchListener(p);

答案 2 :(得分:-1)

使用它:

p.setFocusable(true);
p.setOnTouchListener(p);