《React Native移动开发实战》一一3.3 完善轮播广告——Image组件

简介: 本节书摘来自华章出版社《React Native移动开发实战》一 书中的第3章,第3.3节,作者:袁林 著 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

3.3 完善轮播广告——Image组件
之前的轮播广告页面显示的是简单的文字和背景色,接下来添加一些好看的图片作为轮播广告。
React Native中用于图片显示的组件是Image。Image组件可以显示多种不同类型图片,包括网络图片、静态资源、临时的本地图片,以及本地磁盘上的图片(如相册)等。
3.3.1 使用网络图片
这里先使用网络图片来看看Image的用法和效果。修改app.js代码如下:

01 export default class app extends Component {
02 constructor(props) {
03 super(props);
04 this.state = {
05 advertisements: [ // 轮播广告数组
06 { // 数组中的每个成员描述了网络图片的url
07 url: 'https://img13.360buyimg.com/cms/jfs/t4090/228/

                        1399180862/217278/206073fe/5874e621Nc675c6d0.jpg'

08 }, {
09 url: 'https://img13.360buyimg.com/cms/jfs/t3937/

                        164/1340098884/295670/ca0ebbaf/58703afbN5336c28d.jpg'

10 }, {
11 url: 'https://img14.360buyimg.com/cms/jfs/t3190/

                        189/5382195407/297118/377d637e/586f5b7bN9c81c29c.jpg'

12 }
13 ],
14 };
15 }
16
17 // 这里省略了没有修改的代码
18
19 render() {
20 return (
21
22 // 这里省略了没有修改的代码
23
24 25 horizontal={true}
26 showsHorizontalScrollIndicator={false}
27 pagingEnabled={true}>
28 {this.state.advertisements.map((advertisement,

                            index) => {

29 return (
30

                                    {() => Alert.alert('你单击了轮播图', null,
                                    null)}>

31

                                        Content} 

32 source={{
33 uri: advertisement.url
34 }}>


35
36 );
37 })}
38
39
40 // 这里省略了没有修改的代码
41
42 );
43 }
44
45 // 这里省略了没有修改的代码
46 }
?注意:当使用新的模块或组件时(例如这里的Image)时,首先必须要在文件头导入该模块或组件import {Image} from 'react-native';,否则会发生无法找到变量Image的错误。
重新加载应用,此时使用网络图片的轮播广告效果如图3.11所示。
image

图3.11 使用网络图片的轮播广告
3.3.2 使用本地图片
除了使用网络图片,还可以将图片资源下载后添加到ch04项目中,使用本地图片。
首先,将上面用到的网络图片下载到本地,重命名为advertisement-image-01.jpg、advertisement-image-02.jpg以及advertisement-image-03.jpg,然后复制至ch04项目文件夹中,效果如图3.12所示。
image

图3.12 下载并添加图片到ch04项目
然后,修改代码中Image引用图片的方式,引用网络图片是设置Image组件source属性的url值,而引用本地图片可以直接设置Image组件的source属性,图片通过require方式加载,修改后的app.js代码如下:

01 export default class app extends Component {
02 constructor(props) {
03 super(props);
04 this.state = {
05 advertisements: [ // 轮播广告数组
06 {
07 image: require('./advertisement-image-01.jpg')
08 }, {
09 image: require('./advertisement-image-02.jpg')
10 }, {
11 image: require('./advertisement-image-03.jpg')
12 }
13 ],
14 };
15 }
16
17 // 这里省略了没有修改的代码
18
19 render() {
20 return (
21
22 // 这里省略了没有修改的代码
23
24 25 horizontal={true}
26 showsHorizontalScrollIndicator={false}
27 pagingEnabled={true}>
28 {this.state.advertisements.map((advertisement,

                            index) => {

29 return (
30

                                    {() => Alert.alert('你单击了轮播图', null, 
                                null)}>

31

                                        Content} 

32 source={advertisement.image}>
33


34
35 );
36 })}
37
38
39 // 这里省略了没有修改的代码
40
41 );
42 }
43
44 // 这里省略了没有修改的代码
45 }
?提示:引用本地图片资源时,需要格外注意require的图片文件路径,否则会发生找不到图片的错误。以上述代码为例, require('./advertisement-image-01.jpg')引用的文件路径是指,在ch04项目根目录下的advertisement-image-01.jpg。
使用本地图片的效果如图3.13所示。
image

