首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >android canvas ontouchevent事件不起作用

android canvas ontouchevent事件不起作用
EN

Stack Overflow用户
提问于 2012-04-04 16:31:46
回答 1查看 762关注 0票数 0

我有一个用于自定义视图的类。其中一种方法是

代码语言:javascript
运行
复制
    @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类中

代码语言:javascript
运行
复制
 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被调用了两次!但在其他形状上,它有时被称为....帮助我^_^

所以这段代码运行得很好)

代码语言:javascript
运行
复制
   @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;
}

代码语言:javascript
运行
复制
 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;
        }
    });
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-04 16:37:41

只对一个动作做出反应。在你的onTouch()方法中使用ACTION_DOWN或者ACTION_UP,否则当你命中一个地域时,至少会被调用两次。

你能不能具体说明一下on other shapes it called some times到底是什么意思?

编辑:

您应该在onDraw方法之外创建区域。在其他地方(构造函数?)

小技巧:如果你想看看你的区域是否正确,你应该在屏幕的最后绘制矩形/区域,以便它们覆盖在操场上。如果您的区域位于正确的位置并具有正确的大小,这将为您提供视觉反馈。另外,改变你正在绘制的区域的颜色,因为这可能有助于发现一些问题。

如果你这样做了,你能为它提供一个截图吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10007520

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档