http://bbs.reactnative.cn/topic/306/%E5%9C%A8react-native%E4%B8%AD%E4%BD%BF%E7%94%A8art

前半个月捣腾了一下React Native ART
现在手上闲下来了和大家分享一下React Native中的ART使用心得

React Native ART 究竟是什么?

所谓ART,是一个在React中绘制矢量图形的JS类库。这个类库抽象了一系统的通用接口,统一了SVG,canvas,VML这类矢量图形在
React中的书写格式。你可以通过ART将SVG,canvas,VML的矢量图形拿到React中使用,也可以把ART反转回去。(虽然有很多局限
性,后面会讲到)
React Native ART 是react-art在React Native中的移植版,接口几乎完全一致,
React Native中的ART很早之前就已经开源了iOS版,最近又在0.18.0中开源了Android版本
因为缺少官方文档,一直不为人所知。

为什么要在React Native中使用 ART?

我在前端页面切片的时候比较喜欢用SVG,有条件我都尽量让设计师出AI的设计稿或者把图标导成SVG的
因为SVG和图片相比,优点太多太多:可以代码复用,可以无损放大,通过合理导出的svg代码比同等压缩过的图片文件大小要小很多,而且svg代码还可以通过gzip压缩
最近在做一个原生内嵌的React Native项目,设计师是按照原生APP的标准把每个图标切了3个尺寸给我,感谢React
Native中强大的打包工具,可以很方便的使用这写图标。所以项目开始也没想着要用SVG(当时android的ART还没开源,这也是一个重要因
素)。
在整个项目完成之后,看了一下,所有图片在经过压缩之后加起来有200多K,大小还可以接受。
但是在项目后期优化过程中,发现一个使用图片图标非常致命的问题:

<Image />元素在iOS下不是同步渲染的,即使是使用的本地图片资源!
更过分的是具有相同source的多个Image也不能在同一帧里面渲染出来的,如下的5个图标,在iOS下它们不会同时被渲
染出来,这样造成的影响是在打开一个列表的时候,看见这些图标一个接一个无序的跳出来,这个效果如果在iphone4s,5s下看相当的明显,很恶心,完
全不能忍受!想过各种方法也没办法绕过去。

首屏的如下几个图标以及返回按钮和logo,还有TabBar里面的图标在iOS下都是在界面出现的若干帧之后再无序的跳出来,这样的效果很不好,一点都没有原生APP的感觉,有一种hybird的既视感。

后来等到了0.18.0,Android的ART对外开源了,我想到为什么不用SVG图标尝试一下呢?
然后让设计师把这个图标:

重新切成SVG给我,然后再把SVG转成ART。
在iOS下完美渲染!所有图标和界面文字一起出现,不管是放5个还是100个。而且对界面的整体渲染速度也没有任何能感知到的影响。
在安卓下也是同样的完美,而且生成的ART代码要比图片小了很多。


  1. <Surface
  2. width={50}
  3. height={50}
  4. >
  5. <Group scale={0.23}>
  6. <Shape
  7. fill={`${this.props.active ? '#ff5942' : '#ccc'}`}
  8. d={`M46.31,0H3.69C1.63,0,0,1.63,0,3.69v42.63C0,48.37,1.63,50,3.69,50h42.63c2.05,0,3.69-1.63,3.69-3.69V3.69
  9. C50,1.63,48.37,0,46.31,0z M44.5,22.92l-7.76,7.65l1.8,10.61c0.18,1.07-0.29,2.14-1.21,2.77c-0.51,0.34-1.1,0.52-1.69,0.52
  10. c-0.49,0-0.98-0.12-1.42-0.35l-9.23-4.75l-9.23,4.75c-0.44,0.24-0.94,0.35-1.42,0.35c-0.6,0-1.19-0.17-1.69-0.52
  11. c-0.92-0.63-1.38-1.69-1.21-2.77l1.8-10.61l-7.76-7.65c-0.77-0.76-1.04-1.86-0.69-2.87c0.35-1.01,1.25-1.73,2.34-1.9l10.6-1.55
  12. l4.6-9.43c0.49-1,1.52-1.62,2.66-1.62c1.15,0,2.18,0.64,2.66,1.62l4.6,9.43l10.59,1.55c1.09,0.16,1.99,0.9,2.34,1.9
  13. C45.53,21.06,45.27,22.16,44.5,22.92z`}
  14. />
  15. </Group>
  16. </Surface>

