1. 程式人生 > >React Native 之ScrollView輪播圖實現

React Native 之ScrollView輪播圖實現

1.首先如果檔案index.android.js   或者 index.ios.js  我這裡用的是前者

/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  TextInput,
  TouchableOpacity,
  ScrollView,
  Text,
  View
} from 'react-native';

import ScrollViewDemo from "./scrollViewDemo";
import ScrollViewTop from "./scrollViewTop";
import PositionDemo from "./positionDemo";

export default class CQQLoginDemo extends Component {
  
  render() {
    return (
    <ScrollViewTop/>
    );
  }

}
AppRegistry.registerComponent('CQQLoginDemo', () => CQQLoginDemo);
2.在專案的 index.android.js同一目錄下  建立json檔案  這樣方便圖片的訪問,資源圖片放在專案名稱\android\app\src\main\res\drawable 下面

這裡的BadgeData.json 如下:

{
  "data":[
    {
      "icon" : "danjianbao",
      "title" : "單肩包"
    },
    {
      "icon" : "liantiaobao",
      "title" : "鏈條包"
    },
    {
      "icon" : "qianbao",
      "title" : "錢包"
    },
    {
      "icon" : "shoutibao",
      "title" : "手提包"
    },
    {
      "icon" : "shuangjianbao",
      "title" : "雙肩包"
    },
    {
      "icon" : "xiekuabao",
      "title" : "斜挎包"
    }
  ]
}
3.主要的檔案 scrollViewTop.js 檔案 如下  具體註釋中已寫  直接上程式碼:
/**
 * Sample React Native App
 * https://github.com/facebook/react-native
 * @flow
 */

import React, { Component } from 'react';
import {
  AppRegistry,
  StyleSheet,
  ScrollView,
  Image,
  Text,
  View
} from 'react-native';

let Dimensions = require('Dimensions');
let ScreenWidth = Dimensions.get('window').width;
let ScreenHeight = Dimensions.get('window').height;

import ImageData from "./BadgeData.json"; 

export  default class scrollViewTop extends Component {
  
  constructor(props) {
    super(props);
    this.state = { currentPage: 0 };
  }

  static defaultProps = {
    duration: 1000,
  }

  componentDidMount() {
    this._startTimer();

  }

  componentWillUnmount() {
    // 如果存在this.timer,則使用clearTimeout清空。
    // 如果你使用多個timer,那麼用多個變數,或者用個數組來儲存引用,然後逐個clear
    this.timer && clearTimeout(this.timer);
  }

  render() {
    return (
      <View style={styles.continer}>
        <ScrollView
          ref='scrollView'
          //水平方向
          horizontal={true}
          //當值為true時顯示滾動條
          showsHorizontalScrollIndicator={false}
          //當值為true時,滾動條會停在滾動檢視的尺寸的整數倍位置。這個可以用在水平分頁上
          pagingEnabled={true}
          //滑動完一貞
          onMomentumScrollEnd={(e)=>{this._onAnimationEnd(e)}}
          //開始拖拽
          onScrollBeginDrag={()=>{this._onScrollBeginDrag()}}
          //結束拖拽
          onScrollEndDrag={()=>{this._onScrollEndDrag()}}
          >
          {this._renderAllImage()}
        </ScrollView>
        <View style={styles.pageViewStyle}>
         {this._renderAllIndicator()}
        </View>
      </View>
    );
  }
  /**開始拖拽 */
  _onScrollBeginDrag(){
    console.log("開始拖拽");
    //兩種清除方式 都是可以的沒有區別
    // this.timer && clearInterval(this.timer);
    this.timer && clearTimeout(this.timer);
  }
  /**停止拖拽 */
  _onScrollEndDrag(){
    console.log("停止拖拽");
    this.timer &&this._startTimer();
  }

  /**1.輪播圖片展示 */
  _renderAllImage() {
    let allImage = [];
    let imgsArr = ImageData.data;
    for (let i = 0; i < imgsArr.length; i++) {
      let imgsItem = imgsArr[i];
     allImage.push(
        <Image key={i} source={{uri:imgsItem.icon}} style={styles.imageStyle} />
      );
    }
    return allImage;
  }
  
