项目介绍

ibitcy/react-native-hole-view 是一个托管在 GitHub 上的开源项目,主要使用 TypeScript 编写,目前获得 446 个 Star、33 次 Fork。

仓库全名
ibitcy/react-native-hole-view
Star 数
446
Fork 数
33
未关闭 Issue
7

README 摘要

Attention! Maintainers Wanted Our company is not using this library and does not plan to in the near future, so we currently lack the resources to maintain it regularly. If you are interested in becoming a maintainer, please contact me at: newonxp [at] gmail [dot] com. How it works code Works with any nested views: code Can be animated: code Getting started Install the library using either Yarn: or npm: Linking This…

完整内容见 GitHub 原始 README 或本页 。

常见问题

react-native-hole-view 用什么语言开发?

主要使用 TypeScript 编写,目前有 446 个 Star。

如何获取 react-native-hole-view 的源码?

可以直接克隆仓库:git clone https://github.com/ibitcy/react-native-hole-view.git,默认分支为 master;安装与运行步骤见仓库 README。

react-native-hole-view 最近还在维护吗?

仓库最近一次更新为 1月19日,当前有 7 个未关闭 Issue;Star 数为 446,可作为社区活跃度的参考。

关于

GitHub 原始描述(英文)

✂️ React-Native component to cut a touch-through holes anywhere you want. Perfect solution for tutorial overlay

描述取自 GitHub 官方 API,保持仓库作者书写的原文。

简要分析

热度分
519
价值分
277
活跃状态
活跃

语言占比

C++
CMake
HTML
Java
JavaScript
Kotlin
Objective-C
Objective-C++
Ruby
Shell
Starlark
Swift
TypeScript

Release

README

Screenshot

npm npm Maintainers Wanted

Attention! Maintainers Wanted

Our company is not using this library and does not plan to in the near future, so we currently lack the resources to maintain it regularly. If you are interested in becoming a maintainer, please contact me at: newonxp [at] gmail [dot] com.

How it works

drawing
code
import { RNHoleView } from 'react-native-hole-view';

<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
  <Text style={{ flexGrow: 0, flex: 0, padding: 10 }}>{"Wow! I'm a text inside a hole!"}</Text>
  <TouchableOpacity onPress={() => {}} style={{ backgroundColor: 'pink', padding: 10, borderRadius: 5 }}>
    <Text>{"Wow! I'm a button inside a hole!"}</Text>
  </TouchableOpacity>
  <ScrollView style={{ flexGrow: 0, flex: 0, padding: 10 }} horizontal={true}>
    <Text numberOfLines={1}>
      {
        "Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole!"
      }
    </Text>
  </ScrollView>
  <RNHoleView
    style={{ position: 'absolute', width: '100%', height: '100%', backgroundColor: 'rgba(34,146,231,0.4)' }}
    holes={[{ x: 150, y: 390, width: 120, height: 120, borderRadius: 60 }]}>
  </RNHoleView>
</View>

Works with any nested views:

drawing
code
import { RNHoleView } from 'react-native-hole-view
import Video from 'react-native-video';

<View style={{ flex: 1, alignItems: 'center', justifyContent: 'center' }}>
  <Text style={{ flexGrow: 0, flex: 0, padding: 10 }}>{"Wow! I'm a text inside a hole!"}</Text>
  <TouchableOpacity onPress={() => {}} style={{ backgroundColor: 'pink', padding: 10, borderRadius: 5 }}>
    <Text>{"Wow! I'm a button inside a hole!"}</Text>
  </TouchableOpacity>
  <ScrollView style={{ flexGrow: 0, flex: 0, padding: 10 }} horizontal={true}>
    <Text numberOfLines={1}>
      {
        "Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole!"
      }
    </Text>
  </ScrollView>
  <RNHoleView
    style={{ position: 'absolute', width: '100%', height: '100%', backgroundColor: 'rgba(34,146,231,0.4)' }}
    holes={[{ x: 150, y: 390, width: 120, height: 120, borderRadius: 60 }]}>
    <Video
      source={{ uri: 'https://cdn.vidyard.com/videos/uuAgWcoM5N4eFR4lUxoYKg/480p.mp4?gbzK5DIaQtu334rQMWVKBAGFBwZCVR6SHKgkwVYjsSLvOhADBtM4IZ_NxKjBze8TzK1o0XNrUd3UyZiiIdlaz_8icTZDM15OeUZ7DSsCBsQ' }}
      style={{ flex: 1 }}
    />
  </RNHoleView>