图3.13 使用本地图片的轮播广告
3.3.3 添加指示器组件
给轮播广告换上了漂亮的图片之后,还差一个效果:当前页面指示器,效果如图3.14所示。
从图3.14中可以看出,指示器由圆点组成,圆点的个数即页面的数量,并且与当前页面序号相同的圆点会做颜色区分。
(1)在了解了指示器的原理之后,首先定义指示器中圆点的尺寸,修改app.js代码如下:

01 const circleSize = 8;
02 const circleMargin = 5;
03
04 export default class app extends Component {
05 // 这里省略了没有修改的代码

(2)在render()函数中的轮播广告中添加指示器组件,代码如下:

01 export default class app extends Component {
02 // 这里省略了没有修改的代码
03
04 render() {
05 const advertisementCount = this.state.advertisements.length;

         // 指示器圆点个数

06 const indicatorWidth = circleSize * advertisementCount +

         circleMargin * advertisementCount * 2;     // 计算指示器的宽度

07 const left = (Dimensions.get('window').width - indicatorWidth)

         / 2;                             // 计算指示器最左边的坐标位置

08
09 return (
10
11 // 这里省略了没有修改的代码
12
13 14 horizontal={true}
15 showsHorizontalScrollIndicator={false}
16 pagingEnabled={true}>
17 {this.state.advertisements.map((advertisement,

                         index) => {

18 return (
19

                                 {() => Alert.alert('你单击了轮播图', null,
                                 null)}>

20

                                     Content}

21 source={advertisement. image}>
22


23
24 );
25 })}
26
27 28 styles.indicator, {
29 left: left
30 }
31 ]}>
32 {this.state.advertisements.map((advertisement,
                         index) => {

33 return (34 style={(index === this.state.currentPage)
35 ? styles.circleSelected
36 : styles.circle}/>);
37 })}
38
39
40 // 这里省略了没有修改的代码
41
42 );
43 }
44
45 // 这里省略了没有修改的代码
46 }

在上述代码中,首先通过指示器圆点的个数计算出了指示器的宽度,然后通过屏幕和指示器的宽度,计算出了指示器最左边的坐标位置。
(3)修改样式和布局的代码如下:

01 const styles = StyleSheet.create({
02 // 这里省略了没有修改的代码
03 indicator: {
04 position: 'absolute',
05 top: 160,
06 flexDirection: 'row'
07 },
08 circle: {
09 width: circleSize,
10 height: circleSize,
11 borderRadius: circleSize / 2,
12 backgroundColor: 'gray',
13 marginHorizontal: circleMargin
14 },
15 circleSelected: {
17 width: circleSize,
18 height: circleSize,
19 borderRadius: circleSize / 2,
20 backgroundColor: 'white',
21 marginHorizontal: circleMargin
22 },
23 // 这里省略了没有修改的代码
24 });

这里我们使用了一种新的布局方法absolute,即绝对布局。使用绝对布局时,组件的位置和尺寸必须明确定义,例如上述代码中top、left、width以及height。由于绝对布局并没有flex布局自适应屏幕的能力,所以在实际开发中,使用绝对布局组件的以上属性往往是通过计算动态得到的,例如上述代码中,指示器的宽度和最左边的坐标位置都是在获取屏幕宽度后,计算得到的。
?提示:在实际开发中,如果使用绝对布局,千万不要将位置和尺寸定义为固定值,否则将无法支持不同屏幕的适配。
(4)添加完指示器并配置好样式后,运行效果如图3.15所示。image

