是否可以检测到每个被触摸的像素?更具体地说,当用户触摸屏幕时,是否可以跟踪用户触摸的点簇的所有 xy 坐标?我如何区分用户何时用拇指绘图和何时用指尖绘图?我想根据用户触摸屏幕的方式来反映画笔差异,并且还想跟踪所有被触摸的像素。
我目前正在使用来自 Apple 开发人员网站的 GLPaint 示例中的以下代码:
http://developer.apple.com/library/ios/#samplecode/GLPaint/Introduction/Intro.html
示例代码允许使用预定义的画笔大小进行绘图并沿途跟踪 xy 坐标。如何根据用户触摸屏幕的方式更改画笔并跟踪所有被触摸的像素?
// Drawings a line onscreen based on where the user touches
- (void) renderLineFromPoint:(CGPoint)start toPoint:(CGPoint)end
{
     NSLog(@"x:%f   y:%f",start.x, start.y);
     static GLfloat*          vertexBuffer = NULL;
     static NSUInteger     vertexMax = 64;
     NSUInteger               vertexCount = 0,
                    count,
                    i;
     [EAGLContext setCurrentContext:context];
     glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);
     // Convert locations from Points to Pixels
     CGFloat scale = self.contentScaleFactor;
     start.x *= scale;
     start.y *= scale;
     end.x *= scale;
     end.y *= scale;
     // Allocate vertex array buffer
     if(vertexBuffer == NULL)
          vertexBuffer = malloc(vertexMax * 2 * sizeof(GLfloat));
     // Add points to the buffer so there are drawing points every X pixels
     count = MAX(ceilf(sqrtf((end.x - start.x) * (end.x - start.x) + (end.y - start.y) * (end.y - start.y)) / kBrushPixelStep), 1);
     for(i = 0; i < count; ++i) {
          if(vertexCount == vertexMax) {
               vertexMax = 2 * vertexMax;
               vertexBuffer = realloc(vertexBuffer, vertexMax * 2 * sizeof(GLfloat));
          }
          vertexBuffer[2 * vertexCount + 0] = start.x + (end.x - start.x) * ((GLfloat)i / (GLfloat)count);
          vertexBuffer[2 * vertexCount + 1] = start.y + (end.y - start.y) * ((GLfloat)i / (GLfloat)count);
          vertexCount += 1;
     }
     // Render the vertex array
     glVertexPointer(2, GL_FLOAT, 0, vertexBuffer);
     glDrawArrays(GL_POINTS, 0, vertexCount);
     // Display the buffer
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
     [context presentRenderbuffer:GL_RENDERBUFFER_OES];
}
// Handles the start of a touch
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
     CGRect                    bounds = [self bounds];
     UITouch*     touch = [[event touchesForView:self] anyObject];
     firstTouch = YES;
     // Convert touch point from UIView referential to OpenGL one (upside-down flip)
     location = [touch locationInView:self];
     location.y = bounds.size.height - location.y;
}
// Handles the continuation of a touch.
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{  
     CGRect                    bounds = [self bounds];
     UITouch*               touch = [[event touchesForView:self] anyObject];
     // Convert touch point from UIView referential to OpenGL one (upside-down flip)
     if (firstTouch) {
          firstTouch = NO;
          previousLocation = [touch previousLocationInView:self];
          previousLocation.y = bounds.size.height - previousLocation.y;
     } else {
          location = [touch locationInView:self];
         location.y = bounds.size.height - location.y;
          previousLocation = [touch previousLocationInView:self];
          previousLocation.y = bounds.size.height - previousLocation.y;
     }
     // Render the stroke
     [self renderLineFromPoint:previousLocation toPoint:location];
}
// Handles the end of a touch event when the touch is a tap.
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
     CGRect                    bounds = [self bounds];
    UITouch*     touch = [[event touchesForView:self] anyObject];
     if (firstTouch) {
          firstTouch = NO;
          previousLocation = [touch previousLocationInView:self];
          previousLocation.y = bounds.size.height - previousLocation.y;
          [self renderLineFromPoint:previousLocation toPoint:location];
     }
}
// Handles the end of a touch event.
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
     // If appropriate, add code necessary to save the state of the application.
     // This application is not saving state.
}