Прямоугольник рисования на ImageView - не рисование вверх/влево

Я создал класс, который расширяет ImageView, позволяя мне рисовать прямоугольники на ImageView при касании.

Я могу рисовать прямоугольники, однако они отображаются только тогда, когда я перетаскиваю прямоугольник из начальной точки вниз и вправо.

Если я перетащу прямоугольник из начальной точки вверх или влево, прямоугольник не будет нарисован. OnDraw() срабатывает, но ничего не отображается.

Мои занятия:

public class TagImageView extends ImageView {

    private float downX;
    private float downY;
    private float upX;
    private float upY;
    private Paint paint;

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

    public TagImageView(Context context, AttributeSet attrs) {
        super(context, attrs);     
        init();
    }

    public TagImageView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }

    private void init() {
        paint = new Paint();
        paint.setColor(Color.RED);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(3);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        int action = event.getAction();
        switch (action) {
        case MotionEvent.ACTION_DOWN:   
            downX = event.getX();
            downY = event.getY();
            invalidate();            

            return true;
        case MotionEvent.ACTION_MOVE:
            upX = event.getX();
            upY = event.getY();
            invalidate();

            return true;
        case MotionEvent.ACTION_UP:
            invalidate();

            return true;
        case MotionEvent.ACTION_CANCEL:
            break;
        default:
            break;
        }      

        return super.onTouchEvent(event);
    }

    @Override
    public void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawRect(downX, downY, upX, upY, paint);
    }
}

Изменить: не уверен, что это актуально? https://stackoverflow.com/a/24168545/2380071


person LKB    schedule 02.10.2015    source источник
comment
можете ли вы отладить и проверить, какие значения присутствуют в downX downY upX upY во время onDraw. Или просто напишите Log.d внутри метода onDraw и проверьте значения   -  person Panther    schedule 02.10.2015
comment
Да, они кажутся действительными, в случае, когда ничего не было нарисовано: 591, 1225, 274, 965. В случае, когда нарисован прямоугольник, downX ‹ upX и downY ‹ upY.   -  person LKB    schedule 02.10.2015
comment
downX и downY - это startX и startY для прямоугольника. Я считаю, что это всегда должно быть больше, чем endX и endY, которые в вашем случае равны upX и upY. Попробуйте передать canvas.drawRect(upX, upY,downX, downY, paint);, если upX и upY >, чем downX и downY. Надеюсь, это работает   -  person Panther    schedule 02.10.2015
comment
Спасибо @Panther за совет. Если бы я реализовал ваше предложение, я полагаю, что столкнулся бы с той же проблемой, если бы мне пришлось рисовать прямоугольник из начальной точки вниз и вправо (что означает вверх X › вниз X или вверх Y › вниз Y). Я считаю, что мне нужно поставить проверки, чтобы увидеть, меньше или больше downX и downY, чем upX и upY, а затем обрабатывать их соответствующим образом.   -  person LKB    schedule 02.10.2015


Ответы (1)


Что ж, я только что изменил свой метод OnDraw(), чтобы проверить значения точек downX, downY и upX, upY. Тривиально, на самом деле ... хотя не уверен, что это наиболее эффективно. Добро пожаловать на любые предложения (или, э-э... указатели)!

@Override
public void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    if (downX < upX && downY < upY)
        canvas.drawRect(downX, downY, upX, upY, paint);
    else if (downX > upX && downY < upY)
        canvas.drawRect(upX, downY, downX, upY, paint);
    else if (downX < upX && downY > upY)
        canvas.drawRect(downX, upY, upX, downY, paint);
    else
        canvas.drawRect(upX, upY, downX, downY, paint);
}
person LKB    schedule 03.10.2015
comment
убедитесь, что у вас нет другого слоя на изображении, иначе это вернет неправильную позицию - person Ajay Pandya; 03.10.2015