当前位置:  编程技术>移动开发
本页文章导读:
    ▪ActionBarSherlock学习札记 第一篇——部署        ActionBarSherlock学习笔记 第一篇——部署         ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android版本上实现ActionBar的效果和功能。当在4.0+的版本使用时.........
    ▪ Core Text实现编者的时候会用到的        Core Text实现编辑的时候会用到的首先说一下实现的原理,  首先当手指开始触摸屏幕  以及滑动的时候,  效果与画矩形框是一样的 因此  此时的代码也机会没有区别, 当手指松开后   在.........
    ▪ 让Ipad应用程序的default。png等待时间替3秒       让Ipad应用程序的default。png等待时间为3秒 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {          [NSThread sleepForTimeInterval:3]; //就这一句代码就搞掂    .........

[1]ActionBarSherlock学习札记 第一篇——部署
    来源: 互联网  发布时间: 2014-02-18
ActionBarSherlock学习笔记 第一篇——部署
         ActionBarSherlock是JakeWharton编写的一个开源框架,使用这个框架,可以实现在所有的Android版本上实现ActionBar的效果和功能。当在4.0+的版本使用时,会使用Android自身的ActionBar,当在4.0之前的版本使用时,则会使用ActionBarSherlock自身自定义的一套框架来实现ActionBar的功能。
    要获得ActionBarSherlock,我们可以到Git上或者其官网上来下载,这两个网址分别是:
    https://github.com/JakeWharton/ActionBarSherlock
    http://actionbarsherlock.com/
    我是从Git上下载的,当下载完成解压之后会得到一个ActionBarSherlock-master的文件,其目录结构如下:

    我们只需要关注其中两个文件夹下的内容,分别是actionbarsherlock和actionbarsherlock-samples,前者是ActionBarSherlock的全部代码,后者是作者提供的一些使用的示例代码。
    接下来不妨为eclipse创建一个新的workspace,将其命名为ActionBarSherlock,我们将在这个单独的workspace里来研究学习ActionBarSherlock,然后用eclipse打开这个新的工作空间。
    第一步先将actionbarsherlock的工程导入到我们的工作空间,File->Import->Android->Existing Android Code Into Workspace,如下所示:

    然后点Next,然后选择我们之前解压的目录下的actionbarsherlock文件夹,将Copy projects into workspace勾选上,点击Finish。
    可以看到actionbarsherlock已经导入到了我们的工作空间。

    actionbarsherlock这个项目的作用是用来作为其他项目的lib,在项目名称上 右键->properties->Android可以看到下面的Is Library复选框是勾选上的,如果没有,现在勾上。


    下一步要导入作者为我们提供的一系列示例代码了。
    我们先打开刚才解压的目录下的actionbarsherlock-samples文件夹,里面应该是这样的:


        这几个文件夹都是工程目录,我们只需要关注其中的四个就足够了:demos,fragments,roboguice,styled。我们首先将demos项目导入工作空间,方法和之前导入actionbarsherlock一样。导入完毕后如下:


    右键项目的名称->properties->Android可以看到,


    我们需要将actionbarsherlock项目作为该项目的库,所以这里我们需要操作一下,先将打了红叉的那一条选中->remove,然后点击Add,会看到:


    选择actionbarsherlock->OK,会看到:


        这样就完成了,我们可以在这个项目中使用库项目的所有代码和资源了。
    编译一下项目,然后就可以在手机上跑实例代码了。如果有问题,多检查一下代码的编码格式(UTF-8),clean几次然后编译几次,不会有问题的。

    接下来,用同样的方法,我们可以把其他三个示例项目导入到工作空间中,但是这个时候你可能会遇到一个问题,比如说在导入fragments这个项目的时候会出现下面的情况:



        因为和之前导入的项目同名了,所以我们还要将之前导入的项目改一下名字,并将后面导入的项目都改一下名字,防止他们同名,这样就可以了。


    

    看到网上有些人教你将actionbarsherlock的代码和资源copy出来手动加到自己的项目里,这样其实是不对的。

转载请注明http://blog.csdn.net/carrey1989/article/details/12832081



    
[2] Core Text实现编者的时候会用到的
    来源: 互联网  发布时间: 2014-02-18
Core Text实现编辑的时候会用到的

首先说一下实现的原理,  首先当手指开始触摸屏幕  以及滑动的时候,  效果与画矩形框是一样的 因此  此时的代码也机会没有区别,

当手指松开后   在当前的矩形框处创建一个临时的textView ,并且背景变为灰色,textView    编辑结束, 在textView的  完成委托方法中    去掉灰色的背景  去掉临时的textView    在相同的位置上 利用coreText   显示出刚才编辑的内容

 

首先 手指触摸 会调用到

TextTool.m

?
1
2
3
4
5
6
7
8
9
10
11
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
  UIView *touchedView = [delegate viewForUseWithTool:self];
 //注意下面这句代码
  [touchedView endEditing:YES];
  // we only track one touch at a time for this tool.
  UITouch *touch = [[event allTouches] anyObject];
  // remember the touch, and its original start point, for future
  [trackingTouches addObject:touch];
  CGPoint location = [touch locationInView:touchedView];
  [startPoints addObject:[NSValue valueWithCGPoint:location]];
}

 代码  除了注释的那一句 基本上与前面的矩形  是相同的  纪录下来  UITouch 的实例  以及 开始的点 

