多点触控

Android多点触控问题 多点触控的处理是通过 onTouchEvent 方法中的事件(如 ACTION_DOWN、ACTION_POINTER_DOWN、ACTION_MOVE、ACTION_POINTER_UP、ACTION_UP),利用触摸点的唯一 ID 来管理其记录、更新和移除。 阅读详情

手指在屏幕上能达到的精度和鼠标指针有很大的不同。当用户触击屏幕时,接触

区域实际上是椭圆形的,而且比用户想像的位置更靠下一点。根据触摸屏幕的手指、手指的尺寸、手指接触屏幕的力量、手指的方向、以及其它因素的不同,其“接触部位”的尺寸和形状也有所不同。底层的多点触摸系统会分析所有的这些信息,为您计算出单一的触点。

 

UIResponder 是所有响应者对象的基类,

它不仅为事件处理,而且也为常见的响应者行为定义编程接口。UIApplication、UIView、和所有从UIView 派生出来的UIKit 类(包括UIWindow)都直接或间接地继承自UIResponder类。

 

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch* touch = [touches anyObject];

NSUInteger numTaps = [touch tapCount];

if (numTaps < 2) {

[self.nextResponder touchesBegan:touches withEvent:event];

} else {

[self handleDoubleTap:touch];

}

}

 

缺省情况下,视图会接收触摸事件。但是,您可以将其userInteractionEnabled

属性声明设置为NO,关闭事件传递的功能。

 

在一定的时间内关闭事件的传递。应用程序可以调用UIApplication 的

beginIgnoringInteractionEvents 方法,并在随后调用endIgnoringInteractionEvents 方法来实现这个目的。

 

缺省情况下,视图只接收多点触摸序列的第一个触摸事件,而忽略

所有其它事件。如果您希望视图处理多点触摸,就必须使它启用这个功能。在代码或Interface Builder 的查看器窗口中将视图的multipleTouchEnabled 属性设置为YES,就可以实现这个目标。

将事件传递限制在某个单独的视图上。缺省情况下,视图的exclusiveTouch 属性被设置为NO。将这个属性设置为YES 会使相应的视图具有这样的特性:即当该视图正在跟踪触摸动作时,窗口中的其它视图无法同时进行跟踪,它们不能接收到那些触摸事件。

多点触摸:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;

- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event

 

当一个或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

当一个或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

当一个或多个手指离开屏幕时,发送touchesEnded:withEvent:消息。

当触摸序列被诸如电话呼入这样的系统事件所取消时,发送touchesCancelled:withEvent:消息。

上面这些方法都和特定的触摸阶段(比如UITouchPhaseBegan)相关联,该信息存在于UITouch 对象的phase 属性声明中。

为了处理给定阶段的事件,响应者对象常常从传入的集合参数中取得一或多个UITouch 对象,然后考察这些对象的属性或取得它们的位置(如果需要处理所有触摸对象,可以向该NSSet 对象发送anyObject 消息)。UITouch 类中有一个名为locationInView:的重要方法,如果传入self 参数值,它会给出触摸动作在响应者坐标系统中的位置(假定该响应者是一个UIView 对象,且传入的视图参数不为nil)。另外,还有一个与之平行的方法,可以给出触摸动作之前位置(previousLocationInView:)。UITouch 实例的属性还可以给出发生多少次触

碰(tapCount)、触摸对象的创建或最后一次变化发生在什么时间(timestamp)、以及触摸处于什么阶段(phase)。

 

- (void) touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event

{

UITouch *touch = [touches anyObject];

if ([touch tapCount] == 2) {

CGPoint tapPoint = [theTouch locationInView:self];

// Process a double-tap gesture

}

}

在touchesEnded:withEvent:方法中,当触击次数为一时,响应者对象就向自身发送一个performSelector:withObject:afterDelay:消息,其中的选择器标识由响应者对象实现的、用于处理单击手势的方法;第二个参数是一个NSValue 或NSDictionary 对象,用于保存相关的UITouch 对象;时延参数则表示单击和双击手势之间的合理时间间隔。