这里面的路径代码是通过PS CC直接导出的,没有做任何优化,如果再优化一番可以再缩小一半。SVG代码优化后面再做介绍。
下面正式进入正题

如何在React Native中使用 ART?

安装 ART

安装ART很简单
安卓里面根本不用安装,0.18.0里面自带,直接在js引入既可

  1. import React, {ART} from 'react-native';
  2. const {Surface, Group, Shape} = ART;

iOS里面的ART是可选的,你需要手动导入xcodeproj文件,以及加入静态链接库
但是也很简单:教程

使用ART

请大家原谅我,其实我是标题党,我不会在这里详细的讲解ART的用法,而是讲一个基于ART的SVG库:react-native-art-svg

为什么我不在这里讲ART呢?原因如下
上面那段代码是ART代码和设计师给我svg代码其实有一些差异,还要把SVG转换一次,很不友好,因为ART的元素和SVG元素名称和用法都不太一样
在SVG代码里面,画布元素是<svg>而ART里面是<Surface>
绘制路径的元素在SVG里面是<path>,而ART里面的Path又是另外一个东西,在ART里面需要<Shape>
这都不是最麻烦的地方,一些基础的SVG图形<circle>、<rect>、<polygon>...等等的元素ART都是不支持的。
前端切图,不管是网页还是React Native的界面,设计稿和图标都是设计师给我们的(部分连设计都一起做了的大神除外)
而设计师给我们的矢量图标要么是AI原图要么是SVG,但是最终到我们手里,导出来必定是SVG。
所以ART虽然通过抽象接口来统一了SVG,canvas,VML在React中的使用,但是ART提供的接口还是相当不友好的。然后我就萌发了一个想法,为什么不再把ART封装一层,把语法封装成和SVG的语法呢?
然后react-native-art-svg就诞生了,支持SVG所有常用的元素和属性,svg代码拿过来几乎可以直接使用(后面会添加直接导入svg代码的功能)

预览图如下:

安装很简单,因为是纯JavaScript的类库,直接一行搞定
npm i react-native-art-svg --save

通过如下代码在js中引入

  1. import Svg, {
  2. Circle,
  3. Ellipse,
  4. G,
  5. LinearGradient,
  6. RadialGradient,
  7. Line,
  8. Path,
  9. Polygon,
  10. Polyline,
  11. Rect,
  12. Symbol,
  13. Text,
  14. Use,
  15. Defs,
  16. Stop
  17. } from 'react-native-art-svg';

上面的ART代码等同于如下的代码

  1. <Svg
  2. width={50}
  3. height={50}
  4. >
  5. <G scale={0.23}>
  6. <Path
  7. fill={`${this.props.active ? '#ff5942' : '#ccc'}`}
  8. d={`M46.31,0H3.69C1.63,0,0,1.63,0,3.69v42.63C0,48.37,1.63,50,3.69,50h42.63c2.05,0,3.69-1.63,3.69-3.69V3.69
  9. C50,1.63,48.37,0,46.31,0z M44.5,22.92l-7.76,7.65l1.8,10.61c0.18,1.07-0.29,2.14-1.21,2.77c-0.51,0.34-1.1,0.52-1.69,0.52
  10. c-0.49,0-0.98-0.12-1.42-0.35l-9.23-4.75l-9.23,4.75c-0.44,0.24-0.94,0.35-1.42,0.35c-0.6,0-1.19-0.17-1.69-0.52
  11. c-0.92-0.63-1.38-1.69-1.21-2.77l1.8-10.61l-7.76-7.65c-0.77-0.76-1.04-1.86-0.69-2.87c0.35-1.01,1.25-1.73,2.34-1.9l10.6-1.55
  12. l4.6-9.43c0.49-1,1.52-1.62,2.66-1.62c1.15,0,2.18,0.64,2.66,1.62l4.6,9.43l10.59,1.55c1.09,0.16,1.99,0.9,2.34,1.9
  13. C45.53,21.06,45.27,22.16,44.5,22.92z`}
  14. />
  15. </G>
  16. </Svg>

这段代码从SVG转过来可省心多了,只需要改一下元素的大小写,把元素名称改成大写字母开头的既可,属性名称改成驼峰式的命名方式。

通用属性列表:

