每个View的setOnClickListener方法

时间:2015-09-02 17:30:52

标签: android

我编写了以下代码,效果很好。但我有其他目的。我想只点击视图来执行操作。首先,请看下图:

enter image description here

我的代码如下:

public class MainActivity extends Activity {
    RelativeLayout relativeLayout;
    @Override
    protected void onCreate(Bundle bundle)
    {        super.onCreate(bundle);
    relativeLayout = new RelativeLayout(getApplicationContext());
    setContentView(relativeLayout);
        A a = new A(this);
        relativeLayout.addView(a);
        a.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                B b = new B(getApplicationContext());
            relativeLayout.addView(b);
            }
        });
    }
}

class A extends View {
    Paint paint;
    A(Context context) {
     super(context);
    paint = new Paint();
    }
@Override

    protected void onDraw(Canvas canvas) {
    paint.setAntiAlias(true);
paint.setColor(Color.RED);
    canvas.drawRect(20,60,100,150,paint);
}
}

class B extends View {
    Paint paint;
    B(Context context){
        super(context);
        paint = new Paint();
    }
@Override
    protected void onDraw(Canvas canvas){

    paint.setAntiAlias(true);
paint.setColor(Color.GREEN);
canvas.drawRect(100,150,200,250,paint);
}
}

当我运行上面的代码时,按下红色矩形后我可以看到绿色矩形。但问题是,当我按下屏幕上的其他位置时,我也可以执行此操作。我希望只有我能看到绿色矩形按下红色矩形而不是屏幕上的其他位置才能进行此操作。

3 个答案:

答案 0 :(得分:1)

使用onTouch事件

a.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getX(0)>=20 && event.getY(0)>=60 && event.getX(0)<=160 && event.getY(0)<=150) {
            B b = new B(getApplicationContext());
            relativeLayout.addView(b);
        }
        return true;
    }
});

答案 1 :(得分:1)

您正在定义红色方块的参数,但不是您要绘制的画布的参数。您正在创建视图(A)而不定义它的宽度和高度,因此默认情况下它设置为match_parent,这意味着它将占用RelativeLayout的整个大小(整个屏幕)。因此,当您点击红色方块的“外部”时,您实际上是单击视图(A)。

尝试为要绘制的视图定义特定的高度和宽度,如下所示。

    A a = new A(this);
    a.setLayoutParams(new RelativeLayout.LayoutParams(300,300));

请记住,LayoutParams将像素作为参数,因此您应该将dps真正转换为指定的here

此外,为您的视图设置一些背景颜色(relativeLayout,A)将帮助您可视化您正在做的事情。

答案 2 :(得分:0)

@ nukeforum,你的猜测对我很有帮助。我感谢你们所有人。我的问题完全来自画布及其大小。我在代码中添加了以下操作并解决了我的问题。

 relativeLayout.addView(a,70,70);

对于A班,我改变如下:

canvas.drawRect(10,20,30,40,paint);