成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

ReactNative: 使用Animted API實現(xiàn)向上滾動時隱藏Header組件

Aklman / 2621人閱讀

摘要:只能自己上了思路很清楚監(jiān)聽滾動事件,動態(tài)修改組件和組件的值當然,他們默認都是。插值對輸入范圍和輸出范圍之間做一個映射,通常使用線性插值,但也支持緩和函數(shù)。

想先推薦一下近期在寫的一個React Native項目,名字叫 Gakki :是一個Mastodon的第三方客戶端 (Android App)

預(yù)覽

寫在前面

本來我也不想造這個輪子的,奈何沒找到合適的組件。只能自己上了~

思路很清楚: 監(jiān)聽滾動事件,動態(tài)修改Header組件和Content組件的top值(當然,他們默認都是position:relative)。

接下來實現(xiàn)的時候遇到了問題,我第一個版本是通過動態(tài)設(shè)置state來實現(xiàn),即:

/**
 * 每次滾動時,重新設(shè)置headerTop的值
 */
onScroll = event =>{
    const y = event.nativeEvent.contentOffset.y
    if (y >= 270) return
    // headerTop即是Header和Content的top樣式對應(yīng)的值
    this.setState({
        headerTop: y
    })
}

這樣雖然能實現(xiàn),但是效果不好:明顯可以看到在上滑的過程中,Header組件一卡一卡地向上方移動(一點都不流暢)。

因為就只能另尋他法了:動畫

React Native 提供了兩個互補的動畫系統(tǒng):用于創(chuàng)建精細的交互控制的動畫Animated和用于全局的布局動畫LayoutAnimation (筆者注:這次沒有用到它)
Animated 相關(guān)API介紹

首先,這兒有一個簡單“逐漸顯示”動畫的DEMO,需要你先看完(文檔很簡單明了且注釋清楚,沒必要Copy過來)。

在看懂了DEMO的基礎(chǔ)上,我們還需要了解兩個關(guān)鍵的API才能實現(xiàn)完整的效果:

1. interpolate

插值函數(shù)。用來對不同類型的數(shù)值做映射處理。

當然,這是文檔說明:

Each property can be run through an interpolation first. An interpolation maps input ranges to output ranges, typically using a linear interpolation but also supports easing functions. By default, it will extrapolate the curve beyond the ranges given, but you can also have it clamp the output value.

翻譯:

每個屬性可以先經(jīng)過插值處理。插值對輸入范圍和輸出范圍之間做一個映射,通常使用線性插值,但也支持緩和函數(shù)。默認情況下,如果給定數(shù)據(jù)超出范圍,他也可以自行推斷出對于的曲線,但您也可以讓它箝位輸出值(P.S. 最后一句可能翻譯錯誤,因為沒搞懂clamp value指的是什么, sigh...)

舉個例子:

在實現(xiàn)一個圖片旋轉(zhuǎn)動畫時,輸入值只能是這樣的:

this.state = {
  rotate: new Animated.Value(0) // 初始化用到的動畫變量
}

...

// 這么映射是因為style樣式需要的是0deg這樣的值,你給它0這樣的值,它可不能正常工作。因為必定需要一個映射處理。
this.state.rotate.interpolate({ // 將0映射成0deg,1映射成360deg。當然中間的數(shù)據(jù)也是如此映射。
  inputRange: [0, 1],
  outputRange: ["0deg", "360deg"]
})

2. Animated.event

一般動畫的輸入值都是默認設(shè)定好的,比如前面DEMO中的逐漸顯示動畫中的透明度:開始是0,最后是1。這是已經(jīng)寫死了的。

但如果有些動畫效果需要的不是寫死的值,而是動態(tài)輸入的呢,比如:手勢(上滑、下滑,左滑,右滑...)、其它事件。

那就用到了Animated.event。

直接看一個將滾動事件的y值(滾動條距離頂部高度)和我們的動畫變量綁定起來的例子:

// 這段代碼表示:在滾動事件觸發(fā)時,將event.nativeEvent.contentOffset.y 的值動態(tài)綁定到this.state.headerTop上
// 和最前面我通過this.setState動態(tài)設(shè)置的目的一樣,但交給Animated.event做就不會造成視覺上的卡頓了。
onScroll={Animated.event([
   {
      nativeEvent: {
        contentOffset: { y: this.state.headerTop }
      }
   }
])}