属性名称 默认值 描述
fill '#000' 内部填充规则(填充颜色,填充渐变图形)
fillOpacity 1 填充的透明度
stroke 'none' 描边颜色
strokeWidth 1 描边的宽度
strokeOpacity 1 描边的透明度
strokeLinecap 'square' 描边线段端点显示方式
strokeLinejoin 'miter' 描边线段连接处的显示方式
strokeDasharray [] 描边线段断点显示规则
x 0 当前图形x轴偏移量
y 0 当前图形y轴偏移量
rotate 0 当前图形旋转值
scale 1 当前图形的缩放值
origin 0, 0 变形原点(x,y,rotate,scale的变形原点坐标)
originX 0 变形原点x轴坐标
originY 0 变形原点y轴坐标

可以看到,几乎所有SVG的常用属性都可以支持
不支持fillRule,因为官方认为fillRule不是SVG,canvas和VML公用的属性,他们不对这类独有的属性进行支持
暂不支持clipPath,因为ART官方还未完成

支持的元素列表:

Svg

Svg为所有矢量图形的画布元素,所有Svg内的矢量图形都会绘制在Svg内部
并且Svg支持viewbox和preserveAspectRatio属性(关于这两个属性的详解)

  1. <Svg
  2. height="100"
  3. width="100"
  4. >
  5. <Rect x="0" y="0" width="100" height="100" fill="black" />
  6. <Circle cx="50" cy="50" r="30" fill="yellow" />
  7. <Circle cx="40" cy="40" r="4" fill="black" />
  8. <Circle cx="60" cy="40" r="4" fill="black" />
  9. <Path d="M 40 60 A 10 10 0 0 0 60 60" stroke="black" />
  10. </Svg>;

上面的代码会绘制如下的图形

其中height和width定义了Svg元素的宽高

注意
在react-native-art-svg中,所有元素的数字类型的属性都可以直接用字符串表示,如:
下面两段属性声明都可以正常使用,这样写起来很方便
height="100"
height={100}

矩形:Rect

<Rect>元素可以在画布上绘制一个矩形,矩形位置和大小通过x,y,width,height属性共同定义

  1. <Svg
  2. width="200"
  3. height="60"
  4. >
  5. <Rect
  6. x="25"
  7. y="5"
  8. width="150"
  9. height="50"
  10. fill="rgb(0,0,255)"
  11. strokeWidth="3"
  12. stroke="rgb(0,0,0)"
  13. />
  14. </Svg>

上面的代码绘制了一个左上角位于画布25,5,宽150,高50的矩形
并且使用蓝色(rgb(0,0,255))填充(fill)内部背景
用黑色(rgb(0,0,0))进行描边(stroke),描边宽度(strokeWidth)为3

圆型:Circle

<Circle>元素可以在画布上绘制一个圆形,圆型需要cx,cy,r三个属性,分别对应圆形x轴坐标,y轴坐标以及半径

  1. <Svg
  2. height="100"
  3. width="110"
  4. >
  5. <Circle
  6. cx="50"
  7. cy="50"
  8. r="50"
  9. fill="pink"
  10. />
  11. </Svg>

椭圆:Ellipse

<Ellipse>元素可以在画布上绘制一个椭圆,椭圆和圆形类似,只是把圆形的r属性替换成了分别对应水平半径和垂直半径的rx,ry属性,rx == ry的椭圆是一个圆形

  1. <Svg
  2. height="100"
  3. width="110"
  4. >
  5. <Ellipse
  6. cx="55"
  7. cy="55"
  8. rx="50"
  9. ry="30"
  10. stroke="purple"
  11. strokeWidth="2"
  12. fill="yellow"
  13. />
  14. </Svg>

直线:Line

<Line>元素可以在画布上画一条从x1,y1到x2,y2的直线

  1. <Svg
  2. height="100"
  3. width="100"
  4. >
  5. <Line
  6. x1="0"
  7. y1="0"
  8. x2="100"
  9. y2="100"
  10. stroke="red"
  11. strokeWidth="2"
  12. />
  13. </Svg>

多边形:Polygon

<Polygon>元素可以在画布上画一个由多个点收尾相接组合而成的多边形,每个点的坐标由空格分开定义在points属性中

  1. <Svg
  2. height="100"
  3. width="100"
  4. >
  5. <Polyline
  6. points="10,10 20,12 30,20 40,60 60,70 95,90"
  7. fill="none"
  8. stroke="black"
  9. strokeWidth="3"
  10. />
  11. </Svg>

多边线:Polyline

<Polyline>元素和多边形类型,只是多边形的最后一个点和第一个点是相连的,组成的是一个闭合的图形,多边线的最后一个点和第一个点没有连接

  1. <Svg
  2. height="100"
  3. width="100"
  4. >
  5. <Polyline
  6. points="10,10 20,12 30,20 40,60 60,70 95,90"
  7. fill="none"
  8. stroke="black"
  9. strokeWidth="3"
  10. />
  11. </Svg>

