我正在尝试从一个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);
}
}
答案 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);