【问题标题】:Why isn't the listener set properly in this case为什么在这种情况下没有正确设置监听器
【发布时间】:2014-01-23 02:41:29
【问题描述】:

在我的活动中,我显示了一个相机预览和一个按钮(一个看起来像按钮的view),我在它上面绘制。问题是,当我在该视图上设置点击监听器时,无论我在屏幕上的哪个位置(甚至在相机预览上)点击都会触发。

这是代码:

    FrameLayout preview = (FrameLayout) findViewById(id.camera_preview);
    preview.addView(mCameraPreview);

    CameraButtonView cameraButton = new CameraButtonView(getBaseContext());
    preview.addView(cameraButton);

    cameraButton.setOnClickListener(new OnClickListener()
    {
        public void onClick(View v)
        {
            Intent intent = new Intent(CameraTestActivity.this, MenuActivity.class);
            startActivity(intent);
            finish();
        }
    });

所以FrameLayout 是相机预览。 CameraButtonView 是在其上绘制的视图(位于底部的某处.. 它不会占用太多空间),并且侦听器确实设置在视图上。

为什么当我点击FrameLayout 上的任意位置时,我的事件会被触发?另外,我该如何解决它,以便只有按钮订阅事件。


相机按钮视图:

public class CameraButtonView extends View
{
Paint buttonPaint = new Paint();
Paint textPaint = new Paint();

SizeF size = new SizeF(500, 125);

public CameraButtonView(Context context)
{
    super(context);
    buttonPaint.setColor(Color.RED);
    textPaint.setColor(Color.BLACK);
    textPaint.setTextSize(35);
}

@Override
public void onDraw(Canvas canvas)
{
    RectF surface = RectangleHelper.create(0, 0, canvas.getWidth(), canvas.getHeight());
    PointF alignedPoint = RectangleHelper.align(surface, size, ContentAlignment.BottomCenter, AlignmentType.Internal);
    RectF content = RectangleHelper.create(alignedPoint, size);
    Rect textRectangle = new Rect();
    String buttonText = "Click to take a pic.";

    buttonPaint.getTextBounds(buttonText, 1, buttonText.length(), textRectangle);

    PointF alignedTextPoint = RectangleHelper.align(content, new SizeF(textRectangle.width(), textRectangle.height()), ContentAlignment.MiddleLeft, AlignmentType.Internal);

    canvas.drawRect(content, buttonPaint);
    canvas.drawText(buttonText, alignedTextPoint.x, alignedTextPoint.y, textPaint);
}
}

【问题讨论】:

    标签: android events view android-framelayout


    【解决方案1】:

    我的猜测是 CameraButtonView 上的 layoutparams 比按钮实际看起来要大。尝试将 layoutparms 设置为 new LayoutParams(50,50) 看看是否有帮助。然后你需要锻炼如何相对调整它的大小。

    没有看到CameraButtonView的代码,我无法给出明确的答案。

    更新(工作):

    CameraButtonView cameraButton = new CameraButtonView(getBaseContext());
        FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(500, 125);
        layoutParams.gravity = Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM;
        cameraButton.setLayoutParams(layoutParams);
        preview.addView(cameraButton);
    

    【讨论】:

    • 或者,覆盖CameraButtonView的onDraw并做canvas.drawColor(Color.Magenta);。然后看看它是否填满了整个屏幕。
    • 不,它已经不是红色了,我可以清楚地看到它只占据了屏幕底部的一部分。
    • CameraButtonView cameraButton = new CameraButtonView(getBaseContext()); cameraButton.setLayoutParams(new FrameLayout.LayoutParams(500, 125)); preview.addView(cameraButton);
    • 这部分工作。它会起作用,但会在右上角移动我的按钮。什么时候应该在底部中心。
    • 你可以使用 ImageButton 并隐藏背景吗?然后,如果你想要动态图像,只需 setImageBitmap(custombitmap) ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-17
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2014-07-13
    相关资源
    最近更新 更多