电影天堂React Native 客户端V2.0发布

简介: 电影天堂React Native 客户端V2.0发布

电影天堂React Native 客户端


重新开始!


具体更新以https://github.com/XboxYan/DYTT为准。


重新开始


两年前发布了第一个版本。


现在,


使用最新的react-native 0.57和全新的设计完成了V2.0


免责声明


本项目仅供学习交流使用,不得用于其他商业行为,数据来源于第三方网站,与本人无关


为什么要重新开始呢


有很多小伙伴发邮件问我为什么之前的项目运行不起来。


其实这个是我自己的原因,之前做的时候没什么经验,很多时候就直接修改了第三方库,


所以就运行不起来了


还有就是第三方api也做了很大的变动


react-native和其他第三方库都更新了许多,正好重新开始,把一些新特性都利用起来(比如context),完整的来做一个项目,这比单纯的学习看文章要有效的多


正常的app本来就是需要长期维护更新的,只不过由于是个人项目,很多时候完成一个阶段就会因为各种原因而被耽搁,精力有限实属无奈


特色


大概是全网个人影视类项目最漂亮、体验最好的了吧(下方有截图~)。


最为一名偏体验偏设计的前端开发者,对界面和用户体验都有极高的重视。


(见过很多类似的,功能算是出来了,但是界面一看就是程序员风格)


演示视频


项目依赖


依赖项不多,大部分都是用原生自带组件完成

{
  "name": "DYTT",
  "version": "2.0.0",
  "private": true,
  "scripts": {
    "start": "node node_modules/react-native/local-cli/cli.js start",
    "test": "jest"
  },
  "dependencies": {
    "react": "16.6.1",
    "react-native": "0.57.5",
    "react-native-gesture-handler": "^1.0.9",
    "react-native-scrollviewpager": "^1.0.3",
    "react-native-splash-screen": "^3.1.1",
    "react-native-swiper": "^1.5.14",
    "react-native-vector-icons": "^6.1.0",
    "react-native-video": "^4.0.1",
    "react-navigation": "^3.0.0"
  },
  "devDependencies": {
    "babel-jest": "23.6.0",
    "jest": "23.6.0",
    "metro-react-native-babel-preset": "0.49.2",
    "react-test-renderer": "16.6.1"
  },
  "jest": {
    "preset": "react-native"
  }
}


安装


github 项目地址


本项目适用于相关技术人员学习交流,请自行编译安装

git clone https://github.com/XboxYan/DYTT.git
cd DYTT
yarn
react-native run-android


下载


目前只有安卓版本下载,需要ios的可以自行编译安装


下载链接


二维码


(微信扫码可能不支持,建议用其他扫描工具或者直接用浏览器打开上面链接)


考虑到安全问题,暂不提供安装包,可通过上述方式安装,或者与我联系提供安装包


相关截图


欢迎页

image.png

首页

image.png

功能菜单

image.png

历史记录

image.png

收藏

image.png

主题颜色

image.png

搜索

image.png

搜索结果

image.png

影片筛选

image.png

影片详情

image.png

影片播放

image.png

更新记录


记录一些页面的关键点


20181123


使用react-navigation作为导航


/App.js


由于新版导航用到了原生手势库,所以需要

yarn add react-native-gesture-handler
react-native link react-native-gesture-handler


整体导航结构如下

const Drawer = createDrawerNavigator({
    Index: Index,
    History: History,
    Follow: Follow,
    Theme: Theme,
},DrawerNavigatorConfig);
const App = createAppContainer(createStackNavigator({
    Drawer: Drawer,
    Search: Search,
    MovieContent: MovieContent,
    MovieDetail: MovieDetail,
    Comment: Comment,
}, StackNavigatorConfig));


tab切换使用的是本人封装导航器react-native-scrollviewpager


https://github.com/XboxYan/react-native-scrollviewpager


有兴趣的可以给个star


使用方式比较简单

yarn add react-native-scrollviewpager
import Scrollviewpager from 'react-native-scrollviewpager';
const tabBarOptions = (themeColor) => ({
    style:{
        paddingHorizontal:10,
        height:40,
        backgroundColor:'#fff'
    },
    labelStyle:{
        color:'#666'
    },
    activeTintColor:themeColor,
    indicatorStyle:{
        width:20,
        borderRadius:4,
        height:3,
        backgroundColor:themeColor,
        bottom:2
    }
})
//
<Scrollviewpager tabBarOptions={tabBarOptions(themeColor)} >
    <Text tablabel="首页">111</Text>
    <Text tablabel="电影">111</Text>
    <Text tablabel="动漫">111</Text>