在touchesBegan:withEvent:方法中,如果触击次数为二,响应者对象会向自身发送一个cancelPreviousPerformRequestsWithTarget:消息,取消当前被挂起和延期执行的调用。如果触碰次数不为二,则在指定的延时之后,先前步骤中由选择器标识的方法就会被调用,以处理单击手势。

 

在视图中跟踪碰擦手势

#define HORIZ_SWIPE_DRAG_MIN 12

#define VERT_SWIPE_DRAG_MAX 4

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [touches anyObject];

startTouchPosition = [touch locationInView:self];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [touches anyObject];

CGPoint currentTouchPosition = [touch locationInView:self];

// If the swipe tracks correctly.

if (fabsf(startTouchPosition.x - currentTouchPosition.x) >= HORIZ_SWIPE_DRAG_MIN

&&

fabsf(startTouchPosition.y - currentTouchPosition.y) <=

VERT_SWIPE_DRAG_MAX)

{

// It appears to be a swipe.

if (startTouchPosition.x < currentTouchPosition.x)

[self myProcessRightSwipe:touches withEvent:event];

else

[self myProcessLeftSwipe:touches withEvent:event];

}

else

{

// Process a non-swipe event.

}

}

 

处理复杂的多点触摸序列

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [[event allTouches] anyObject];

// Only move the placard view if the touch was in the placard view

if ([touch view] != placardView) {

// On double tap outside placard view, update placard's display string

if ([touch tapCount] == 2) {

[placardView setupNextDisplayString];

}

return;

}

// "Pulse" the placard view by scaling up then down

// Use UIView's built-in animation

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:0.5];

CGAffineTransform transform = CGAffineTransformMakeScale(1.2, 1.2);

placardView.transform = transform;

[UIView commitAnimations];

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:0.5];

transform = CGAffineTransformMakeScale(1.1, 1.1);

placardView.transform = transform;

[UIView commitAnimations];

// Move the placardView to under the touch

[UIView beginAnimations:nil context:NULL];

[UIView setAnimationDuration:0.25];

placardView.center = [self convertPoint:[touch locationInView:self]

fromView:placardView];

[UIView commitAnimations];

}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [[event allTouches] anyObject];

// If the touch was in the placardView, move the placardView to its location

if ([touch view] == placardView) {

CGPoint location = [touch locationInView:self];

location = [self convertPoint:location fromView:placardView];

placardView.center = location;

return;

}

}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

UITouch *touch = [[event allTouches] anyObject];

// If the touch was in the placardView, bounce it back to the center

if ([touch view] == placardView) {

// Disable user interaction so subsequent touches don't interfere with animation

self.userInteractionEnabled = NO;

[self animatePlacardViewToCenter];

return;

}

}

 

在事件处理代码中,您可以将触摸状态的相关位置保存下来,以便在必要时和变化之后的UITouch 实例进行比较。定制视图可以用UIView 的hitTest:withEvent:方法或CALayer 的hitTest:方法来寻找接收触摸事件的子视图或层,进而正确地处理事件。下面的例子用于检测定制视图的层中的“Info” 图像是否被触碰。

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {

CGPoint location = [[touches anyObject] locationInView:self];

CALayer *hitLayer = [[self layer] hitTest:[self convertPoint:location

fromView:nil]];

if (hitLayer == infoImage) {

[self displayInfo];

}

}

 

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event {

if ([touches count] == [[event touchesForView:self] count]) {

// last finger has lifted....

}

}

 

触摸事件中包含一个触摸对象的集合及其相关的状态,而运动事件中除了事件类型、子类型、和时间戳之外,没有其它状态。系统以这种方式来解析运动手势,避免和方向变化事件造成冲突。

 

为了处理运动事件,UIResponder 的子类必须实现motionBegan:withEvent: 或

motionEnded:withEvent:方法之一,或者同时实现这两个方法

UIKit 框架在UITextView、UITextField、和UIWebView 类中实现了拷贝-剪切-粘贴支持。如果您希望在自己的应用程序中得到这个行为,可以使用这些类的对象,或者自行实现。

 

UIPasteboard 类提供了粘贴板的接口。粘贴板是用于在一个应用程序内或不同应用程序间进行数据共享的受保护区域。该类提供了读写剪贴板上数据项目的方法。

