react-native-sf-sprite
精灵控件,支持移动、放大、旋转、渐变动画,可以拖动
绘制图层,支持绘制线段、连续线段实现画笔功能
安装
npm install react-native-sf-sprite
IOS
Add the ART.xcodeproj (found in node_modules/react-native/Libraries/ART) to the Libraries group and add libART.a to Link Binary With Libraries under Build Phases.
Props
SFSprite
parameter
type
required
description
default
tag
number
no
标签
0
source
uri/string
yes
图片资源
width
number
yes
图片宽度
height
number
yes
图高度
visible
boolean
no
是否显示
true
canDrag
boolean
no
是否可以拖拽移动
false
rotate
number
no
旋转度(0-360)
0
opacity
number
no
透明度(0-1)
1
x
number
no
坐标x
0
y
number
no
坐标y
0
anchorPointX
number
no
锚点x(0-1)
0.5
anchorPointY
number
no
锚点y(0-1)
0.5
scaleX
number
no
放大倍数x
1
scaleY
number
no
放大倍数y
1
resizeModel
string
no
图片显示模式'cover', 'contain', 'stretch', 'repeat', 'center'
'stretch'
showHitBox
bool
no
是否显示精灵碰撞框
false
showHitBoxColor
string
no
碰撞框颜色
'white'
onPress
func
no
点击事件(tag)
null
onPressIn
func
no
按下事件(tag)
null
onPressOut
func
no
抬起并不在精灵范围内事件(tag)
null
onMoveBegin
func
no
开始移动事件({touchX,touchY,tag})
null
onMove
func
no
移动事件({touchX,touchY,tag)
null
onMoveEnd
func
no
结束移动事件({touchX,touchY,tag)
null
SFDrawLayer
parameter
type
required
description
default
x
number
no
画布x
0
y
number
no
画布y
0
width
number
no
画布宽度
屏幕宽度
height
number
no
画布高度
屏幕高度
Methods
SFSprite
Methods
Params
Param Types
description
Example
reset
重置精灵
setEnable
value
bool
false:不可触发事件
setVisible
value
bool
设置隐藏
setPos
{x:,y:}
dic
设置位置
setPosX
{x:}
dic
设置位置x
setPosY
{y:}
dic
设置位置y
setScale
{x:,y:}
设置放大缩小
setScaleX
{x:}
dic
设置放大缩小x
setScaleY
{y:}
dic
设置放大缩小y
setRotate
{angle:}
dic
设置旋转角度(0-360)
setOpacity
{opacity:}
dic
设置透明度(0-1)
setAnchorPoint
{x:,y:}
dic
设置锚点(0-1)
setAnchorPointX
{x:}
dic
设置锚点x
setAnchorPointY
{y:}
dic
设置锚点y
getVisible
无
无
获取是否显示
getSize
无
无
获取精灵宽高
getPos
无
无
获取精灵位置
getPosX
无
无
获取位置x
getPosY
无
无
获取位置y
getPosRealX
无
无
获取实际位置x(由于锚点不一样,实际位置与显示位置不一样)
getPosRealY
无
无
获取实际位置y(由于锚点不一样,实际位置与显示位置不一样)
getPosReal
无
无
获取实际位置(由于锚点不一样,实际位置与显示位置不一样)
getScale
无
无
获取放大缩小
getScaleX
无
无
获取缩放x
getScaleY
无
无
获取缩放y
getRotate
无
无
获取角度
getOpacity
无
无
获取透明度
getAnchorPoint
无
无
获取锚点
getAnchorPointX
无
无
获取锚点x
getAnchorPointY
无
无
获取锚点y
setHitLines
pointAry,r
array,number
设置碰撞线段,碰撞半径。设置后碰撞后不可以超过线段
SFSprite-Animated (所有动画都需要调用run相应的函数去执行才能生效)
Methods
Params
Param Types
description
Example
moveTo
{x:x, y:y, dur, easing:easing}
移动到指定位置
moveToX
{x:x, dur:dur, easing:easing}
移动到指定位置x
moveToY
{y:y, dur:dur, easing:easing}
移动到指定位置y
rotateTo
{angle:angle, dur:dur, easing:easing}
旋转
fadeIn
{dur:dur, easing:easing}
淡入
fadeOut
{dur:dur, easing:easing}
淡出
scalexTo
{scaleX:scaleX, dur:dur, from:from, easing:easing}
缩放到
scaleyTo
{scaleY:scaleY, dur:dur, from:from, easing:easing}
缩放到
scaleTo
{scaleX:scaleX, scaleY:scaleY, dur:dur, from:from, easing:easing}
缩放到
parallel
aniArray
array
组合平行动画
sequence
aniArray
array
组合顺序动画
run
ani, finish
obj,func
执行单一动画
runParallel
aniAry, finish
同时执行多个动画
runSequence
aniAry, finish, loop = 1
顺序执行多个动画,可重复
stop
无
无
停止动画
runRotateLoop
dur, finish, loop = 1
number,func,number
执行无限旋转动画
SFDrawLayer
Methods
Params
Param Types
description
Example
drawLine
p1, p2, color, size
{x:,y:},{x:,y:},string,number
画线段
drawPathBegin
color, size
string,number
绘制连续线段起始,每次重新绘制都需要调用
drawPath
p
{x:,y:}
绘制连续线段
getLineKB
p1,p2
{x:,y:},{x:,y:}
获取线性函数k,b系数
getPointByLineAndCircle
p1, p2, center, r
{x:,y:},{x:,y:},{x:,y:},number
获取圆与直线的2个交点
setVisible
value
bool
设置是否显示
setLineVisible
value
bool
设置线段是否显示
setPathVisible
value
bool
设置连续线段是否显示
例子
import React, {Component} from 'react';
import {
Platform,
StyleSheet,
Text,
View,
TouchableWithoutFeedback,
ScrollView,
findNodeHandle,
Dimensions,
Image
} from 'react-native';
import {SFSprite,SFDrawLayer} from "react-native-sf-sprite"
var width = Dimensions.get('window').width;
var height = Dimensions.get('window').height;
# 动画例子
var obj = this.sp;
var dur = 300;
obj.runSequence([//顺序执行动画
obj.moveTo({x:width/2-200,y:100,dur:dur}),
obj.moveTo({x:width/2-100,y:100,dur:dur}),
],(tag,finished)=>{//顺序执行结束回调
obj.runParallel([//同时执行动画
obj.moveTo({x:width/2,y:50,dur:dur}),
obj.scaleTo({scaleX:0.5,scaleY:0.5,dur:dur})
],(tag,finished)=>{同时执行动画回调
obj.setScale({x:0.5,y:0.5})
//旋转动画
obj.runRotateLoop(dur,()=>{
obj.run(obj.scaleTo({scaleX:1,scaleY:1,dur:dur}),()=>{
obj.setScale({x:1.5,y:1.5});
obj.run(obj.moveTo({x:width/2,y:height/2,dur:dur}),()=>{
obj.runRotateLoop(300,()=>{},0)
})
})
},2);
})
},1)
//精灵绘制
<SFSprite
ref={(ref)=> {this.sp = ref}}
width={100}
height={100}
x={width/2}
y={height/2}
scaleX={1}
scaleY={1}
showHitBox={true}
canDrag={true}
onMove={this.onMove}
onMoveBegin={this.onMoveBegin}
anchorPointX={0.5}
anchorPointY={0.5}
onPress={()=>console.log('onPress')}
onPressIn={()=>console.log('onPressIn')}
onPressOut={()=>console.log('onPressOut')}
source={require('./1.png')}/>
# 绘制例子
<SFDrawLayer ref={(ref)=>{this.draw = ref}}/>
//绘制线段
this.draw.drawLine({x:0,y:0},{x:width,y:height},'black',5);
//绘制连续线段
//在开始移动函数里调用
onMoveBegin = (data) => {
this.draw.drawPathBegin('white',10);
}
//在移动函数里调用
onMove = (data) => {
if (this.sp.checkLineIn({px1:0,py1:0,px2:width,py2:100})){//碰撞检测
console.log('碰到线段')
}
//绘制连续线段
this.draw.drawPath({x:data.touchX,y:data.touchY})
}