</Scrollviewpager> 
//


20181125


使用context管理全局数据


/util/store.js


历史记录,收藏,主题(废弃,下面有其他方式实现)

export const Store = createContext(initialStore);
<Store.Provider value={{
    ...initialStore
}}>
    {this.props.children}
</Store.Provider>


20181127


影视详情页面


./src/page/MovieDetail.js


头部滚动跟随效果使用Animated.ScrollView实现

scrollTop = new Animated.Value(0);
//...
<Animated.ScrollView
    scrollEventThrottle={1}
    onScroll={Animated.event(
        [{ nativeEvent: { contentOffset: { y: this.scrollTop } } }],
        { useNativeDriver: true }
    )}
>
</Animated.ScrollView>
//...


视频播放器自定义外观


./src/components/Video.js


使用开源播放器react-native-video


https://github.com/react-native-community/react-native-video


这里有一个bug


source={{uri:uri}}uri不能为空字符串,否则切换资源部生效


支持手势快进快退,自动隐藏播放栏


  • 还未完成的功能


全屏切换


20181203


主题颜色


./App.js./src/page/Theme.js


react-navigation内置属性screenProps,其原理仍然使用的context特性

<App screenProps={{themeColor:themeColor, setTheme:this.setTheme}} />


调用方式

const {navigation,screenProps:{themeColor}} = this.props;


20181204


历史记录


./src/page/History.js


通过context传递数据,需设置contextType

import { Store } from '../../util/store';
export default class History extends PureComponent {
    render() {
        const { historyList } = this.context;
        return (
            //...
        )
    }
}
History.contextType = Store;


20181205


收藏页面


./src/page/Follow.js


与'历史记录'基本一致


20181206


本地存储


./util/storage.js


使用原生AsyncStorage

class Storage {
    /**
     * 获取
     */
    static get = async (key) => {
        try {
            const value = await AsyncStorage.getItem(key);
            if (value !== null) {
                // We have data!!
                return JSON.parse(value)
            } else {
                return false
            }
        } catch (error) {
            return false
        }
    }
    /**
     * 保存
     */
    static save = async (key, value) => {
        try {
            await AsyncStorage.setItem(key, JSON.stringify(value));
            return true
        } catch (error) {
            // Error saving data
            return false
        }
    }
}
export default Storage;


20181209


搜索


./src/page/Search.js


20181211


影片筛选


./src/page/MovieContent.js


使用侧边导航栏,调用方式与原生DrawerLayoutAndroid一致

import DrawerLayout from 'react-native-gesture-handler/DrawerLayout';


20181214


图标,启动图


使用开源库react-native-splash-screen


https://github.com/crazycodeboy/react-native-splash-screen#readme


如果需要白底深色的状态栏文字

<style name="SplashScreenTheme" parent="SplashScreen_SplashTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="colorPrimaryDark">@color/status_bar_color</item>
    <item name="android:windowLightStatusBar">true</item><!--加上这一句-->
</style>


2.0 基本完成


20181217


安卓打包


./android/build.gradle


修改一下配置


注释jcenter(),添加

maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
maven{ url 'https://jitpack.io' }


不然会卡在下载阶段

...
allprojects {
    repositories {
        mavenLocal()
        google()
        //jcenter()
        //更换国内镜像
        maven{ url 'http://maven.aliyun.com/nexus/content/groups/public/'}
        maven{ url 'https://jitpack.io' }
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url "$rootDir/../node_modules/react-native/android"
        }
    }
}
...


常用命令

# 卸载安装包
adb uninstall com.packgeName
# 生成Release包
gradlew assembleRelease
# 安装Release包
gradlew installRelease


注意:在 debug 和 release 版本间来回切换安装时可能会报错签名不匹配,此时需要先卸载前一个版本再尝试安装。可通过 adb uninstall com.packgeName 方式来卸载,直接通过长按桌面图标有可能卸载不干净


