我有一个用于自定义视图的类。其中一种方法是
@Override
public void onDraw(Canvas canvas) {
Paint paint = new Paint ();
Bitmap wrench = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);
canvas.drawColor(Color .BLACK);
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
int left = canvas.getWidth()/2 - wrench.getWidth()*2 + j*wrench.getWidth();
int top = 0 + i*wrench.getHeight();
canvas.drawBitmap(wrench, left, top, null);
regions = new ArrayList<Region>();
Region reg = new Region(left, top, left + wrench.getWidth(), top + wrench.getHeight());
regions.add(reg);
// int right = left + wrench.getWidth();
// int bottom = top + wrench.getHeight();
// Log.d("REGION", left + "," + top + "," + right + "," + bottom);
}
}
}我的形状有8个区域。因此,在activity类中
playField = (PlayGameView) findViewById(R.id.play_field_surface_view);
playField.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// if(playField.getRegions().contains(210, 10)) {
ArrayList<Region> regions = playField.getRegions();
for(Region region: regions ) {
boolean condition = region.contains( (int)event.getX(), (int)event.getY());
if(condition) {
Toast.makeText(PlayGameActivity.this, (int)event.getX() + " " + (int)event.getY(), 2000).show();
}
}
return true;
}
});但是它不起作用!当我点击最后一个形状时,toast被调用了两次!但在其他形状上,它有时被称为....帮助我^_^
所以这段代码运行得很好)
@Override
public void onDraw(Canvas canvas) {
Paint paint = new Paint ();
Bitmap wrench = BitmapFactory.decodeResource(getResources(), R.drawable.wrench);
canvas.drawColor(Color .BLACK);
shapeWidth = wrench.getWidth();
shapeHeight = wrench.getHeight();
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
int left = canvas.getWidth()/2 - wrench.getWidth()*2 + j*wrench.getWidth();
int top = i*wrench.getHeight();
canvas.drawBitmap(wrench, left, top, null);
shapeLeft[j] = left;
shapeTop[i] = top;
}
}
}
public ArrayList<Region> getRegions() {
regions = new ArrayList<Region>();
for(int i = 0; i < 4; i++) {
for(int j = 0; j < 4; j++) {
Region reg = new Region(shapeLeft[j], shapeTop[i], shapeLeft[j] + shapeWidth, shapeTop[i] + shapeHeight);
regions.add(reg);
// int right = left + wrench.getWidth();
// int bottom = top + wrench.getHeight();
// Log.d("REGION", left + "," + top + "," + right + "," + bottom);
}
}
return regions;
}和
playField = (PlayGameView) findViewById(R.id.play_field_surface_view);
playField.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// if(playField.getRegions().contains(210, 10)) {
ArrayList<Region> regions = playField.getRegions();
for(Region region: regions ) {
if(event.getAction() == MotionEvent.ACTION_DOWN) {
boolean condition = region.contains( (int)event.getX(), (int)event.getY());
if(condition) {
Toast.makeText(PlayGameActivity.this, (int)event.getX() + " " + (int)event.getY(), 2000).show();
}
}
}
return true;
}
});发布于 2012-04-04 16:37:41
只对一个动作做出反应。在你的onTouch()方法中使用ACTION_DOWN或者ACTION_UP,否则当你命中一个地域时,至少会被调用两次。
你能不能具体说明一下on other shapes it called some times到底是什么意思?
编辑:
您应该在onDraw方法之外创建区域。在其他地方(构造函数?)
小技巧:如果你想看看你的区域是否正确,你应该在屏幕的最后绘制矩形/区域,以便它们覆盖在操场上。如果您的区域位于正确的位置并具有正确的大小,这将为您提供视觉反馈。另外,改变你正在绘制的区域的颜色,因为这可能有助于发现一些问题。
如果你这样做了,你能为它提供一个截图吗?
https://stackoverflow.com/questions/10007520
复制相似问题