MotionEvents не срабатывает

Я пытаюсь нарисовать квадрат на canvas, но запускается только MotionEvent.ACTION_DOWN, а затем listener останавливается.

Идея состоит в том, что когда пользователь касается экрана, он получает местоположения x1 и y1, и каждый раз, когда запускается onTouch, он должен рисовать прямоугольник x1 y1 в текущем местоположении и, наконец, сохранять последнее местоположение в x2 y2, когда пользователь отпускает экрана.

Мой код выглядит так:

surfaceView.setOnTouchListener(new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {
        holder = surfaceView.getHolder();
        canvas = holder.lockCanvas();
        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            x1=event.getX();
            y1=event.getY();
        }
        else if(event.getAction() == MotionEvent.ACTION_UP)
        {
            x2=event.getX();
            y2=event.getY();
        }
        canvas.drawRect(x1, y1, event.getX(), event.getY(), paint);
        holder.unlockCanvasAndPost(canvas);
        return true;
    }
});

Может ли кто-нибудь привести мне пример.


person Nicolas Tyler    schedule 27.02.2013    source источник
comment
тут есть вопрос?   -  person GreyBeardedGeek    schedule 27.02.2013
comment
Вы пробовали вести журнал по каждому событию?   -  person NaviRamyle    schedule 27.02.2013
comment
Да, запускается только MotionEvent.ACTION_DOWN, а затем он останавливается.   -  person Nicolas Tyler    schedule 27.02.2013
comment
добавьте реализации обратного вызова в свой класс, как этот окончательный класс. Поверхность расширяет SurfaceView, реализует обратный вызов   -  person ShreeshaDas    schedule 27.02.2013
comment
Необходимо проверить весь код, связанный с этим слушателем, потому что часть, которую вы предоставили, отлично работает в общем случае.   -  person SSemashko    schedule 27.02.2013
comment
Что такое surfaceView? Это экземпляр SurfaceView ?   -  person GrIsHu    schedule 27.02.2013
comment
@Grishu: Да, это SurfaceView.   -  person Nicolas Tyler    schedule 27.02.2013
comment
Поместите эту строку внутри вашего условия if как: if(event.getAction() == MotionEvent.ACTION_DOWN) { x1=event.getX(); y1=event.getY(); canvas.drawRect(x1, y1, event.getX(), event.getY(), paint); }   -  person GrIsHu    schedule 27.02.2013
comment
я решил свою проблему по-другому, я использовал 2 указателя, чтобы нарисовать квадрат. public boolean onTouch(View v, MotionEvent event) { if(event.getPointerCount()==2) { holder = surfaceView.getHolder(); canvas = holder.lockCanvas(); canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR); x1=event.getX(0); y1=event.getY(0); x2=event.getX(1); y2=event.getY(1); canvas.drawRect(x1, y1, x2, y2, paint); holder.unlockCanvasAndPost(canvas); } return true; }   -  person Nicolas Tyler    schedule 27.02.2013


Ответы (2)


ACTION_UP запускается из приведенного выше кода. Попробуйте код ниже, и вы увидите журнал.

Я думаю, что ваша проблема может быть связана с баллами, которые вы получаете. Я не знаю, как вы определили x1, y1, x2, y2, но если они объявлены вне области видимости, они должны быть окончательными. Попробуйте это вместо этого.

final SurfaceView s = (SurfaceView) findViewById(R.id.surface);

final RectF rect = new RectF();

s.setOnTouchListener(new OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        SurfaceHolder holder = s.getHolder();
        Canvas canvas = holder.lockCanvas();

        if(event.getAction() == MotionEvent.ACTION_DOWN) {
            Log.d("action", "down");
            rect.left = event.getX();
            rect.top = event.getY();
        }
        if(event.getAction() == MotionEvent.ACTION_UP){
            Log.d("action", "up");
            rect.right = event.getX();
            rect.bottom = event.getY();

            Paint paint = new Paint();
            paint.setColor(Color.RED);
            canvas.drawRect(rect, paint);
        }

        holder.unlockCanvasAndPost(canvas);
        return true;
    }
});
person akaya    schedule 27.02.2013
comment
x1, y1, x2, y2 не являются окончательными, но я заставил их работать без них. но хороший ответ. - person Nicolas Tyler; 27.02.2013
comment
У меня теперь другая проблема, даже когда я не поднимаюсь, он все равно отправляет событие ACTION_CANCEL. Вы знаете, почему это произойдет? В журнале написано: ACTION_DOWN ACTION_MOVE ACTION_MOVE ACTION_MOVE ACTION_CANCEL - person Nicolas Tyler; 27.02.2013
comment
Вам просто нужно погуглить. Это объясняется здесь. stackoverflow.com/questions/6018309/ - person akaya; 27.02.2013
comment
Не удалось найти. Спасибо хоть. - person Nicolas Tyler; 27.02.2013

Попробуйте использовать это.

surfaceView.setOnTouchListener(new View.OnTouchListener()
{
    @Override
    public boolean onTouch(View v, MotionEvent event)
    {

        if(event.getAction() == MotionEvent.ACTION_DOWN)
        {
            x1=event.getX();
            y1=event.getY();
        }
        else if(event.getAction() == MotionEvent.ACTION_UP)
        {
            x2=event.getX();
            y2=event.getY();

            holder = surfaceView.getHolder();
            canvas = holder.lockCanvas();
            canvas.drawRect(x1, y1, x2, y2, paint);
            holder.unlockCanvasAndPost(canvas);
        }

        return true;
    }
});

Если вы двигаете пальцем, он призывает слушателя к каждому вашему движению. Итак, этот код

holder = surfaceView.getHolder();
canvas = holder.lockCanvas();

и этот код

canvas.drawRect(x1, y1, event.getX(), event.getY(), paint);
holder.unlockCanvasAndPost(canvas);

Будет казнен, может поэтому и останавливается.

Поэтому я поместил drawRect в условие MotionEvent.ACTION_UP, поэтому drawRect будет выполнено один раз.

person NaviRamyle    schedule 27.02.2013