</View>

Can be animated:

drawing
code
import {RNHole, RNHoleView, ERNHoleViewTimingFunction, IRNHoleViewAnimation} from "react-native-hole-view";

import Video from 'react-native-video';

const firstHole: RNHole = {x: 150, y: 390, width: 120, height: 120, borderRadius: 60};
const secondHole: RNHole = {x: 150, y: 40, width: 120, height: 120, borderRadius: 60};

const animationSettings: IRNHoleViewAnimation = {timingFunction: ERNHoleViewTimingFunction.EASE_IN_OUT, duration: 200};

const App = () => {
    const [holes, setHoles] = useState<RNHole[]>([]);
    const [animated, setAnimated] = useState<boolean>(false);
    const [animation, setAnimation] = useState<IRNHoleViewAnimation | undefined>(undefined);

    const onPress = useCallback(() => {
        if (animated) {
            setHoles([firstHole]);
        } else {
            setHoles([secondHole])
        }

        setAnimation({...animationSettings});
        setAnimated(!animated);
    }, [animated, animation])

    useEffect(() => {
        onPress();
    }, []);

    return (
        <View style={{flex: 1, alignItems: 'center', justifyContent: 'center'}}>
            <Text style={{flexGrow: 0, flex: 0, padding: 10}}>{"Wow! I'm a text inside a hole!"}</Text>
            <TouchableOpacity onPress={() => {
            }} style={{backgroundColor: 'pink', padding: 10, borderRadius: 5}}>
                <Text>{"Wow! I'm a button inside a hole!"}</Text>
            </TouchableOpacity>
            <ScrollView style={{flexGrow: 0, flex: 0, padding: 10}} horizontal={true}>
                <Text numberOfLines={1}>
                    {
                        "Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole! Wow! I'm a ScrollView inside a hole!"
                    }
                </Text>
            </ScrollView>
            <RNHoleView
                style={{
                    position: 'absolute',
                    width: '100%',
                    height: '100%',
                    backgroundColor: 'rgba(34,146,231,0.4)'
                }}
                animation={animation}
                holes={holes}
                onAnimationFinished={() => {
                    setAnimation(undefined);
                }}
            >
                <Video source={{uri: 'https://cdn.vidyard.com/videos/uuAgWcoM5N4eFR4lUxoYKg/480p.mp4?gbzK5DIaQtu334rQMWVKBAGFBwZCVR6SHKgkwVYjsSLvOhADBtM4IZ_NxKjBze8TzK1o0XNrUd3UyZiiIdlaz_8icTZDM15OeUZ7DSsCBsQ'}}
                       resizeMode={"contain"}
                       style={{flex: 1}}/>
            </RNHoleView>
            <View
                pointerEvents={'box-none'}
                style={{
                    position: 'absolute',
                    flex: 1,
                    width: '100%',
                    height: '100%',
                    alignItems: 'flex-end',
                    flexDirection: 'row',
                    justifyContent: 'center'

                }}>
                <TouchableOpacity onPress={onPress}
                                  style={{backgroundColor: 'pink', padding: 10, borderRadius: 5, bottom: 50}}>
                    <Text>{"Animate!"}</Text>
                </TouchableOpacity>
            </View>
        </View>
    );
};

Getting started

Install the library using either Yarn:

yarn add react-native-hole-view

or npm:

npm install --save react-native-hole-view

Linking

This library fully supports RN’s autolinking

iOS

cd ios && pod install

Android

By default RN doesn’t support click through views on Android. The solution we use is quite dirty, so please support our PR to FB’s react-native repo https://github.com/facebook/react-native/pull/28956

Troubleshooting

If you have any diffuculties - please take a look on example/ app first.

In case you have xcode build error poining on this line

#import "RCTBridgeModule.h"

please use version 2.0.*

Running the example:

  1. Clone the repo
  2. cd example
  3. yarn
  4. cd ios
  5. pod install
  6. cd ..
  7. yarn run android or yarn run ios

Running the web example:

The exampleWeb app demonstrates the React Native Web implementation of RNHoleView.

Using Yarn

  1. cd exampleWeb
  2. yarn install (or yarn)
  3. yarn dev
  4. Open the printed Vite URL (defaults to http://localhost:5174) to interact with the overlay demo.

Using npm

  1. cd exampleWeb
  2. npm install
  3. npm run dev
  4. Open the printed Vite URL (defaults to http://localhost:5174) to interact with the overlay demo.

For more details, see the exampleWeb README.

评论

暂无评论