路径:Path

<Path>的d属性内定义了一系列的路径坐标以及绘制规则命令,上面的所有图形都可以通过Path绘制而成

  • M = 把绘制点移动到某个位置
  • L = 从当前绘制点画一条直线到某个坐标
  • H = 从当前绘制点沿着x轴水平画线
  • V = 从当前绘制点沿着y轴垂直画线
  • C = 从当前绘制点画一条曲线到某个坐标
  • S = 从当前绘制点画一条平滑的曲线到某个坐标
  • Q = 从当前绘制点画一条贝赛尔曲线到某个坐标
  • T = 从当前绘制点画一条平滑的贝赛尔曲线到某个坐标
  • A = 从当前绘制点画一条椭圆曲线到某个点
  • Z = 闭合当前路径

注意: 上面所有的命令都可以使用小写字母,大写字母的命令是使用的坐标是绝对值,小写字母的命令的坐标是相对值

  1. <Svg
  2. height="100"
  3. width="100"
  4. >
  5. <Path
  6. d="M25 10 L98 65 L70 25 L16 77 L11 30 L0 4 L90 50 L50 10 L11 22 L77 95 L20 25"
  7. fill="none"
  8. stroke="red"
  9. />
  10. </Svg>

文字:Text

<Text>元素可以在画布上绘制文字图形

  1. <Svg
  2. height="60"
  3. width="200"
  4. >
  5. <Text
  6. fill="none"
  7. stroke="purple"
  8. fontSize="20"
  9. fontWeight="bold"
  10. x="100"
  11. y="20"
  12. textAnchor="center"
  13. >STROKED TEXT</Text>
  14. </Svg

SVG进阶元素使用

分组:G

<G>元素可以把它内部的子元素组合成一个分组,G元素内所有的子元素都将继承除(id,变形属性之外的所有属性)

下面两段代是相同的

  1. <Svg
  2. height="60"
  3. width="200"
  4. >
  5. <G width="100" height="30" fill="blue" x="0">
  6. <Rect y="0" />
  7. <Rect y="30" />
  8. </G>
  9. </Svg>
  10. <Svg
  11. height="60"
  12. width="200"
  13. >
  14. <G>
  15. <Rect width="100" height="30" fill="blue" x="0" y="0" />
  16. <Rect width="100" height="30" fill="blue" x="0" y="0" />
  17. </G>
  18. </Svg>

G元素的变形属性不会被继承

  1. <Svg
  2. height="100"
  3. width="200"
  4. >
  5. <G
  6. rotate="50"
  7. origin="100, 50"
  8. >
  9. <Line
  10. x1="60"
  11. y1="10"
  12. x2="140"
  13. y2="10"
  14. stroke="#060"
  15. />
  16. <Rect
  17. x="60"
  18. y="20"
  19. height="50"
  20. width="80"
  21. stroke="#060"
  22. fill="#060"
  23. />
  24. <Text
  25. x="100"
  26. y="75"
  27. stroke="#600"
  28. fill="#600"
  29. textAnchor="center"
  30. >
  31. Text grouped with shapes</Text>
  32. </G>
  33. </Svg>

定义:Defs

<Defs>元素内的所有图形都不会被绘制在画布上,<Defs>元素用于定义一些代码复用相关的元素,下面使用其他元素解释<Defs>元素的用法

复用:Use

使用<Use>元素可以进行代码复用,可以将<Defs>元素中定义的元素复制一份绘制在当前<Use>元素的位置

  1. <Svg
  2. height="100"
  3. width="300"
  4. >
  5. <Defs>
  6. <G id="shape">
  7. <Circle cx="50" cy="50" r="50" />
  8. <Rect x="50" y="50" width="50" height="50" />
  9. <Circle cx="50" cy="50" r="5" fill="blue" />
  10. </G>
  11. </Defs>
  12. <Use href="#shape" x="20" y="0"/>
  13. <Use href="#shape" x="170"y="0" />
  14. </Svg>

*注意:*Use元素使用href指定复用对象(SVG中是使用的xlink:href=),属性值为#+需要复用元素的id,也可以复用<Defs>外面具有id属性的元素,Use元素上的属性将覆盖被复用元素的属性

标记:Symbol

