React Native ART绘制图形

Posted 殇神马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了React Native ART绘制图形相关的知识,希望对你有一定的参考价值。

一、前言

我们知道在html5,androidios中都提供了绘制相关的API,如Html5中的canvas标签,Android中的Canvas类,iOS中的CoreGraphics,这些API都可以实现丰富的图形绘制;因为在实际移动应用的开发过程中,使用系统提供的一些UI组件可能没办法做出我们想要的UI效果,这个时候就需要使用绘制相关的API来自定义绘制复杂的UI;

在React中react-art是reactjs团队基于art(一个兼容各个浏览器SVG绘制的API封装)开发的模块,让react开发者能使用jsx语法绘制svg。
React Native团队分别在0.10.0和0.18.0也添加了iOS和Android平台对react-art的支持在低版本的React Native中ART就在React Native内核中,我们可以直接使ART,在高版本 的React Native中ART移动到了 '@react-native-community/art’中了,我们需要引入art库;

二、React Native ART

-React Native ART到底可以干什么?

React Native ART 是用来绘制矢量图(SVG)的;他可以让我们像Android中Canavs一样简单的绘制任意UI;

-React Native ART使用

在安卓中使用无需配置任何东西就可使用,在iOS中ART是可选的,你需要手动导入ART.xcodeproj文件,并手动导入libART.a静态库。
iOS项目中配置ART的具体方式如下:
在Xcode选中项目点击右键->Add Files to Your Project Name->选择添加Project path/node_modules/react-native/Libraries/ART/ART.xcodeproj。
在Build Phases中的Link Binary With Libraries中点击+号,选择添加libART.a。

-React Native ART使用步骤

(1)在低版本的React Native中ART就在React Native内核中,我们可以直接使用ART;

使用方式:在使用的时候直接导入相关组件

 import 
    ART
   from 'react-native'

  const 
    Surface,
    Shape,
    Path,
    Tranform
 = ART 

(2)在高版本的React Native中ART从React Native 核心库中移除了,被移到了@react-native-community/art中,

使用:

-引入art库

 npm install  @react-native-community/art

-使用的时候导入相关组件

import Surface, Shape,Path from '@react-native-community/art';

-基本的API
(1)Surface 一个矩形可渲染的区域,是其他元素的容器!
所有的ART相关组件都必须在Surface中,Surface中不能有非ART组件;
并且Surface必须设置宽和高

  <Surface width=500 height=500 style=backgroundColor:'#FFFFFF'>
         ...
  </Surface>     

(2)Shape 形状

可以设置的属性:

stroke: 线的颜色

fill:填充的颜色

strokeWidth:线的粗细

strokeDash:设置虚线相关 值是数组 数组中是两个元素第一个元素 是每个虚线的长度,第二个元素是虚线之间的距离

d:赋值一个Path对象,用于设置Shape显示的绘制形状

transform:赋值一个Transform对象,用于实现对形状的平移,旋转,缩放操作

(3)Path

Shape的属性值 表示绘制的路径

使用:

-创建Path对象

 let path=new Path();

-方法

moveTo(x,y): 移动到x,y (绝对坐标)

move(x,y): 横坐标移动x,纵坐标移动y

lineTo(x,y): 目标点坐标为(x,y) 绝对坐标,初始点和目标点之间连线

line(x,y): 目标点为当前点横坐标移动x,纵坐标移动y,初始点和目标点之间连直线

arc(x,y,rx,ry,outer): 目标点为横坐标移动x,纵坐标移动y,然后从初始点向目标点画
椭圆曲线,长轴半径为rx,短轴半径为ry

arcTo(x,y,rx,ry,outer): 目标点为(x,y)绝对坐标,然后从初始点向目标点画
椭圆曲线,长轴半径为rx,短轴半径为ry

curve(2个,4个或者6个参数):从一个坐标点向另一个坐标点画贝塞尔曲线
当参数为2个时,绘制光滑二次贝塞尔曲线;
当参数为4个时,绘制二次贝塞尔曲线;
当参数为6个时,绘制三次贝塞尔曲线;

(4)Transform
Shape的属性值,对绘制的内容变换的属性,包括,平移,旋转,缩放变换

-创建Transform对象

let tranform=new Transform()

-方法

translate(x,y): 横坐标方向移动x,纵坐标方向移动y

scale(x,y):宽缩放x,高缩放y倍小于1就是缩小,大于一就是放大

roate(deg,x,y):以(x,y)为旋转中心旋转deg度

(5)Group
Group组件可有可无,当绘制内容较多时可以用其统一管理,可以把它当做View标签使用,可制定内容在画布绘制的起点。

<Surface>
     <Group x=100 y=100>
        <Shape
             strokeWidth=10
             stroke='#3366FF'
             d=this.linePath
             originX=DEVICE_WIDTH/2
             originY=DEVICE_HEIGHT/2 />
     </Group>
 </Surface>  

-实例 (绘制直线,虚线,矩形,圆)

import React from 'react';
import 
    View,
    Dimensions
 from 'react-native';
import Surface, Shape,Path,Transform from '@react-native-community/art';

export let DEVICE_WIDTH = Dimensions.get('window').width;
export let DEVICE_HEIGHT = Dimensions.get('window').height;

