【问题标题】:How to add a red dot in an image at a particular coordinates of an imageview?如何在图像视图的特定坐标处的图像中添加红点?
【发布时间】:2019-10-23 16:55:25
【问题描述】:

我正在处理我的 uni 项目,我必须在图像(在本例中为人体)中标记用户触摸的位置。

通过使用以下代码,我已经有了用户点击位置的 X 和 Y 坐标

mbody.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View view, MotionEvent e) {
            if (e.getAction() == MotionEvent.ACTION_DOWN) {
                Toast.makeText(getApplicationContext(),String.valueOf(e.getX())+","+
                        String.valueOf(e.getY()),Toast.LENGTH_LONG).show();
                return true;
            }
            return false;
        }
    });

我现在的问题是我已经有了坐标,我怎样才能在 imageview 的那个位置放置一个标记,以便我可以获得如下所示的结果图像

【问题讨论】:

  • 创建自定义图像视图。覆盖 onTouchEvent。存储位置。使视图无效。覆盖 onDraw 并使用存储的位置在画布上所需的位置绘制一个圆圈(调用 super)。
  • 是java还是kotlin的问题?
  • this link 应该很有用
  • 一种替代方法是使用透明的 ConstraintLayout 覆盖在人体布局的顶部,并根据 X 和 Y 放置带有红点的 ImageView。例如使用指南。
  • @raldone01 java

标签: android android-layout imageview


【解决方案1】:

正如@raldone01 提到的那样

创建自定义图像视图。覆盖 onTouchEvent。存储位置。使视图无效。覆盖 onDraw 并使用存储的位置在画布上所需的位置绘制一个圆圈

即,将您的 ImageView 替换为以下视图

public class MyIV extends AppCompatImageView {

private int x = 0;
private int y = 0;
private Paint paint = new Paint();
private float radius = 20;


public MyIV(Context context) {
    super(context);
    init();
}

public MyIV(Context context, @Nullable AttributeSet attrs) {
    super(context, attrs);
    init();
}

public MyIV(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
}



private void init(){
    paint.setColor(Color.RED);
    paint.setStyle(Paint.Style.FILL_AND_STROKE);
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.drawCircle(x,y,radius,paint);
}

@Override
public boolean onTouchEvent(MotionEvent event) {

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            x = (int)event.getX();
            y = (int)event.getY();
            invalidate();
            break;
        case MotionEvent.ACTION_MOVE:
            x = (int)event.getX();
            y = (int)event.getY();
            invalidate();
            break;
        case MotionEvent.ACTION_UP:
            x = (int)event.getX();
            y = (int)event.getY();
            invalidate();
            break;
    }
    return true;
}

}

【讨论】:

  • 您是否故意在 MotionEvent.ACTION_UP 上返回 false?这不会在初始化的时候在左上角画圆吗?
  • 不,它只会通知视图没有消耗 action up 事件。
  • 你为什么不消费这个事件?
猜你喜欢
  • 2019-07-10
  • 2021-08-13
  • 1970-01-01
  • 2022-09-19
  • 2017-04-23
  • 1970-01-01
  • 2019-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多