使用<Symbol>元素可以更快捷的定义元素,使用<Defs>元素定义可复用元素时,每个子元素对应一个可复用元素, 如果需要复用多个元素组成的图形时通常使用<Symbol>元素进行定义,<Symbol>自身也不会被绘制在画布上,而且可以 给Symbol指定viewbox和preserveAspectRatio属性,更为方便的对图形进行缩放

  1. <Svg
  2. height="150"
  3. width="110"
  4. >
  5. <Symbol id="symbol" viewbox="0 0 150 110" width="100" height="50">
  6. <Circle cx="50" cy="50" r="40" strokeWidth="8" stroke="red" fill="red"/>
  7. <Circle cx="90" cy="60" r="40" strokeWidth="8" stroke="green" fill="white"/>
  8. </Symbol>
  9. <Use
  10. href="#symbol"
  11. x="0"
  12. y="0"
  13. />
  14. <Use
  15. href="#symbol"
  16. x="0"
  17. y="50"
  18. width="75"
  19. height="38"
  20. />
  21. <Use
  22. href="#symbol"
  23. x="0"
  24. y="100"
  25. width="50"
  26. height="25"
  27. />
  28. </Svg>

渐变填充

LinearGradient:线性渐变

<LinearGradient>可以定义一个线性渐变的填充规则,改元素必须定义在<Defs>元素内。
线性渐变可以被定义为水平渐变、垂直渐变和带角度的渐变
通过调整x1,y1设置渐变开始点,x2,y2设置渐变结束点
使用<Stop>元素定义渐变的变色点

  1. <Svg
  2. height="150"
  3. width="300"
  4. >
  5. <Defs>
  6. <LinearGradient id="grad" x1="0" y1="0" x2="170" y2="0">
  7. <Stop offset="0" stopColor="rgb(255,255,0)" stopOpacity="0" />
  8. <Stop offset="1" stopColor="red" stopOpacity="1" />
  9. </LinearGradient>
  10. </Defs>
  11. <Ellipse cx="150" cy="75" rx="85" ry="55" fill="url(#grad)" />
  12. </Svg>

注意:<LinearGradient>和<RadialGradient>的x1,y2,x2,y2属性均可以使用百分比
下面<LinearGradient>绘制的结果等同于上面代码的绘制结果

  1. <LinearGradient id="grad" x1="0%" y1="0%" x2="100%" y2="0%">
  2. <Stop offset="0%" stopColor="rgb(255,255,0)" stopOpacity="0" />
  3. <Stop offset="100%" stopColor="red" stopOpacity="1" />
  4. </LinearGradient>

RadialGradient:径向渐变

<RadialGradient>可以定义一个线性渐变的填充规则,和<LinearGradient>一样改元素必须定义在<Defs>元素内。
cx,cu,rx,ry属性定义了最外层渐变椭圆的位置坐标和大小,fx和fy属性定义了最内层渐变椭圆的位置坐标

  1. <Svg
  2. height="150"
  3. width="300"
  4. >
  5. <Defs>
  6. <RadialGradient id="grad" cx="150" cy="75" rx="85" ry="55" fx="150" fy="75">
  7. <Stop
  8. offset="0"
  9. stopColor="#ff0"
  10. stopOpacity="1"
  11. />
  12. <Stop
  13. offset="1"
  14. stopColor="#83a"
  15. stopOpacity="1"
  16. />
  17. </RadialGradient>
  18. </Defs>
  19. <Ellipse cx="150" cy="75" rx="85" ry="55" fill="url(#grad)" />
  20. </Svg>

总结

好了,差不多就这些了。
上面包含了大多数react-native-art-svg类库的用法,想看更具体的例子请fork之后运行Example下面的示例工程。

让我们再回到在文章开头的那个项目中去,通过几番折腾,终于把项目中的所有图片都换成了矢量图形,在iOS下再也没有出现图片闪动或图片不能和界面同时渲染的问题了。
而且SVG代码再经过一番优化之后,把200多K的图片变成了30多K的矢量代码。完美!

我再顺带讲一下SVG代码优化:

    1. 优先使用基础图形!
      优先使用<Rect><Circle><Line><Polygon><Polyline><Ellipse>之类的基础图形
      能够使用这些元素绘制的图形就尽量使用这些元素来绘制,因为同样一个图形使用<Path>命令生成的代码要比其他基础元素生成的代码多很多倍
    2. 让设计师在画图的时候全部使用局中描边,因为只有局中描边导出的SVG代码会保留原始设计稿中的图形信息,用外层描边或内侧描边生成的SVG代码都是通过<path>元素绘制的,这样就会使得SVG代码成倍的增加。