  /**2.手動滑動分頁實現 */
  _onAnimationEnd(e) {
    //求出偏移量
    let offsetX = e.nativeEvent.contentOffset.x;
    //求出當前頁數
    let pageIndex = Math.floor(offsetX / ScreenWidth);
    //更改狀態機
    this.setState({ currentPage: pageIndex });
  }

    /**3.頁面指標實現 */
    _renderAllIndicator() {
    let indicatorArr = [];
    let style;
    let imgsArr = ImageData.data;
    for (let i = 0; i < imgsArr.length; i++) {
      //判斷
      style = (i==this.state.currentPage)?{color:'orange'}:{color:'white'};
      indicatorArr.push(
        <Text key={i} style={[{fontSize:30},style]}>
         •
        </Text>
      );
    }
    return indicatorArr;
  }

  /**4.通過定時器實現自動播放輪播圖 */
    _startTimer(){
    let scrollView = this.refs.scrollView;
    this.timer = setInterval(
      ()=>{console.log('開啟定時器'); 
       let imageCount = ImageData.data.length;
       //4.1 設定圓點
       let activePage = 0;
       //4.2判斷
       if(this.state.currentPage>=imageCount+1){
         activePage = 0;
       }else{
         activePage = this.state.currentPage+1;
       }
       //4.3 更新狀態機
       this.setState({currentPage:activePage});
       //4.4 讓scrollview 滾動起來
       let offsetX = activePage * ScreenWidth;
       scrollView.scrollResponderScrollTo({x:offsetX,y:0,animated:true});
      },
       this.props.duration
     );
    }
}

const styles = StyleSheet.create({
  continer:{
    backgroundColor: '#dddddd'
  },
  imageStyle:{
    height:400,
    width:ScreenWidth
  },
  pageViewStyle:{
    height:25,
    width:ScreenWidth,
    backgroundColor:'rgba(0,0,0,0.4)',
    position:'absolute',
    bottom:0,

    flexDirection:'row',
    alignItems:'center',
  }
});




連結:http://pan.baidu.com/s/1kVcAVTP 密碼:e9kf

相關推薦

React Native ScrollView實現