UIMenuController 类可以在选定的拷贝、剪切、和粘贴对象的上下方显示一个编辑菜单。编辑菜单上的命令可以有拷贝、剪切、粘贴、选定、和全部选定。

UIResponder 类声明了canPerformAction:withSender:方法。响应者类可以实现这个方法,以根据当前的上下文显示或移除编辑菜单上的命令。

UIResponderStandardEditActions 非正式协议声明了处理拷贝、剪切、粘贴、选定、和全部选定命令的接口。当用户触碰编辑菜单上的某个命令时, 相应的

UIResponderStandardEditActions 方法就会被调用。

 

UIPasteboardNameGeneral 用于剪切、拷贝、和粘贴操作,涉及到广泛的数据类型。您可以通过该类的generalPasteboard 类方法来取得代表通用(General)粘贴板的单件对象。

UIPasteboardNameFind 用于检索操作。当前用户在检索条(UISearchBar)键入的字符串会被写入到这个粘贴板中, 因此可以在不同的应用程序中共享。您可以通过调用pasteboardWithName:create:类方法,并在名字参数中传入UIPasteboardNameFind 值来取得代表检索粘贴板的对象。典型情况下, 您只需使用系统定义的粘贴板就够了。但在必要时, 您也可以通过pasteboardWithName:create: 方法来创建自己的应用程序粘贴板。如果您调用pasteboardWithUniqueName 方法,UIPasteboard 会为您提供一个具有唯一名称的应用程序粘贴板。您可以通过其name 属性声明来取得这个名称。

 

调用UIMenuController 的sharedMenuController 类方法来取得全局的,即菜单控制器实例。

计算选定内容的边界,并用得到的边界矩形调用setTargetRect:inView:方法。系统会根据选定内容与屏幕顶部和底部的距离,将编辑菜单显示在该矩形的上方或下方。

调用setMenuVisible:animated:方法(两个参数都传入YES),在选定内容的上方或下方动画显示编辑菜单。

程序清单3-4演示了如何在touchesEnded:withEvent:方法的实现中显示编辑菜单(注意,例子中省略了处理选择的代码)。在这个代码片段中, 定制视图还向自己发送一个becomeFirstResponder 消息,确保自己在随后的拷贝、剪切、和粘贴操作中是第一响应者。

 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {

UITouch *theTouch = [touches anyObject];

if ([theTouch tapCount] == 2 && [self becomeFirstResponder]) {

// selection management code goes here...

// bring up editing menu.

UIMenuController *theMenu = [UIMenuController sharedMenuController];

CGRect selectionRect = CGRectMake(currentSelection.x, currentSelection.y, SIDE,SIDE);

[theMenu setTargetRect:selectionRect inView:self];

[theMenu setMenuVisible:YES animated:YES];

}

}

 

有条件地激活菜单命令

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {

BOOL retValue = NO;

ColorTile *theTile = [self colorTileForOrigin:currentSelection];

if (action == @selector(paste:) )

retValue = (theTile == nil) &&

[[UIPasteboard generalPasteboard]

containsPasteboardTypes:

[NSArray arrayWithObject:ColorTileUTI]];

else if ( action == @selector(cut:) || action == @selector(copy:) )

retValue = (theTile != nil);

else

retValue = [super canPerformAction:action

withSender:sender];

return retValue;

}

请注意,这个方法的最后一个else 子句调用了超类的实现,使超类有机会处理子类忽略的命令。

 

拷贝和剪切操作

- (void)copy:(id)sender {

UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];

ColorTile *theTile = [self colorTileForOrigin:currentSelection];

if (theTile) {

NSData *tileData = [NSKeyedArchiver

archivedDataWithRootObject:theTile];

if (tileData)

[gpBoard setData:tileData forPasteboardType:ColorTileUTI];

}

}

- (void)cut:(id)sender {

[self copy:sender];

ColorTile *theTile = [self colorTileForOrigin:currentSelection];

if (theTile) {

CGPoint tilePoint = theTile.tileOrigin;

[tiles removeObject:theTile];

CGRect tileRect = [self rectFromOrigin:tilePoint inset:TILE_INSET];

[self setNeedsDisplayInRect:tileRect];

}

}

 

