自定义视图的触摸事件无法工作

4

我尝试使用TouchEvent创建一个简单的自定义视图。但是,如果我点击并拖动鼠标光标,没有任何内容被绘制。这是我应该在模拟器上测试TouchEvent的方式吗?还是我应该在真实设备上运行应用程序(在那里也无法工作)?谢谢。

public class TouchEventView extends View {

    private Paint paint = new Paint();
      private Path path = new Path();

      public TouchEventView(Context context, AttributeSet attrs) {
        super(context, attrs);

        paint.setAntiAlias(true);
        paint.setColor(Color.WHITE);
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeJoin(Paint.Join.ROUND);
        paint.setStrokeWidth(5f);
      }


      @Override
      protected void onDraw(Canvas canvas) {
        canvas.drawPath(path, paint);
      }

      @Override
      public boolean onTouchEvent(MotionEvent event) {
        float eventX = event.getX();
        float eventY = event.getY();

        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            path.moveTo(eventX, eventY);
            return true;
          case MotionEvent.ACTION_MOVE:
            path.lineTo(eventX, eventY);
            break;
          case MotionEvent.ACTION_UP:
            // nothing to do 
            break;
          default:
            return false;
        }

        // Schedules a repaint.
        invalidate();
        return true;
      }
}

尝试将Log.d("DEBUG","Action Down");Log.d("DEBUG","Action Move");Log.d("DEBUG","Action Up");放入您的case语句中,以确保您的触摸事件被捕获... - Rawr
http://developer.android.com/guide/topics/ui/custom-components.html提到了“扩展onDraw()和onMeasure()”。onMeasure()对您的视图是否有效?(猜测不行) - sandrstar
是的,我做到了,事件被很好地捕获了。 - Tanvir
你确定你收到了事件吗?你确定你的路径已经更新了吗?有没有任何东西被绘制出来?如果你用预先存在的元素初始化路径会发生什么? - njzk2
是的,它可以用简单的文本绘制得很好。 - Tanvir
1个回答

1

我在模拟器中尝试了这段代码,它可以正常工作。记得在移动鼠标时保持左键按下:

@Override
public boolean onTouchEvent(MotionEvent event) {
    int action = event.getAction() & MotionEvent.ACTION_MASK;
    switch(action) {
        case MotionEvent.ACTION_DOWN : {
            path.moveTo(event.getX(), event.getY());
            break;
        }
        case MotionEvent.ACTION_MOVE : {
            path.lineTo(event.getX(), event.getY());
            break;
        }

    }

    invalidate();
    return true;
}


@Override
protected void onDraw(Canvas canvas) {
    canvas.drawPath(path, myPaint);
}

private void init() {
    myPaint = new Paint();
    myPaint.setStyle(Paint.Style.STROKE);
    myPaint.setColor(Color.CYAN);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接