React-Native-Danmaku-Player
前言
一直以来,React Native 平台都没有什么好用的弹幕组件,要不早就停止更新,要不无法使用,而英文网络也没有使用弹幕的习惯,于是便撰写了这个组件。
类型声明
import { ComponentProps } from "react";
import { StyleProp, TextStyle, View } from "react-native";
export interface DanmakuItemRawData {
content: string;
timestamp: number;
id: number;
}
export interface DanmakuItemShowData<T extends DanmakuItemRawData> {
data: T;
top: number;
lineHeight: number;
fontSize: number;
}
export interface GetDanmakuPositionConfig<T extends DanmakuItemRawData> {
data: T[];
height: number;
lineHeight: number;
fontSize: number;
}
export declare function getDanmakuPosition<T extends DanmakuItemRawData>(config: GetDanmakuPositionConfig<T>): DanmakuItemShowData<T>[];
export type DanmakuDataLoader<T extends DanmakuItemRawData> = (
startTimeStamp: number,
endTimeStamp: number) => Promise<T[]>;
export type GetDanmakuStyle<T extends DanmakuItemRawData> = (danmaku: T) => StyleProp<TextStyle>;
export type DanmakuPlayerBaseProps<T extends DanmakuItemRawData> = {
period: number;
lifetime: number;
duration: number;
rate?: number;
threshold?: number;
loader: DanmakuDataLoader<T>;
preload?: number;
paused: boolean;
current: number;
fontSize: number;
lineHeight: number;
danmakuStyle?: StyleProp<TextStyle> | GetDanmakuStyle<T>;
width: number;
height: number;
};
export type DanmakuPlayerProps<T extends DanmakuItemRawData> = Omit<DanmakuPlayerBaseProps<T>, "width" | "height"> & Omit<ComponentProps<typeof View>, "children">;
export declare function DanmakuPlayerBase<T extends DanmakuItemRawData>(props: DanmakuPlayerBaseProps<T>): import("react").JSX.Element;
export default function DanmakuPlayer<T extends DanmakuItemRawData>(props: DanmakuPlayerProps<T>): import("react").JSX.Element;
用法
建议搭配 react-native-video
使用
注意:react-native-video
中的时间单位均是秒,本插件使用的时间单位均是毫秒,请注意两者之间的换算!
项目使用 Demo:
import { FC, useState } from "react"
import { useWindowDimensions, View } from "react-native"
import DanmakuPlayer from "react-native-danmaku-player"
import Video from "react-native-video"
const App: FC = () => {
const { width, height } = useWindowDimensions()
const [paused, setPaused] = useState(false)
const [current, setCurrent] = useState(0)
const [duration, setDuration] = useState(0)
return (
<View style={{ width, height }}>
<Video
paused={paused}
source={{ uri: "your video source" }}
style={{ width, height, backgroundColor: "black" }}
onProgress={e => setCurrent(e.current * 1000)}
onLoad={e => setDuration(e.duration * 1000)}
/>
<DanmakuPlayer
period={22000}
lifetime={15000}
fontSize={18}
lineHeight={24}
paused={paused}
current={current}
duration={duration}
style={{ position: "absolute", left: 0, top: 0 }}
// 在此传入你的异步函数,每个周期都会调用
loader={(start: number, end: number) => getDanmaku(start, end)}
danmakuStyle={item => ({ color: item.color })}
/>
</View>
)
}
export default App