将粘贴板的数据粘贴到选定位置上

- (void)paste:(id)sender {

UIPasteboard *gpBoard = [UIPasteboard generalPasteboard];

NSArray *pbType = [NSArray arrayWithObject:ColorTileUTI];

ColorTile *theTile = [self colorTileForOrigin:currentSelection];

if (theTile == nil && [gpBoard containsPasteboardTypes:pbType]) {

NSData *tileData = [gpBoard dataForPasteboardType:ColorTileUTI];

ColorTile *theTile = (ColorTile *)[NSKeyedUnarchiver

unarchiveObjectWithData:tileData];

if (theTile) {

theTile.tileOrigin = self.currentSelection;

[tiles addObject:theTile];

CGRect tileRect = [self rectFromOrigin:currentSelection inset:TILE_INSET];

[self setNeedsDisplayInRect:tileRect];

}

}

}

 

 Quartz 是主要的描画接口,支持基于路径的描画、

抗锯齿渲染、渐变填充模式、图像、颜色、坐标空间变换、以及PDF 文档的创建、显示、和分析。UIKit 为Quartz 的图像和颜色操作提供了Objective-C 的封装。Core Animation 为很多UIKit 的视图属性声明的动画效果提供底层支持,也可以用于实现定制的动画。

在调用您提供的drawRect:方法之前,视图对象会自动配置其描画环境,使您的代码可以立即进行描画。作为这些配置的一部分,UIView 对象会为当前描画环境创建一个图形上下文(对应于CGContextRef 封装类型)

用户坐标空间是您发出的所有描画命令的工作环境。该空间的单位由点来表示。设备坐标空间指的是设备内在的坐标空间,由像素来表示。缺省情况下,用户坐标空间上的一个点等于设备坐标空间的一个像素,这意味着一个点等于1/160英寸。然而,您不应该假定这个比例总是1:1。

UIColor 对象提供了一些便利方法,用于通过RGB、HSB、和灰度值指定颜色值。

您也可以使用Core Graphics 框架中的CGContextSetRGBStrokeColor 和

CGContextSetRGBFillColor 函数来创建和设置颜色。

 

可移植网络图像格式(PNG) .png

标记图像文件格式(TIFF) .tiff, .tif

联合影像专家组格式(JPEG) .jpeg, .jpg

图形交换格式(GIF) .gif

视窗位图格式(DIB) .bmp, .BMPf

视窗图标格式.ico

视窗光标.cur

XWindow 位图.xbm

 

UIImage, 一个不可变类,用于图像显示。

UIColor, 为设备颜色提供基本的支持。

UIFont, 为需要字体的类提供字体信息。

UIScreen, 提供屏幕的基本信息。

 

NSString* imagePath = [[NSBundle mainBundle] pathForResource:@"myImage"

ofType:@"png"];

UIImage* myImageObj = [[UIImage alloc] initWithContentsOfFile:imagePath];

- (void)drawRect:(CGRect)rect

{

// Draw the image

[anImage drawAtPoint:CGPointMake(10,10)];

}

重要提示:如果您使用CGContextDrawImage 函数来直接描画位图,则在缺省情况下,图像数据会上下倒置,因为Quartz 图像假定坐标系统的原点在左下角,且坐标轴的正向是向上和向右。虽然您可以在描画之前对其进行转换,但是将Quartz 图像包装为一个UIImage 对象是更简单的方法,这样可以自动补偿坐标空间的差别。

 

UIKit 中的UIRectFrame 和UIRectFill 函数(以及其它函数)的功能是在视图中描画象矩形这样的简单路径。

在创建路径时,需要首先通过CGContextBeginPath 函数配置一个接收路径命令的图形上下文。调用该函数之后,就可以使用与路径相关的函数来设置路径的起始点,描画直线和曲线,加入矩形和椭圆形等等。路径的几何形状指定完成后,就可以直接进行描画,或者将其引用存储在CGPathRef 或CGMutablePathRef 数据类型中,以备后用。在视图上描画路径时,可以描画轮廓,也可以进行填充,或者同时进行这两种操作。路径轮廓可以用像CGContextStrokePath 这样的函数来画,即用当前的笔划颜色画出以路径为中心位置的线。路径的填充则可以用CGContextFillPath 函数来实现,它的功能是用当前的填充颜色或样式填充路径线段包围的区域。

 

 