export default class MainScreen extends React.Component
  line = new Path().moveTo(0, DEVICE_HEIGHT / 2 - 200)
        .line(DEVICE_WIDTH, 0);

    dashLine = new Path().moveTo(0, DEVICE_HEIGHT / 2)
        .line(DEVICE_WIDTH, 0);

    rectPath = new Path()
        .moveTo(20, DEVICE_WIDTH / 2)
        .lineTo(100, DEVICE_WIDTH / 2)
        .lineTo(100, DEVICE_WIDTH / 2 + 100)
        .lineTo(20, DEVICE_WIDTH / 2 + 100)
        .close();

    circlePath = new Path().moveTo(0, DEVICE_HEIGHT / 2)
        .arc(DEVICE_WIDTH, 0, DEVICE_WIDTH / 2, DEVICE_WIDTH / 2, 0)
        .arc(-DEVICE_WIDTH, 0, DEVICE_WIDTH / 2, DEVICE_WIDTH / 2, 0)
    
         render()
            return (

            <View>
                <Surface width=DEVICE_WIDTH height=DEVICE_HEIGHT>

                    /* 实线 */
                    <Shape
                        stroke=Color.colorBlue
                        strokeWidth=5
                        d=this.line
                    />

                    /* 虚线 */
                    <Shape
                        stroke=Color.colorBlue
                        strokeWidth=5
                        d=this.dashLine
                        strokeDash=[50, 100]>
                    </Shape>
                    
                      /* 矩形 */
                    <Shape
                        stroke=Color.colorBlue
                        strokeWidth=5
                        d=this.rectPath 
                        >
                    </Shape>

 					/* 圆*/
                    <Shape
                        stroke=Color.colorBlue
                        strokeWidth=5
                        d=this.circlePath
                        >
                    </Shape>
                </Surface>
            </View >
            )     
      

以上就是使用ART来绘制一些基本的图形;

三、React Native ART 动画

上面介绍了使用ART 的一些API来绘制基本的图形,但是这些图形都是静态的,往往我们需要图形是有动画效果的,如绘制一个加载中的圆形进度条,也即一个不断旋转的圆 ;
前面我们已经学习过React Native 动画(Animated),所以可以结合React Native中提供的Animated API来使得ART绘制的内容动起来 ;

我们知道Animated默认只支持 Animated.View, Animated.Image,Animated.ScrollView, Animated.Text,Animated.FlatList,Animated.SectionList这几种组件;
但是我们可以使用Animated.createAnimatedComponent(组件)来使得任意组件支持Animated动画;

所以我们可以让ART中的Shape创建AnimatedShape来使得Shape可以使用Animated动画,也即可以让ART绘制的内容动起来;

const AnimatedShape=Animated.createAnimatedComponent(Shape);

然后使用AnimatedShape以及Shape的相关属性,以及Animated来实现ART动画

(1)平移 通过不断改变Shape的 x,y属性值来实现平移

移动的直线:

import React from 'react';
import 
    View,
    Dimensions
 from 'react-native';
import Surface, Shape,Path,Transform from '@react-native-community/art';
export let DEVICE_WIDTH = Dimensions.get('window').width;
export let DEVICE_HEIGHT = Dimensions.get('window').height;
export default class MainScreen extends React.Component
   linePath=new Path().move(0,0).lineTo(100,100);
   animateX=Animated.Value(0)
   translateX=Animated.timing(this.animateX, 
        toValue: 100,          //属性目标值
        duration: 1000,       //动画执行时间
        easing: Easing.linear
    )
   componentDidMount() 
       this.translateX.start()
   
   render()
    
    return (
       <View>
        <Surface width=DEVICE_WIDTH height=DEVICE_HEIGHT>
             <AnimatedShape
                 strokeWidth=10
                 stroke='#3366FF'
                 x=this.animateX
                 y=this.animateX
                 d=this.linePath
              >
        </Surafce>
       </View>
    )
   

(2)旋转
Shape的originX,originY属性为旋转中心,通过不断改变 rotation 旋转角度来实现旋转动画

旋转的圆形加载进度条:

import React from 'react';
import 
    View,
    Dimensions
 from 'react-native';
import Surface, Shape,Path,Transform from '@react-native-community/art';
export default class MainScreen extends React.Component
    radius=30
    bgCirclePath=new Path().moveTo(DEVICE_WIDTH/2-this.radius,DEVICE_HEIGHT/2)
        .arc(this.radius*2,0,this.radius,0,0)
        .arc(-(this.radius*2),0,this.radius,0,0)

    progressCirclePath=new Path().moveTo(DEVICE_WIDTH/2- this.radius,DEVICE_HEIGHT/2)
        .arc(this.radius*2,0,this.radius,0,0)
    deg=new Animated.Value(0)    
    rotate=Animated.timing(this.deg, 
    toValue: 1,        //属性目标值
    duration: 1000,    //动画执行时间
    easing: Easing.linear
    )    
    
    componentDidMount() 
        this.startAnimate()
    

    startAnimate()
        this.deg.setValue(0)
        this.rotate.start(()=>this.startAnimate())
        
   render()
    
    return (
       <View>
        <Surface width=DEVICE_WIDTH height=DEVICE_HEIGHT>
        
         <AnimatedShape
             strokeWidth=10
             stroke='#C0C0C0'
             d=this.bgCirclePath
             >
         </AnimatedShape>

     <AnimatedShape
         strokeWidth=10
         stroke='#0066FF'
         d=this.progressCirclePath
         rotation=realDeg
         originX=DEVICE_WIDTH/2
         originY=DEVICE_HEIGHT/2>  
      </AnimatedShape>
     </Surafce>
   </View>
    )
   

(3)缩放 通过修改Shape的scale或者scaleX,scaleY属性值来实现缩放
这个就不再写示例了,直接参考上面平移,旋转动画实现就可以了;

以上就是React Native ART 动画的基本实现

以上是关于React Native ART绘制图形的主要内容,如果未能解决你的问题,请参考以下文章

matlabplot纵坐标要为正整数吗

react-native-Art动画基础

react-native-Art动画基础

React-Native-Maps 如何绘制折线

React Native 错误 - 不变违规:ART 已从 React Native 中删除

React 绘制图形