1.首先如果檔案index.android.js   或者 index.ios.js  我這裡用的是前者 /** * Sample React Native App * https://github.com/facebook/react-native * @flow

[學習] React Native Swiper 滑動套件 « 關於網路那些事...

推薦一款由 leecade 所發布的 react native swiper 套件,目前版本可以同時支援 iOS 及 Android,並且可以自定義樣式

React Native 如何做 react-native-swiper

//import liraries import React, { Component } from 'react'; import { View, Text, StyleSheet, Dimensions, Image, TouchableOpacity,

react-native-page-scrollview 的使用方法(實現酷炫的分頁效果)

ota interview native cte ren 意圖 let change sets react-native-page-scrollview 對ScrollView的封裝,可以很方便的實現水平,垂直分頁輪播效果.而且可以自定義分頁寬高,和側邊View的旋轉,透明

react-native-page-scrollview 的使用方法(實現酷炫的分頁效果,還支援自定義View)

react-native-page-scrollview 對ScrollView的封裝,可以很方便的實現水平,垂直分頁輪播效果.而且可以自定義分頁寬高,和側邊View的旋轉,透明度,大小等. 對於原生的ScrollView只支援水平的整屏的分頁,而且我看gi

JS實例圖片實現圖片播放效果

utf length pla get eight code func nsh java 1 <head> 2 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&g

原生js實現

索引 獲取 mouseout abs length ati point css ack 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta chars

vue報錯 Uncaught RangeError: Maximum call stack size exceeded 附完整實現程式碼

Vue初學者,寫專案實現輪播圖時報錯且頁面初始化後不會自動輪播。 設定的計時器時長是6000,但報錯是幾乎沒有停歇的報錯。 檢查核心程式碼,發現 錯誤一:這裡導致輪播圖初始化不輪播 mounted的方法寫在了methods裡面,將mounted的方法挪出,解決頁面初始化輪播圖不

JS原生實現

作為一個PHP全棧攻城獅,不僅要會後端PHP和資料庫,還要會前端JS。今天原始碼時代 PHP培訓 學科老師要和大家分享一下JS原生編寫輪播圖的外掛。 說起輪播圖,很多人會選擇使用各種外掛,比如基於JQuery或其它框架的。不瞞大家,我也用過,甚至還用過Flash的輪播圖。總體來說,用起來是比較簡

移動端實現

1:HTML樣式<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,initial-s

最簡單的實現

需求:每隔2秒切換一張圖片的效果 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>輪播圖</title>

web前端技術課程講解關於水平無縫滾動

製作這個簡單的輪播圖之前,你必須掌握html、css、以及JavaScript中的節點操作,定時器的使用,條件語句的使用以及JS修改樣式和動畫原理。 輪播圖對於網頁來說是個常見也可以說是必備的部分,而輪播圖的形式也是各式各樣,有簡約的也有炫酷的。當然,這裡我就只說簡約的全屏輪播圖水平無縫滾動。 首先是給出

適合【前端入門者】的原生JS實現

學前端已經一年多了,在JavaScript方面,學會了基本語法,頁面操作之後,慢慢走向了框架這條不歸路,框架用起來真的是省時省力,效果好、程式碼少、還節省時間。 在前幾天去做一個頁面的時候,要求只能是用以前版本的框架,我就去找框架之前的版本,可是在某些官網上老版本的框架已經不存在了,就我這暴脾氣

MVP+Recycleview實現實現京東秒殺效果

MVP+Recycleview實現輪播圖,京東秒殺 2018年12月02日 19:55:26 遷就 閱讀數:830 1:先看看效果 2:build.gradle中匯入依賴 //依賴 implementation ‘com.jakewharton:butterkn

react-native-EZSwiper卡片元件Android無法正常

因專案需求,需要做一個卡片的輪播圖。然後順理成章的找到react-native-EZSwiper輪子,很贊。 ios完全能滿足我的需求,但是Android測試的時候就涼了。 Android Case:當元件自動輪播到最後一張,我滿心期待的看它輪播回到第一張......Bu

微信小程式學習筆記(三)----初識小程式程式碼、實現

從這一節開始我們就開始接觸小程式前臺程式碼了,其實前臺邏輯還是比較簡單的,學習難度比學習一個前端框架難不了多少,記得以前一開始學前端框架的時候,流程就是:熟悉一下--檢視元件--找到要用的--複製貼上,其實對於大部分人來說,小程式前臺也是一樣。 首先,我們可以先看下小程式的

Html5+JavaScript實現方式

這…足夠應付大學老師的作業了 /偷笑 這應該是大學JavaScript老師常佈置的js作業之一,只做了三個圖片,可以修改圖片和尺寸,修改好名字之後替換即可,如果要新增第四張圖片所有的px都要修改.一開始就是用三張圖片做的,就沒弄四張照片 圖片自己找吧, 樣式圖

React Native-圖片

圖片輪播在App開發中經常使用,這裡圖片輪播使用的是第三方元件react-native-swiper, 我們啟動npm命令列,在專案的根目錄使用如下命令安裝模組。 $ npm install react-native-swiper --save $ npm

安卓最簡單的實現無限

Android中的輪播圖實現起來並不難,現在特別是商城類的APP中使用的特別多,自定義view和ViewPager都能很簡單的實現,之前找了幾篇博文都不具備無限輪播的功能,現在自己實現了無限輪播的功能,供大家參考學習和使用~~~~ 先看效果圖: 下面就看一下具體的程

React NativeScrollView控制元件詳解

概述 ScrollView在Android和ios原生開發中都比較常見,是一個 滾動檢視控制元件。在RN開發中,系統也給我們提供了這麼一個控制元件。不過在RN開發中 ,使用ScrollView必須有一個確定的高度才能正常工作,因為它實際上所做的就是將一系列不確