Core Animation 的关键技术是层对象。层是一种轻量级的对象,在本质上类似于视图,但实际上是模型对象,负责封装显示内容的几何属性、显示时机、和视觉属性变量。内容本身可以通过如下三种方式来提供:

您可以将一个CGImageRef 类型的数据赋值给层对象的contents 属性变量。

您可以为层分配一个委托,让它负责描画工作。

您可以从CALayer 派生出子类,并对其显示方法进行重载。

 

UIKit 框架提供三个显示文本内容的基本类:

UILabel 显示静态文本字符串

UITextField 显示单行可编辑文本

UITextView 显示多行可编辑文本

 

为UITextField类提供支持的委托需要实现UITextFieldDelegate 协议定义的方法。类似地,为UITextView类提供支持的委托需要实现UITextViewDelegate 协议定义的方法。

 

当键盘被显示或隐藏的时候,iPhone OS 会向所有经过注册的观察者对象发出如下通告:

UIKeyboardWillShowNotification

UIKeyboardDidShowNotification

UIKeyboardWillHideNotification

UIKeyboardDidHideNotification

 

 

 

 

您可以通过调用视图对象的becomeFirstResponder 方法来为可编辑的文本视图显

示键盘。调用这个方法可以使目标视图成为第一响应者,并开始编辑过程,其效果和用户触击该视图是一样的。

 

需要做的调整通常包括暂时调整一或多个视图的尺寸和位置,从而使文本对象可见。管理带

有键盘的文本对象的最简单方法是将它们嵌入到一个UIScrollView ( 或其子类,如UITableView)对象。当键盘被显示出来时,您需要做的只是调整滚动视图的尺寸,并将目标文本对象滚动到合适的位置。为此,在UIKeyboardDidShowNotification 通告的处理代码中需要进行如下操作:

取得键盘的尺寸。

将滚动视图的高度减去键盘的高度。

将目标文本框滚动到视图中。

 

 

 

在配置滚动视图时,请务必为所有的内容视图配置恰当的自动尺寸调整规则。在之

前的图中,文本框实际上是一个UIView 对象的子视图,该UIView 对象又是UIScrollView对象的子视图。如果该UIView 对象的UIViewAutoresizingFlexibleWidth 和UIViewAutoresizingFlexibleHeight 选项被设置了,则改变滚动视图的边框尺寸会同时改变它的边框,因而可能导致不可预料的结果。禁用这些选项可以确保该视图保持尺寸不变,并正确滚动。

 

处理键盘通告

// Call this method somewhere in your view controller setup code.

- (void)registerForKeyboardNotifications

{

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasShown:)

name:UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(keyboardWasHidden:)

name:UIKeyboardDidHideNotification object:nil];

}

// Called when the UIKeyboardDidShowNotification is sent.

- (void)keyboardWasShown:(NSNotification*)aNotification

