https://github.com/tsaohucn/react-native-comic-book
react-native-comic-book
https://github.com/tsaohucn/react-native-comic-book
javascript react reactnative
Last synced: 3 months ago
JSON representation
react-native-comic-book
- Host: GitHub
- URL: https://github.com/tsaohucn/react-native-comic-book
- Owner: tsaohucn
- Created: 2018-03-24T15:44:48.000Z (about 7 years ago)
- Default Branch: master
- Last Pushed: 2018-12-10T06:59:14.000Z (over 6 years ago)
- Last Synced: 2025-01-20T02:39:44.214Z (5 months ago)
- Topics: javascript, react, reactnative
- Language: HTML
- Homepage:
- Size: 786 KB
- Stars: 0
- Watchers: 2
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
### react-native-comic-book
![]()
![]()
![]()
## Installation
1. Run`npm install git+http://192.168.0.200/xc/react-native-comic-book.git --save`2. react-native-comic-book use some native library so that you have to link **those library below** before you use react-native-comic-book
`react-native link react-native-vector-icons`
`react-native link react-native-screen-brightness`
`react-native link react-native-gesture-handler`
3. Open your MainActivity.java to change the code to below```java
import com.facebook.react.ReactActivityDelegate;
import com.facebook.react.ReactRootView;
import com.swmansion.gesturehandler.react.RNGestureHandlerEnabledRootView;
public class MainActivity extends ReactActivity {
// Add the following method to your main activity class
@Override
protected ReactActivityDelegate createReactActivityDelegate() {
return new ReactActivityDelegate(this, getMainComponentName()) {
@Override
protected ReactRootView createRootView() {
return new RNGestureHandlerEnabledRootView(MainActivity.this);
}
};
}
}
```
4. Open your MainApplication.java to change the code to below
```Java
new ScreenBrightnessPackage(1)
```
## APIProps | Description | Type | Default
------ | ------ | ------ | ------
onClickBackArrow | Fired after you click back-arrow icon | function | none
onEndComicBook | Fired after end of your comic-book | function | none
noPreviousChapter | Fired when you click `PreviousChapter` button but there's no any previous chapter | function | none
noNextChapter | Fired when you click `NextChapter` button but there's no any next chapter | function | none
noPreviousPageNumber | Fired when you click `TopArea` to page up but it's alerady in the first page with no previous page | function | none
noNextPageNumber | Fired when you click `BottomArea` to page down but it's alerady in the last page with no next page | function | none
initialPageNumber| Initial page number of your comic-book | Integer | 1
chapter | Chapter structure of your comic-book | Array[object] | []
content | Content of your comic-book | Array[object] | []
renderContent`required` | How to render your content | function | none
getContentLayout`required` | Layout of your content | function | none## Array[object]
- chapter : `[{ pageNumber: (Int)(Reuired)(Unique), title: (String)(Option) }]`
- pageNumber : pageNumber of this chapter
- title : title of this chapter- content : `[{ key: (String)(Reuired)(Unique), ...other }]`
- key : unique string key
- ...other : It depends on your renderContent function that how do you render your each item## Remember custom your renderContent and getContentLayout at same time
- The props as same as `renderItem` `getItemLayout` of FlatList
```JSX
renderContent = ({ item, index }) => {
// return your content render
}getContentLayout = (data, index) => {
// return your content layout
if (index >= 0) {
return { length: `your item length of this index`, offset: `your item offset of this index`, index }
} else {
return { length: 0, offset: 0, index }
// Add this line because initialPageNumber will cause index < 0 bug now
// https://github.com/facebook/react-native/issues/18743
}
}
```## Usage example
- Novel
```JSX
import React, { Component } from 'react'
import {
View,
Text,
Button,
Dimensions
} from 'react-native'
import { StackNavigator } from 'react-navigation'
import getSlideFromRightTransition from 'react-navigation-slide-from-right-transition'
import ComicBook from 'react-native-comic-book'class HomeScreen extends Component {
render() {
return (
Home
this.props.navigation.navigate('ComicBook')}
/>
);
}
}class ComicBookScreen extends Component {
constructor(props) {
super(props)
}onEndComicBook = (pageNumber) => {
console.log(pageNumber)
}onClickBackArrow = () => {
this.props.navigation.goBack()
}noPreviousChapter = () => {
console.log('沒有上一回')
}noNextChapter = () => {
console.log('沒有下一回')
}noPreviousPageNumber = () => {
console.log('沒有上一頁')
}noNextPageNumber = () => {
console.log('沒有下一頁')
}renderContent = ({ item, index }) =>
{index + 1}
{item.novel}
getContentLayout = (data, index) => ({ length: 500, offset: 500*index, index })
render() {
return (
);
}
}export default class App extends React.Component {
render() {
return
}
}const RootStack = StackNavigator(
{
Home: {
screen: HomeScreen,
},
ComicBook: {
screen: ComicBookScreen,
}
},
{
initialRouteName: 'Home',
headerMode: 'none',
transitionConfig: getSlideFromRightTransition
}
)const content = Array(100).fill().map((e,index) => ({
key: index.toString(),
novel: '你的小說內容'
}))const chapter = [
{ pageNumber: 76, title: '戰役' },
{ pageNumber: 5, title: '精氣' },
{ pageNumber: 29, title: '鎮寢之寶' },
{ pageNumber: 16, title: '夢中人' },
{ pageNumber: 39, title: '飛來豔福' },
{ pageNumber: 26, title: '馬克思主義哲學' },
{ pageNumber: 69, title: '演員的自我修飾' },
{ pageNumber: 48, title: '天降之物' },
{ pageNumber: 95, title: '亞拉那一卡?' },
{ pageNumber: 89, title: '相遇' }
]const styles = {
home: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
content: {
backgroundColor: 'white',
height: 500
},
pageNumber: {
flex: 1
},
novel: {
flex: 1,
justifyContent: 'flex-start',
alignItems: 'center'
}
}
```- ComicBook
```JSX
import React, { Component } from 'react'
import {
View,
Text,
Image,
Button,
Dimensions,
ActivityIndicator
} from 'react-native'
import { StackNavigator } from 'react-navigation'
import getSlideFromRightTransition from 'react-navigation-slide-from-right-transition'
import ComicBook from 'react-native-comic-book'
import LoadingImage from './LoadingImage'class HomeScreen extends Component {
render() {
return (
Home
this.props.navigation.navigate('ComicBook')}
/>
);
}
}class ComicBookScreen extends Component {
constructor(props) {
super(props)
this.length = new Array
this.offset = new Array
this.state = {
isLoading: true
}
}componentDidMount() {
// this part may exist some issue on ios now
// https://github.com/facebook/react-native/pull/18875
const scaleImageHeightPromise = content.map(async (ele,index) => {
let scaleImageHeight = width
await Image.getSize(ele.uri,(imageWidth, imageHeight) => {
if (imageWidth && imageHeight) {
scaleImageHeight = width*imageHeight/imageWidth
console.log(scaleImageHeight)
}
},() => {
scaleImageHeight = width
})
return scaleImageHeight
})
Promise.all(scaleImageHeightPromise).then(value => {
this.length = value
let offset = 0
this.offset = this.length.map(lenght => {
offset += lenght
return offset
})
this.offset.unshift(0)
this.setState({
isLoading: false
})
}).catch(err => {
alert(err)
})
}onEndComicBook = (pageNumber) => {
console.log(pageNumber)
}onClickBackArrow = () => {
this.props.navigation.goBack()
}noPreviousChapter = () => {
console.log('沒有上一回')
}noNextChapter = () => {
console.log('沒有下一回')
}noPreviousPageNumber = () => {
console.log('沒有上一頁')
}noNextPageNumber = () => {
console.log('沒有下一頁')
}renderContent = ({ item, index }) =>
getContentLayout = (data, index) => {
if (index >= 0) {
return { length: this.length[index], offset: this.offset[index], index }
} else {
return { length: 0, offset: 0, index }
// Add this line because initialPageNumber will cause index < 0 bug now
// https://github.com/facebook/react-native/issues/18743
}
}render() {
return (
{
this.state.isLoading ?
:
}
)
}
}export default class App extends React.Component {
render() {
return
}
}const RootStack = StackNavigator(
{
Home: {
screen: HomeScreen,
},
ComicBook: {
screen: ComicBookScreen,
}
},
{
initialRouteName: 'Home',
headerMode: 'none',
transitionConfig: getSlideFromRightTransition
}
)const { width, heigth } = Dimensions.get("window")
const content = Array(500).fill().map((e,index) => {
const randomWidth = getRandomArbitrary(200,500).toFixed(0)
const randomHeight = getRandomArbitrary(200,500).toFixed(0)return({
key: index.toString(),
uri: 'https://via.placeholder.com/' + randomWidth + 'x' + randomHeight
//uri: 'https://picsum.photos/'+ randomWidth + '/' + randomHeight + '?image=' + index,
})
})const chapter = [
{ pageNumber: 20, title: '戰役' },
{ pageNumber: 133, title: '精氣' },
{ pageNumber: 100, title: '鎮寢之寶' },
{ pageNumber: 93, title: '夢中人' },
{ pageNumber: 45, title: '飛來豔福' },
{ pageNumber: 198, title: '馬克思主義哲學' },
{ pageNumber: 267, title: '演員的自我修飾' },
{ pageNumber: 356, title: '天降之物' },
{ pageNumber: 462, title: '亞拉那一卡?' },
{ pageNumber: 410, title: '相遇' }
]const styles = {
home: {
flex: 1,
justifyContent: 'center',
alignItems: 'center'
},
comicbook: {
flex: 1,
backgroundColor: '#000000'
},
activityIndicator: {
flex: 1,
justifyContent: 'center'
}
}function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
```