自定义视图单击侦听器覆盖所有屏幕而不仅仅是视图

时间:2011-12-23 20:43:43

标签: android canvas onclick listener android-custom-view

我创建了一个扩展View的类,以便在特定的位置自己绘制它。 我已经覆盖了onDraw方法:

@Override
public void onDraw(Canvas canvas) {     
    super.onDraw(canvas);   
    canvas.drawBitmap(pic, x, y, null);
}

当我设置单击侦听器并将视图添加到布局时,即使我没有单击视图的区域,事件也会触发。 我尝试设置布局参数来包装内容没有帮助,尝试删除“super.onDraw”也没有帮助。 如果我使用内置视图(如按钮或图像视图)执行相同的操作,则不会发生这种情况。

有什么问题?我做错了吗?

更多代码:

public class FlowingPicture extends View {

    private float x,y;
    private Bitmap pic;
    private int screenWidth;
    private int screenHeight;

    public FlowingPicture(Context context, Bitmap pic, int x, int y, WindowManager screenSize) {
        super(context);
        screenHeight = screenSize.getDefaultDisplay().getHeight();
        screenWidth = screenSize.getDefaultDisplay().getWidth();
        this.pic = pic;
        this.x = x;
        this.y = y;
    }

    public void move(float x, float y){
        this.x += x;
        if(this.x > screenWidth)
            this.x = -(this.pic.getWidth());
        this.y += y;
        this.postInvalidate();
    }

    public float getX(){
        return x;
    }

    public float getY(){
        return y;
    }

    @Override
    public void onDraw(Canvas canvas) {     
        super.onDraw(canvas);
        canvas.drawBitmap(pic, x, y, null);
    }
}

创建视图的代码部分:

for(int i=0; i<arr.size(); i++){
    Bitmap b = arr.get(i).getFlowProfilePic();
    int x, y;
    do{
        y = rand.nextInt(screenHeight - b.getHeight() - 30);
        x = rand.nextInt(screenWidth);
    }
    while (!checkPoint(x, b.getWidth(), y, b.getHeight()));
    takenPoints.add(new Point(x, y));
    FlowingPicture fp = new FlowingPicture(FlowingFeeds.this, b, -(x + b.getWidth()), y, getWindowManager());
    fp.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast.makeText(FlowingFeeds.this, "I'm working!", Toast.LENGTH_SHORT).show();
        }
    });
    fp.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));
    flowingObjectsList.add(fp);
}
parseHandler.sendEmptyMessage(0);

parseHandler将视图添加到布局:

for(FlowingPicture fp : flowingObjectsList){                
    layout.addView(fp);
}
flow = new Thread(FlowingFeeds.this);
flow.start();

最后一部分:

layout = new FrameLayout(this);
layout.setBackgroundColor(Color.WHITE);
setContentView(layout);

2 个答案:

答案 0 :(得分:0)

尝试在您的方法中最后调用super.onDraw(canvas),但这可能会或可能不会让您想去的地方。

很难说出你的错误,但是你尝试在布局中声明BitmapField。除非需要显示更多内容,否则看起来你正在为屏幕绘制图像。

同样在main.xml中,您可以在RelativeLayout内创建所需内容,并包含TextFieldsBitmapFields以及您需要的其他字段, ,您不必担心onDraw()

使用XML资源的好处是有一个属性android:onClick="someMethod"。在活动中,您需要一个方法:

public void someMethod( View view ) {
    // do stuff here
}

这样就没有必要和听众混在一起了。

答案 1 :(得分:0)

好的,我没有解决它,但我想我知道问题是什么。 因为我正在整个屏幕上移动视图,所以它为视图提供了屏幕大小的空间。 所以我只是在视图所在的布局上添加一个触摸侦听器,它采用触摸的x和y,并检查此触摸是否在某个视图上。 不是最优雅的解决方案,但我尽了最大努力!

感谢所有试图提供帮助的人! :)