而注释那一句 得到的touchedView  就是dudelView 如果此处设置为yes   在textView 成为第一响应 弹出键盘后,我们可以直接触摸view  来取消TextView的第一响应状态

 

 

随着手指移动  不断调用到  touchMoved   但是 与前面矩形的实现一样 这里的touchMoved方法为空  画出临时矩形的实现代码在

drawTemporary 方法中

TextTool.m

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)drawTemporary {
  if (self.completedPath) {
    [delegate.strokeColor setStroke];
    [self.completedPath stroke];
  } else {
    UIView *touchedView = [delegate viewForUseWithTool:self];
    for (int i = 0; i<[trackingTouches count]; i++) {
      UITouch *touch = [trackingTouches objectAtIndex:i];
      CGPoint startPoint = [[startPoints objectAtIndex:i] CGPointValue];
      CGPoint endPoint = [touch locationInView:touchedView];
      CGRect rect = CGRectMake(startPoint.x, startPoint.y, endPoint.x - startPoint.x, endPoint.y - startPoint.y);
      UIBezierPath *path = [UIBezierPath bezierPathWithRect:rect];
      [delegate.strokeColor setStroke];
      [path stroke];
    }
  }
}

 completedPath是一个UIBezierPath  的实例, 在touchEnded方法中 将最终矩形的路径 设置到其中, 所以在手指抬起来以前  都只会进入到else分支, 根据 起点与当前手指触摸的点 描出一个矩形来

 

 

当手指抬起来后  进入touchEnded方法,而主要的实现代码就在这里面

TextTool.m

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
  UIView *touchedView = [delegate viewForUseWithTool:self];
  for (UITouch *touch in [event allTouches]) {
    // make a rect from the start point to the current point
    NSUInteger touchIndex = [trackingTouches indexOfObject:touch];
    // only if we actually remember the start of this touch...
    if (touchIndex != NSNotFound) {
      CGPoint startPoint = [[startPoints objectAtIndex:touchIndex] CGPointValue];
      CGPoint endPoint = [touch locationInView:touchedView];
      [trackingTouches removeObjectAtIndex:touchIndex];
      [startPoints removeObjectAtIndex:touchIndex];
       
      // detect short taps that are too small to contain any text;
      // these are probably accidents
      if (distanceBetween(startPoint, endPoint) < 50.0) return;
       
      CGRect rect = CGRectMake(startPoint.x, startPoint.y, endPoint.x - startPoint.x, endPoint.y - startPoint.y);
      self.completedPath = [UIBezierPath bezierPathWithRect:rect];
       
      // draw a shaded area over the entire view, so that the user can
      // easily see where to focus their attention.
      UIView *backgroundShade = [[[UIView alloc] initWithFrame:touchedView.bounds] autorelease];
      backgroundShade.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.5];
      backgroundShade.tag = SHADE_TAG;
      backgroundShade.userInteractionEnabled = NO;
      [touchedView addSubview:backgroundShade];
       
      // now comes the fun part.  we make a temporary UITextView for the
      // actual text input.
      UITextView *textView = [[[UITextView alloc] initWithFrame:rect] autorelease];
      textView.font = delegate.font;
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
      [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
       
      // in case the chosen view is going to be below the keyboard, we need to
      // make an effort to determine how far the display area should slide when
      // the keyboard is going to be shown.
      //
      // keyboard heights:
      //
      // 352 landscape
      // 264 portrait
      CGFloat keyboardHeight = 0;
      UIInterfaceOrientation orientation = ((UIViewController*)delegate).interfaceOrientation;
      if (UIInterfaceOrientationIsPortrait(orientation)) {
        keyboardHeight = 264;
      } else {
        keyboardHeight = 352;
      }
      CGRect viewBounds = touchedView.bounds;
      CGFloat rectMaxY = rect.origin.y + rect.size.height;
      CGFloat availableHeight = viewBounds.size.height - keyboardHeight;
      if (rectMaxY > availableHeight) {
        // calculate a slide distance so that the dragged box is centered vertically
        viewSlideDistance = rectMaxY - availableHeight;
      } else {
        viewSlideDistance = 0;
      }
       
      textView.delegate = self;
      [touchedView addSubview:textView];
      textView.editable = NO;
      textView.editable = YES;
      [textView becomeFirstResponder];
    }
  }
}

 首先 得到起点,终点,然后清空数组