相关文章
|
前端开发 API UED
React 懒加载图片 Lazy Image
懒加载是一种优化技术,通过延迟加载不在视口内的图片,减少初始页面加载时间,提升用户体验。本文从基础概念入手,逐步探讨 React 中实现图片懒加载的常见问题、易错点及解决方案,并通过代码案例详细解释。
650 3
|
前端开发 UED 索引
React 图片灯箱组件 Image Lightbox
图片灯箱组件是一种常见的Web交互模式,用户点击缩略图后弹出全屏窗口展示大图,并提供导航功能。本文介绍了基于React框架的图片灯箱组件开发,涵盖初始化状态管理、图片加载与预加载、键盘和鼠标事件处理等常见问题及解决方案。通过`useState`和`useEffect`钩子管理状态,使用懒加载和预加载优化性能,确保流畅的用户体验。代码案例展示了组件的基本功能实现,包括打开/关闭灯箱、切换图片及键盘操作。
517 80
|
移动开发 前端开发 JavaScript
React 图片裁剪组件 Image Cropper
本文介绍了在React中实现图片裁剪功能的方法,涵盖基础知识、常见问题及解决方案。首先,通过第三方库如`react-image-crop`或`cropperjs-react`可轻松实现图片裁剪。接着,针对性能和兼容性问题,提供了优化图片加载、处理裁剪区域响应慢、解决浏览器差异等方案。最后,通过代码案例详细解释了如何创建一个基本的图片裁剪组件,并提出了优化建议,如使用`React.memo`、添加样式支持及处理大图片预览,帮助开发者避免常见错误并提升用户体验。
895 67
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
【4月更文挑战第30天】对比 Flutter(Dart,强类型,Google支持,快速热重载,高性能渲染)与 React Native(JavaScript,庞大生态,热重载,依赖原生渲染),文章讨论了开发语言、生态系统、性能、开发体验、学习曲线、社区支持及项目选择因素。两者各有优势,选择取决于项目需求、团队技能和长期维护考虑。参考文献包括官方文档和性能比较文章。
835 0
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
|
前端开发 JavaScript API
React 图片放大组件 Image Zoom
本文介绍如何使用React创建图片放大组件(Image Zoom),提升用户体验。组件通过鼠标悬停或点击触发放大效果,利用`useState`管理状态,CSS实现视觉效果。常见问题包括图片失真、性能下降和移动端支持,分别可通过高质量图片源、优化事件处理和添加触摸事件解决。易错点涉及状态管理混乱、样式冲突和过多事件绑定,建议使用上下文API、CSS模块及优化事件绑定逻辑。高级功能扩展如多张图片支持和自定义放大区域进一步丰富了组件的实用性。
563 25
|
存储 前端开发 索引
React 图片轮播组件 Image Carousel
本文介绍了如何使用React创建图片轮播组件。首先,解释了图片轮播的基本概念和组件结构,包括图片容器、导航按钮、指示器和自动播放功能。接着,通过代码示例详细说明了创建基本组件、添加自动播放、处理边界情况的步骤。还探讨了常见问题如状态更新不及时、内存泄漏和样式问题,并提供了解决方案。最后,介绍了进阶优化,如添加过渡效果、支持触摸事件和动态加载图片,帮助读者构建更完善的轮播组件。
395 16
|
Dart 前端开发 JavaScript
探索移动应用开发中的跨平台解决方案:Flutter与React Native的比较
在移动应用开发领域,选择合适的跨平台解决方案是关键。本文将深入分析Flutter和React Native这两大主流框架,从性能、开发效率、社区支持等方面进行比较,帮助开发者做出明智的选择。
511 27
|
开发框架 移动开发 前端开发
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
【5月更文挑战第14天】Uniapp和React Native是热门的跨平台移动开发框架。Uniapp以其一套代码多端运行、丰富的组件生态和较低的学习曲线受到青睐,适合快速开发简单应用。React Native基于React,拥有活跃社区和优秀性能,适合复杂应用。React Native在性能上略胜一筹,尤其在需要接近原生体验的场景。Uniapp的官方组件弥补了社区资源不足。选择时需考虑开发效率、性能需求、团队技术栈和社区支持。
3373 1
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
441 1