{

if (keyboardShown)

return;

NSDictionary* info = [aNotification userInfo];

// Get the size of the keyboard.

NSValue* aValue = [info

objectForKey:UIKeyboardBoundsUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

// Resize the scroll view (which is the root view of the window)

CGRect viewFrame = [scrollView frame];

viewFrame.size.height -= keyboardSize.height;

scrollView.frame = viewFrame;

// Scroll the active text field into view.

CGRect textFieldRect = [activeField frame];

[scrollView scrollRectToVisible:textFieldRect animated:YES];

keyboardShown = YES;

}

// Called when the UIKeyboardDidHideNotification is sent

- (void)keyboardWasHidden:(NSNotification*)aNotification

{

NSDictionary* info = [aNotification userInfo];

// Get the size of the keyboard.

NSValue* aValue = [info

objectForKey:UIKeyboardBoundsUserInfoKey];

CGSize keyboardSize = [aValue CGRectValue].size;

// Reset the height of the scroll view to its original value

CGRect viewFrame = [scrollView frame];

viewFrame.size.height += keyboardSize.height;

scrollView.frame = viewFrame;

keyboardShown = NO;

}

 

跟踪活动文本框的方法

- (void)textFieldDidBeginEditing:(UITextField *)textField

{

activeField = textField;

}

- (void)textFieldDidEndEditing:(UITextField *)textField

{

activeField = nil;

}

和屌丝一起学cocos2dx-多点触控 声  明        本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。 gl.paea.cn版权所有。        hello,大家好,欢迎回到“和屌丝一起学cocos2dx”系列教程。上节我 阅读详情

相关推荐

图片多点触控功能代码实战案例解析

多点触控技术,即多触点触摸输入技术,它允许用户使用多个手指同时在触摸屏设备上进行操作,从而实现更复杂的交互。这项技术是现代智能设备上不可或缺的组成部分,能够提供更直观、更自然的用户体验。手势识别允许用户通过手势与设备进行交互,它是自然用户界面(NUI)的关键技术之一。通过手势识别,设备能够理解和解析人的手部动作和位置,从而实现无需物理接触的交互方式。在多点触控技术中,手势识别不仅增强了用户的交互体验,而且扩大了触控技术的应用范围。边界控制技术是多点触控系统中用于界定触摸区域和防止误触的关键技术。

weixin_29607511的博客 1358

iPhone中的UITouch

手指在屏幕上能达到的精度和鼠标指针有很大的不同。当用户触击屏幕时,接触 区域实际上是椭圆形的,而且比用户想像的位置更靠下一点。根据触摸屏幕的手指、手指的尺寸、手指接触屏幕的力量、手指的方向、以及其它因素的不同,其“接触部位”的尺寸和形状也有所不同。底层的多点触摸系统会分析所有的这些信息,为您计算出单一的触点。   UIResponder 是所有响应者对象的基类, 它不仅为事

flyter的专栏 885

手把手教你用FPGA解析AD9680的JESD204B数据流(附Verilog代码)

本文详细介绍了如何利用FPGA解析AD9680的JESD204B数据流,包括协议核心机制、硬件平台搭建、Verilog代码实现及调试技巧。通过实战案例和代码示例,帮助工程师快速掌握高速ADC数据采集与处理技术,提升系统性能。

weixin_33640562的博客 371

OCUI界面设计:触摸与手势

触摸(UITouch)简介1、UIView继承于UIResponder是一种响应者类,可以响应用户触摸事件。2、UIViewController也是继承于UIResponder,属于响应者类。3、UIKit 继承链:4、UIResponder响应者类提供了便利的方法来处理触摸事件: 触摸开始 触摸移动 触摸结束 触摸取消 5、UITouch方法:// 触摸开始 - (void)touchesBega

李鴻耀 3547

ArcGIS 10.2.2自带Python 2.7.5环境配置全攻略:从pip安装到gdal、arcpy调用

本文详细指导如何在ArcGIS 10.2.2自带的Python 2.7.5环境中进行高效配置。核心内容包括安装pip包管理器、部署gdal等关键地理数据处理库,并确保arcpy模块的无缝调用。通过解决路径配置与PyCharm集成问题,帮助用户在此经典环境中构建稳定、兼容的地理信息自动化工作流,有效连接ArcGIS桌面功能与Python脚本编程。

moon9的博客 767

Qoder CN 完全指南:阿里云AI智能体的全景拆解

阿里云旗下AI编程助手"通义灵码"于2026年5月20日升级为QoderCN,转型为覆盖软件开发与办公场景的AI智能体产品矩阵。该平台具备四大核心能力:代码补全、智能问答、文件编辑和智能体模式,支持GLM、DeepSeek等多模型切换。特色功能包括Quest2.0任务委派、专家团协作和记忆感知,满足金融、政务等行业的合规需求。产品形态涵盖IDE插件、CLI工具、办公助手和数字员工,形成"全家桶"式解决方案。相比Cursor等海外产品,QoderCN更注重全链路覆盖,个

几十年资深高级架构师,技术专家的技术笔记。专注C、Java、Python、微服务、云原生、AI工程化及高并发系统分布式架构实战,分享源码剖析、性能调优与架构治理经验。 921

iOS触摸事件理解

## 如何确定由哪个视图响应触摸事件 解决这个问题之前,我们先看下几个与之相关的类。 ### UITouch 触摸,UITouch保存着跟手指相关的信息,比如触摸的位置、时间、阶段等。 1. 当手指移动时,系统会更新同一个UITouch对象,使之能够一直保存该手指在的触摸位置。 当手指离开屏幕时,系统会销毁相应的UITouch对象。 2. 一个手指触摸一次屏幕就会生产一个UITouch对象,多个手指同时触摸屏幕,就会生成多个UITouch对象。 3. 单个手指多次触摸屏幕(类似于双击等操作...

Do not just be a pragrammer 520

Abaqus中Cohesive单元建模:从本构到失效的完整指南

本文提供了Abaqus中Cohesive单元建模的完整指南,涵盖从本构模型到失效分析的全过程。详细解析了Cohesive单元作为模拟界面粘结与失效的关键工具,其核心在于弹性本构、损伤起始准则和损伤演化定律的设置。文章通过双悬臂梁(DCB)实例,手把手指导前处理、材料定义、求解设置及后处理分析,并分享了刚度、强度、断裂能等关键参数的影响与收敛性调优的实用避坑技巧,帮助用户准确模拟复合材料及胶接结构的界面失效行为。

cuda7parallel的博客 700

UITouch【触摸】属性及方法

【UITouch.h】【触摸】 官方API网址: https://developer.apple.com/reference/uikit/uitouch?language=objc#symbols //当用户用一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象,一根手指对应一个UITouch对象 //UITouch的作用保存着跟手指相关的信息,比如触摸的位置、时间、阶段 /

吴福增的博客 2623

Grafana图像渲染插件安装全攻略:解决依赖缺失问题(附完整命令清单)

本文详细介绍了在CentOS/RHEL环境下安装Grafana图像渲染插件`grafana-image-renderer`的全过程,包括解决常见的依赖缺失问题。通过提供完整的命令清单和疑难问题排查指南,帮助用户高效部署和优化插件性能,确保图像渲染功能稳定运行。

weixin_30399821的博客 85

基于Hadoop的NBA篮球球员大数据分析与可视化系统大数据分析系统python的项目(源码+lw+部署文档+讲解等)

本系统以 Hadoop 为基础,致力于对 NBA 篮球球员的海量数据进行深入分析与可视化呈现。它能够收集来自多个数据源的丰富数据,包括球员比赛统计数据、身体素质数据、技术特点数据等。利用 Hadoop 的分布式存储和计算能力,对这些大规模数据进行高效处理。通过数据分析算法,挖掘球员的潜在价值和特点,如球员的得分能力趋势、篮板球效率变化、不同位置球员的技术差异等。同时,借助先进的可视化技术,将分析结果以直观的图表、图形等形式展示出来。教练和球队管理层可以通过可视化界面清晰地了解球员的综合表现和发展态势,从而制

QQ3359892174的博客 1314

iOS 事件(UITouch、UIControl、UIGestureRecognizer)传递机制

一.触摸、事件、响应者 1. UITouch 源起触摸 一个手指一次触摸屏幕,就对应生成一个UITouch对象。多个手指同时触摸屏幕,生成多个UITouch对象。 多个手指先后触摸,系统会根据触摸的位置判断是否更新同一个UITouch对象。若两个手指一前一后触摸同一个位置(即双击),那么第一次触摸时生成一个UITouch对象,第二次触摸会更新这个UI...

海阔天空的专栏 1603

Innovus ECO修复时序违例:ecoAddRepeater插Buffer原理与实战

芯片物理设计越到后期,时序收敛越依赖局部修正而非全局重跑。ECO(Engineering Change Order)作为数字后端高频操作,能在不破坏既有布局布线结果的前提下,精准修复DRV违例、hold时序问题或实现功能补丁。其中,插入Buffer或Inverter是拆解长线RC负载、改善max_transition/max_capacitance最直接的手段。Innovus提供的ecoAddRepeater命令封装了单元选择、坐标摆放和网表重连等底层细节,配合ecoRoute可快速完成绕线。合理选型Buf

weixin_31858171的博客 299

模拟Android多点触控

Android多点触控Android多点触控 多点触控实现思路 第一种adb shell input方式 第二种adb shell sendevent方式多点触控实现思路  经过资料的查询,要在Android模拟器上实现多点触控,滑动等操作,主要有两种思路: 一是通过adb shell input swipe 来模拟手指滑动,实现多点触控; 二是先通过adb shell getevent来获取用户多

Kodoo的专栏 1万+

深入理解Android音视频同步机制(三)NuPlayer的avsync逻辑

本文深入介绍了NuPlayer的avsync逻辑和原理

张晖的专栏 1万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Android多点触控详解

Android多点触控详解

silencefly的博客 3067

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

H5多点触控原理以及对多点触控的追踪

对于PC端,我们的点击事件比较简单,因为鼠标指针只有一个。但是对于移动端来说,存在多个接触点同时操作的情况,这种情况就是我们今天要研究的主题 -- 多点触控。

专注前端、专注互联网、分享原创的博客 2007

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Android多点触控揭秘

本文原创,转载请注明:http://blog.youkuaiyun.com/cloudzfy1/article/details/6582707 Google 暑期大学生博客分享大赛 - 2011 Android 成长篇 如果您喜欢本文,请您投一下票: http://www.googl

Cloudzfy Space 2万+

Android 多点触控

多点触控 ( Multitouch,也称 Multi-touch ),即同时接受屏幕上多个点的人机交互操作,多点触控是从 Android 2.0 开始引入的功能,在 Android 2.2 时对这一部分进行了重新设计。 ①Android 将所有的事件都封装进了 Motionvent 中 ②可以通过复写 onTouchEvent 或者设置 OnTouchListener 来获取 View 的事件 ③多点触控获取事件类型要使用 getActionMasked() ④追踪事件流使用 PointId 1.多点触控相

zenmela2011的专栏 3242

Android多点触控

Android的多点触控,实则上就是对MotionEvent的更多处理。在Android平台上,触屏事件均使用了MotionEvent对象方式处理,比如开始触控时会触发ACTION_DOWN,而移动操作时为 ACTION_MOVE,最终放开手指时触发ACTION_UP事件,而用户无规则的操作则可能触发ACTION_CANCEL这个动作。另外需要注意的是:Android的多点触控功能需要在Andro

Ederick的专栏 1684

Unity实现安卓虚拟摇杆多点触控

代码示例在最下面 1. Unity对于触屏操作的支持 1.1. Touch结构体 Unity使用结构体Touch定义触屏设备的输入,每一个触控点(可以理解为每一个手指)对应一个Touch,其中主要的属性如下: 属性 含义 fingerId 触控点的编号,在该触控点的生命周期内(从点下到抬起)是不变的 phase 触控点的状态,是一个Touch.Phase枚举,包括: Began(手指按下),Move(手指滑动),Stationary(手指已经按下且保持不动),Ended(手指抬起),Ca

realfancy的博客 1万+

Android多点触控最佳实践

事故现场   最近在对公司项目中的控件进行优化改造,其中一个是能够上拉和下拉的弹性ScrollView。   发现没有,当使用一个手指的时候感觉还不错。但是当我想用两个手指交替不断下拉想要把视图内容往下“扒”的时候就办不到了,因为他在onTouchEvent()方法里只是最简单的实现了下拉的逻辑而没有涉及到多指触控,而我想要的效果是像QQ空间或者微信朋友圈那样的。 ...

疾风剑豪 560

cocos2dx-多点触控

声 明 本教程仅用于初学cocos2dx同学使用,内容由本人(孤狼)学习过程中笔记编写,本教程使用cocos2dx版本为2.1.4。本教程内容可以自由转载,但必须同时附带本声明,或注明出处。 gl.paea.cn版权所有。 hello,大家好,欢迎回...

101

Android开发之多点触控

Android开发之多点触控         如果您对开发多点触控程序感兴趣的话,那么本文将是一个很好的开始,android应用程序开发中,多点触摸并不是那么的遥不可及,实现起来也很简单,下面,我们先来了解下Android开发多点触控的原理。         Android多

ch_984326013的专栏 4830
上一篇: protocol和delegate
下一篇: 使用iOS手势UIGestureRecognizer
Ruansf
博客等级 码龄14年 1粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值