还未完成的还接下来要做的


  • 视频播放做全屏切换
  • 没有适配ios,不过代码中没有使用安卓专有的库,理论上可以直接运行(可能有少部分需要适配),有兴趣的小伙伴可以fork下来自己适配一下
  • 会新增设置选项,进行网络设置,播放设置等(会参考其他视频软件的功能)
  • 目前历史记录和收藏均保存在本地,意味着如果卸载app将导致数据丢失,如果可能的话,将来把数据保存在自己的服务器上
  • react-navigation在页面切换时略微卡顿,还有一个react-native-navigation,如果可能的话,可以用来替代react-navigation
  • 目前在网上找的api可能不够理想,如果谁有更好的设计和更好的api可以参考一下~如果有提供后台服务的就更好了
  • react-native确实性能略显不足,特别是长列表的情况,准备学习flutter,一种新的渲染方式(类似于web中的canvas
相关文章
|
6月前
|
前端开发 JavaScript API
基于React的简易REST API客户端设计与实现
基于React的简易REST API客户端设计与实现
97 3
|
6月前
|
开发框架 前端开发 JavaScript
探索前端开发中的跨平台框架React Native
本文将介绍前端开发中一种备受关注的跨平台框架React Native,通过比较原生应用与React Native的优缺点,探讨其在实际项目中的应用以及未来发展趋势。
103 2
|
6月前
|
开发框架 Dart 前端开发
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
【4月更文挑战第30天】对比 Flutter(Dart,强类型,Google支持,快速热重载,高性能渲染)与 React Native(JavaScript,庞大生态,热重载,依赖原生渲染),文章讨论了开发语言、生态系统、性能、开发体验、学习曲线、社区支持及项目选择因素。两者各有优势,选择取决于项目需求、团队技能和长期维护考虑。参考文献包括官方文档和性能比较文章。
240 0
【Flutter前端技术开发专栏】Flutter与React Native的对比与选择
|
3月前
|
前端开发 JavaScript 算法
React Server Component 使用问题之想在路由切换时保持客户端状态,如何实现
React Server Component 使用问题之想在路由切换时保持客户端状态,如何实现
|
3月前
|
前端开发 JavaScript 搜索推荐
|
4月前
|
前端开发 JavaScript Android开发
React Native跨平台开发实战
【7月更文挑战第21天】React Native为跨平台移动应用开发提供了一种高效且强大的解决方案。通过本文的学习,你应该能够掌握React Native的基本概念和实战步骤,并开始在你的项目中使用React Native进行开发。随着你对React Native的深入理解,你将能够利用其强大的功能来构建更加复杂和高效的移动应用。
|
5月前
|
前端开发 自动驾驶 程序员
鸿蒙? 车载?Flutter? React Native? 为什么我劝你三思,说点不一样的
本文探讨了在信息技术快速发展的背景下,开发者如何选择学习路径。作者提倡使用终局思维来规划职业发展,考虑技术的长远影响。终局思维注重长远目标、系统分析、反向规划和动态调整。以车载开发为例,预测未来智能汽车可能由语音助手主导,而非依赖平板界面。此外,作者建议不要过分投入打工状态,应思考创建自己的产品,如App,以实现技能补充和额外收入。选择对未来发展和自主性有益的技术,如Kotlin,比盲目追求热点更为重要。做减法和有标准的选择,能帮助减轻焦虑,实现更高效的成长。关注公众号“AntDream”获取更多相关内容。
135 1
|
6月前
|
开发框架 移动开发 前端开发
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
【5月更文挑战第14天】Uniapp和React Native是热门的跨平台移动开发框架。Uniapp以其一套代码多端运行、丰富的组件生态和较低的学习曲线受到青睐,适合快速开发简单应用。React Native基于React,拥有活跃社区和优秀性能,适合复杂应用。React Native在性能上略胜一筹,尤其在需要接近原生体验的场景。Uniapp的官方组件弥补了社区资源不足。选择时需考虑开发效率、性能需求、团队技术栈和社区支持。
1882 1
【Uniapp 专栏】Uniapp 与 React Native 的对比分析
|
5月前
|
开发框架 前端开发 JavaScript
移动应用开发中的跨平台策略:Flutter与React Native的比较
在移动应用领域,跨平台解决方案已成为开发者追求高效、成本效益和广泛覆盖的关键。本文深入探讨了两种领先的跨平台框架——Flutter和React Native,从技术架构、性能、社区生态及实际应用案例四个维度进行全面对比分析。通过这一比较,旨在为移动应用开发者提供选择合适框架的参考依据,帮助他们根据项目需求做出明智的决策。
|
5月前
|
前端开发 iOS开发 Android开发
React Native跨平台开发实战:从零到一
学习React Native跨平台开发,首先安装Node.js和React Native CLI,设置Android/iOS环境。使用CLI创建项目,如`npx react-native init MyProject`。运行应用:`npx react-native run-android`或`run-ios`。编写组件,如在App.js中创建Hello World。添加样式,安装第三方库如react-native-vector-icons,使用react-navigation进行路由和导航。
111 2