if (distanceBetween(startPoint, endPoint) < 50.0) return;  进行了一个判断,  防止用户画的矩形太小,影响输入文字,

如果大小没问题,接下来  便将最终的矩形路径  赋值到 self.completedPath    在退出此方法后 进入drawTemporary后就会进入if分支

接着画出 灰色的背景, 此处的设置透明度为0.5,  并且为背景view设置tag为SHADE_TAG  这个标记用来在以后 编辑完成的时候通过 viewWithTag方法 找到这个背景的实例  并且 移除它

接下来便开始创建textView   其frame就是 刚在最终得到的矩形路径的位置信息

接着注册了一些通知, 即在键盘弹出,或者落下的时候 调用的几个方法

下面的一部分代码实现的功能是   如果键盘弹出 可能会挡住 textView 判断 是否挡住了 如果挡住了 需要向上移动多少距离,并且将这个距离 赋值给全局的 变量viewSlideDistance  如果没有挡住 设置为0

最后将textView显示出来,并且通过[textView becomeFirstResponder];  在其刚显示的时候 马上成为第一响应者,弹出键盘

 

 

 

下面两个方法在键盘弹出之前以及落下之前,调用  移动视图,防止textView 被挡

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
- (void)keyboardWillShow:(NSNotification *)aNotification { 
  UIInterfaceOrientation orientation = ((UIViewController*)delegate).interfaceOrientation;
    [UIView beginAnimations:@"viewSlideUp" context:NULL];
  UIView *view = [delegate viewForUseWithTool:self];
  CGRect frame = [view frame];
  switch (orientation) {
    case UIInterfaceOrientationLandscapeLeft:
      frame.origin.x -= viewSlideDistance;
      break;
    case UIInterfaceOrientationLandscapeRight:
      frame.origin.x += viewSlideDistance;
      break;
    case UIInterfaceOrientationPortrait:
      frame.origin.y -= viewSlideDistance;
      break;
    case UIInterfaceOrientationPortraitUpsideDown:
      frame.origin.y += viewSlideDistance;
      break;
    default:
      break;
  }
  [view setFrame:frame];
    [UIView commitAnimations];
}
- (void)keyboardWillHide:(NSNotification *)aNotification {
  UIInterfaceOrientation orientation = ((UIViewController*)delegate).interfaceOrientation;
    [UIView beginAnimations:@"viewSlideDown" context:NULL];
  UIView *view = [delegate viewForUseWithTool:self];
  CGRect frame = [view frame];
  switch (orientation) {
    case UIInterfaceOrientationLandscapeLeft:
      frame.origin.x += viewSlideDistance;
      break;
    case UIInterfaceOrientationLandscapeRight:
      frame.origin.x -= viewSlideDistance;
      break;
    case UIInterfaceOrientationPortrait:
      frame.origin.y += viewSlideDistance;
      break;
    case UIInterfaceOrientationPortraitUpsideDown:
      frame.origin.y -= viewSlideDistance;
      break;
    default:
      break;
  }
  [view setFrame:frame];
    [UIView commitAnimations];
}

 

 

 

当我们编辑完了内容后  我们可以点击屏幕的其他地方(我们设置了[dudelView endEditing:YES])     或者点击键盘上的落下键盘按钮   这时 进入textView的  delegate

 

 

