Простой чертеж в одно касание, но продолжайте получать ACTION_CANCEL до того, как касания будут завершены - PullRequest
2 голосов
/ 16 ноября 2011

Это сводит меня с ума.

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

Я использую Samsung G SII 2.3.3, но строю на 2.1

Идеи муравья?

Мой пример кода:

  package com.mycompany.myviews;

  import java.util.ArrayList;

  import android.content.Context;
  import android.graphics.Canvas;
  import android.graphics.Color;
  import android.graphics.Paint;
  import android.graphics.Path;
  import android.graphics.Point;
  import android.util.AttributeSet;
  import android.util.Log;
  import android.view.MotionEvent;
  import android.view.View;

  public class CustomView extends View
  {
    private ArrayList<DrawPoint> points = new ArrayList<DrawPoint>();

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

    public void addPoint(DrawPoint p)
    {
      points.add(p);
    }

      public boolean onTouchEvent (MotionEvent event)
      {
        DrawPoint p = new DrawPoint((int)event.getX(), (int)event.getY());

        switch(event.getAction())
        {
        case android.view.MotionEvent.ACTION_DOWN:
          p.start = true;
          break;

        case android.view.MotionEvent.ACTION_CANCEL:
          Log.d("TouchView", "On Touch cancelled.");
          break;
        }

        addPoint(p);
        invalidate();

        return true;
      }

    public void onDraw(Canvas c) 
    {
        super.onDraw(c);

        Path path = new Path();

        for (int i = 0; i < points.size(); i++)
        {
          DrawPoint currentPoint = points.get(i);
          if (currentPoint.start == true)
            path.moveTo(currentPoint.p.x, currentPoint.p.y);
          else
            path.lineTo(currentPoint.p.x, currentPoint.p.y);
        }

        Paint paint = new Paint();
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(2);
        paint.setColor(Color.BLACK);
        c.drawPath(path, paint);
    }

    private class DrawPoint
    {
      public boolean start = false;
      public Point p;

      DrawPoint(int x, int y)
      {
        p = new Point(x, y);
      }
    }
  }

ОБНОВЛЕНИЕ: ОК, я понял это.Поскольку это представление находится внутри другого представления, некоторые из касаний перехватываются родителем или родителями.

Решение, которое я нашел достаточно хорошим для моих нужд, заключается в добавлении следующей строки в кейс для ACTION_DOWN:

getParent().requestDisallowInterceptTouchEvent(true);

Это позволяет моему взгляду получить все прикосновения.

Ответы [ 2 ]

0 голосов
/ 05 апреля 2012

Решение, которое я нашел достаточно хорошим для моих нужд, заключается в добавлении следующей строки в кейс для ACTION_DOWN:

getParent().requestDisallowInterceptTouchEvent(true);

Это позволяет моему взгляду получить все прикосновения.

0 голосов
/ 16 ноября 2011

Я отредактировал свой ответ ...

Я нашел пример рисования пальцем в примерах Android, а также обсуждение этого примера в stackoverflow. Надеюсь, это поможет вам.

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/FingerPaint.html

Android FingerPaint Пример использования Canvas, что такое закадровый Canvas?

Мой оригинальный пост ...

У меня нет решения, но я нашел сайт, который может дать вам немного идеи о том, что вы могли бы сделать ...

http://bestsiteinthemultiverse.com/2008/11/android-graphics-example/

...