關(guān)于API更多的說明請移步文檔

完整代碼
import React, { Component } from "react"
import { StyleSheet, Text, View, Animated, FlatList } from "react-native"

class List extends Component {
  render() {
    // 模擬列表數(shù)據(jù)
    const mockData = [
      "富強",
      "民主",
      "文明",
      "和諧",
      "自由",
      "平等",
      "公正",
      "法治",
      "愛國",
      "敬業(yè)",
      "誠信",
      "友善"
    ]

    return (
       (
          
            {item}
          
        )}
      />
    )
  }
}

export default class AnimatedScrollDemo extends Component {
  constructor(props) {
    super(props)
    this.state = {
      headerTop: new Animated.Value(0)
    }
  }

  componentWillMount() {
    // P.S. 270,217,280區(qū)間的映射是告訴interpolate,所有大于270的值都映射成-50
    // 這樣就不會導(dǎo)致Header在上滑的過程中一直向上滑動了
    this.top = this.state.headerTop.interpolate({
      inputRange: [0, 270, 271, 280],
      outputRange: [0, -50, -50, -50]
    })

    this.animatedEvent = Animated.event([
      {
        nativeEvent: {
          contentOffset: { y: this.state.headerTop }
        }
      }
    ])
  }

  render() {
    return (
      
        
          
            linshuirong.cn
          
        
        {/* 在oHeader組件上移的同時,列表容器也需要同時向上移動,需要注意。 */}
        
          
        
      
    )
  }
}

const styles = StyleSheet.create({
  container: {
    flex: 1
  },
  list: {
    height: 80,
    backgroundColor: "pink",
    marginBottom: 1,
    alignItems: "center",
    justifyContent: "center",
    color: "white"
  },
  header: {
    height: 50,
    backgroundColor: "#3F51B5",
    alignItems: "center",
    justifyContent: "center"
  },
  text: {
    color: "white"
  }
})

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/100389.html

相關(guān)文章

  • 推薦三兩款前端動畫庫,anitmate.css, velocity-animate, anime,

    摘要:所以就說說吧優(yōu)點可自定義動畫效果,支持隊列動效支持回調(diào)函數(shù)支持動畫的,等等功能缺點缺少自定義特效文檔比較少使用遇到的小問題默認不是勻速的,需要設(shè)置詳細整理待續(xù) 在最近一段時間的工作里,常常用到動畫,我主要接觸了三個 animate.cssanimevelocity 下面分析一下他們的優(yōu)缺點 animate.css 優(yōu)點:animate.css主要是使用css實現(xiàn)動畫效果,目前已經(jīng)有幾十...

    xzavier 評論0 收藏0
  • 從入門到上線一個天氣小程序

    摘要:天氣預(yù)報小程序說了很多小程序開發(fā)的基礎(chǔ)準備,下面就結(jié)合個人實際練手項目天氣預(yù)報小程序簡單說明。物料準備從需求結(jié)果導(dǎo)向,天氣程序首先要能獲取到當前所在地天氣狀況,再次可以自由選擇某地,知道其天氣狀況。 前言 學(xué)習了一段時間小程序,大致過了兩遍開發(fā)文檔,抽空做個自己的天氣預(yù)報小程序,全當是練手,在這記錄下。小程序開發(fā)的安裝、注冊和接入等流程就不羅列了,在小程序接入指南已經(jīng)寫得很清楚了,以下...

    Anshiii 評論0 收藏0
  • Making An Indicator With Pure CSS

    摘要:注意此處的定位是以即的外沿框進行定位的。關(guān)于單位,這個單位代表的意思即,即瀏覽器可視區(qū)域的高度。,我們現(xiàn)在來看效果將會是下面這張圖片顯示的樣子。設(shè)置目的即讓的高度為,即到頂部的距離減去的距離。 簡單的說明一下,使用這個標題并不就是說要使用全英文來寫這篇文章,主要是實在想不到更好的叫法了,也不知道怎么樣能夠更好的翻譯成中文。 可以簡單地理解為:使用 CSS 來實現(xiàn)一個閱讀文章時的簡單的...

    church 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<