【问题标题】:Android Circle appearing lower than expected in imageviewAndroid Circle 在 imageview 中的显示低于预期
【发布时间】:2023-03-31 17:47:01
【问题描述】:

我一直试图在触摸事件发生后立即在 ImageView 内绘制一个圆圈,在 Touch 的位置。我已经制定了一些例子,包括Android - Canvas drawLine inside ImageView。 我的问题是,圆圈出现在大约。比触摸点低 117px。 我的代码 -

public boolean onTouchEvent(MotionEvent event){
        Canvas c;
        Paint p;
        ImageView v;
        Bitmap bm;

    v = (ImageView)findViewById(R.id.image1);
    bm = Bitmap.createBitmap(v.getWidth(),v.getHeight(),Config.ARGB_8888);
    c = new Canvas(bm);
    p = new Paint();        
    p.setColor(Color.GREEN);        
    float x = event.getX(); float y = event.getY();
    c.drawCircle(x, y, 20, p);      

    v.setImageBitmap(bm);

    return true;
}

Here 是 AVD 的屏幕截图(我也在真机上测试过)。我不知道出了什么问题或我遗漏了什么基本事实。 请帮忙。

【问题讨论】:

    标签: android android-canvas android-imageview touch-event


    【解决方案1】:

    看起来您正在覆盖 Activity 的 onTouchEvent?如果是这样,定位将相对于它的视图而不是图像视图。您必须考虑图像视图的位置并进行相应的翻译。

    int relPosX = event.getX() - getLeft();
    int relPoxY = event.getY() - getTop();
    

    【讨论】:

    • 是的,我正在覆盖主 Activity 的 onTouchEvent。但我通过传递 c.drawCircle(0,0,20,p) 进行了检查。它正确地绘制到左上角。
    • R.id.image1 的顶部/左侧是什么?我的猜测是,顶部是 117px。
    • @Bond - 如果您只想在 ImageView 中单击时才绘制到 ImageView,我建议将您的 onTouchEvent 移动到扩展的 ImageView 中。否则,您将不得不像 Berdon 所说的那样将触摸事件坐标转换为 ImageView 坐标。
    • 是的...但是 circle(0,0) 如何正确绘制到左上角??
    • 因为 event.getY() 正在返回绝对位置(基于活动的视图)。如果你用它在 ImageView 上绘图,你实际上是在做 c.drawCircle(x, v.getTop() + relativePositionY, 20, p);您需要将活动视图的坐标转换为 ImageView 的坐标。 IE。 event.getX() - getLeft() 和 event.getY() - getTop()。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-30
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多