[转] 在React Native中使用ART的更多相关文章

  1. React Native 中 CSS 的使用

    首先声明,此文原作者为黎 跃春 React Native中CSS 内联样式 对象样式 使用Stylesheet.Create 样式拼接 导出样式对象 下面的代码是index.ios.js中的代码: / ...

  2. react native中的欢迎页(解决首加载白屏)

    参照网页: http://blog.csdn.net/fengyuzhengfan/article/details/52712829 首先是在原生中写一些方法,然后通过react native中js去 ...

  3. React Native中的网络请求fetch和简单封装

    React Native中的网络请求fetch使用方法最为简单,但却可以实现大多数的网络请求,需要了解更多的可以访问: https://segmentfault.com/a/1190000003810 ...

  4. [转] 「指尖上的魔法」 - 谈谈 React Native 中的手势

    http://gold.xitu.io/entry/55fa202960b28497519db23f React-Native是一款由Facebook开发并开源的框架,主要卖点是使用JavaScrip ...

  5. react native中使用echarts

    开发平台:mac pro node版本:v8.11.2 npm版本:6.4.1 react-native版本:0.57.8 native-echarts版本:^0.5.0 目标平台:android端收 ...

  6. react native中一次错误排查 Error:Error: Duplicate resources

    最近一直在使用react native中,遇到了很多的坑,同时也学习到了一些移动端的开发经验. 今天在做一个打包的测试时,遇到了一个问题,打包过程中报错“Error:Error: Duplicate ...

  7. 在React Native中,使用fetch网络请求 实现get 和 post

    //在React Native中,使用fetch实现网络请求 /* fetch 是一个封装程度更高的网络API, 使用了Promise * Promise 是异步编程的一种解决方案 * Promise ...

  8. 《React Native 精解与实战》书籍连载「React Native 中的生命周期」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  9. react native中如何往服务器上传网络图片

    let common_url = 'http://192.168.1.1:8080/'; //服务器地址 let token = ''; //用户登陆后返回的token /** * 使用fetch实现 ...

随机推荐

  1. failure injection

    (1)malloc穷尽的情况: 假设下面的代码是测试代码,里面含有被测函数fmalloc,其中含有一个malloc语句,在一般情况下,是很难走到malloc失败的分支的,因为很难模拟系统内存耗尽的情况 ...

  2. 什么是redis数据库?

    新公司的第一个项目让用redis.之前没接触过,所以从网上找些文章,学习理解一下   原链接:http://baike.so.com/doc/5063975-5291322.html 什么是redis ...

  3. jquery GET POST

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <head> ...

  4. go bytes缓冲区使用介绍

    缓冲区原理简介: go字节缓冲区底层以字节切片做存储,切片存在长度len与容量cap, 缓冲区写从长度len的位置开始写,当len>cap时,会自动扩容.缓冲区读会从内置标记off位置开始读(o ...

  5. 监控 DNS 流量,预防安全隐患五大招!

    尽管 IT 管理员尽心尽责地监控设备.主机和网络是否存在恶意活动的迹象,却往往出力不讨好.主机入侵检测和端点保护对很多公司来说可能是"必需"的安全措施,但如果要找出 RAT.roo ...

  6. 修改EditText的光标位置

    Android 的 EditText 控件默认获取焦点的时候, 插入光标是在第一个位置的,如果EditText中设置了文本, 这个时候光标是在文本的最前面, 而不是文本的最后. 为了方便用户使用, 需 ...

  7. Dynamics CRM 2011编程系列(60):JS编程之CRUD辅助类(JQuery版)

    今天给大家分享一个JQuery版的REST辅助类,在一年前我分享过一个只能在IE环境下运行的REST辅助类:<JS编程之实体CRUD辅助类 >.为什么要推出JQuery版的CRUD辅助类呢 ...

  8. 【转】patch命令

    原文网址:http://bbs.chinaunix.net/thread-1945698-1-1.html patch给文件1应用补丁文件变成另外一个文件2(需要先用"diff 文件1 文件 ...

  9. HDU-2149 Public Sale

    http://acm.hdu.edu.cn/showproblem.php?pid=2149 巴什博奕(Bash Game): Public Sale Time Limit: 1000/1000 MS ...

  10. Android学习笔记(二)Manifest文件节点详解

    在上一篇博文中简单介绍了Manifest文件及其存放位置,本篇就来详细介绍一下Manifest文件中的节点和一些节点的基本作用,首先看一下Manifest文件最基本的结构: <manifest ...