?
1
2
3
4
5
6
7
8
9
10
11
- (void)textViewDidEndEditing:(UITextView *)textView {
  //NSLog(@"textViewDidEndEditing");
  TextDrawingInfo *info = [TextDrawingInfo textDrawingInfoWithPath:completedPath text:textView.text strokeColor:delegate.strokeColor font:delegate.font];
  [delegate addDrawable:info];
  self.completedPath = nil;
  UIView *superView = [textView superview];
  [[superView viewWithTag:SHADE_TAG] removeFromSuperview];
  [textView resignFirstResponder];
  [textView removeFromSuperview];
  [[NSNotificationCenter defaultCenter] removeObserver:self];
}

 

 这里  用到了一个新类TextDrawingInfo  同上一章  的PathDrawingInfo  类似,都是 存放一个完整操作的  全部信息,由于上一章我们做的是绘图操作,因此PathDrawingInfo 存放的是每次绘图操作的信息,  而这次我们主要向利用coreText在屏幕上显示文字  那么之前绘制的矩形的信息 此时已经没有用 我门要  取得  CoreText 需要的信息,即我们这次文字操作的信息  存到TextDrawingInfo 中去  并且添加到 dudelView  的 drawables中  最后  将没用的东西全部从屏幕上移除    

 

最后看以下  TextDrawingInfo  中的draw方法是怎么把文字绘制上去的

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
- (void)draw {
  CGContextRef context = UIGraphicsGetCurrentContext();
 
  NSMutableAttributedString *attrString = [[[NSMutableAttributedString alloc] initWithString:self.text] autorelease];
  [attrString addAttribute:(NSString *)(kCTForegroundColorAttributeName) value:(id)self.strokeColor.CGColor range:NSMakeRange(0, [self.text length])];
   
  CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
   
  CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, [attrString length]), self.path.CGPath, NULL);
  CFRelease(framesetter);
  //CFRelease(attrString);
  if (frame) {
    CGContextSaveGState(context);
     
    // Core Text wants to draw our text upside-down!  This flips it the
    // right way.
    CGContextTranslateCTM(context, 0, path.bounds.origin.y);
    CGContextScaleCTM(context, 1, -1);
    CGContextTranslateCTM(context, 0, -(path.bounds.origin.y + path.bounds.size.height));
 
    CTFrameDraw(frame, context);
 
    CGContextRestoreGState(context);
 
    CFRelease(frame);
  }
}

 首先获得当前的上下文 

创建一个属性自字符串NSMutableAttributedString  并设置他的颜色以及其他属性

利用该属性字符串 创建一个CTFramesetterRef

再创建一个CTFrameRef

释放之前创建的CTFramesetterRef  对象framesetter

由于CoreText 是来自于Mac OS X的  它在绘图的时候 认为坐标轴是倒置的,所以在没ios中会产生倒置的效果,这里要转化以下才能正常显示

 

 

 

 

 

学习这一章 主要学习它的思路     怎么实现在一个view上   画出一个矩形框后 就是一个testView  并且编辑完成后  在相应的位置相识出编辑的内容  当然我们也可以利用 一些其他的图文混排的库  比如DTcoreText


    
[3] 让Ipad应用程序的default。png等待时间替3秒
    来源: 互联网  发布时间: 2014-02-18
让Ipad应用程序的default。png等待时间为3秒

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    

[NSThread sleepForTimeInterval:3]; //就这一句代码就搞掂

    // Add the view controller's view to the window and display.

    [self.window addSubview:viewController.view];

    [self.window makeKeyAndVisible];


    return YES;

}



    
最新技术文章:
▪Android开发之登录验证实例教程
▪Android开发之注册登录方法示例
▪Android获取手机SIM卡运营商信息的方法
▪Android实现将已发送的短信写入短信数据库的...
▪Android发送短信功能代码
▪Android根据电话号码获得联系人头像实例代码
▪Android中GPS定位的用法实例
▪Android实现退出时关闭所有Activity的方法
▪Android实现文件的分割和组装
▪Android录音应用实例教程
▪Android双击返回键退出程序的实现方法
▪Android实现侦听电池状态显示、电量及充电动...
▪Android获取当前已连接的wifi信号强度的方法
▪Android实现动态显示或隐藏密码输入框的内容
CSS属性参考手册 iis7站长之家
▪Android Touch事件分发过程详解
▪Android中实现为TextView添加多个可点击的文本
▪Android程序设计之AIDL实例详解
▪Android显式启动与隐式启动Activity的区别介绍
▪Android按钮单击事件的四种常用写法总结
▪Android消息处理机制Looper和Handler详解
▪Android实现Back功能代码片段总结
▪Android实用的代码片段 常用代码总结
▪Android实现弹出键盘的方法
▪Android中通过view方式获取当前Activity的屏幕截...
▪Android提高之自定义Menu(TabMenu)实现方法
▪Android提高之多方向抽屉实现方法
▪Android提高之MediaPlayer播放网络音频的实现方法...
▪Android提高之MediaPlayer播放网络视频的实现方法...
▪Android提高之手游转电视游戏的模拟操控
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3