动画视图仅缩放屏幕宽度的一半

Posted

技术标签:

【中文标题】动画视图仅缩放屏幕宽度的一半【英文标题】:Animated View scaling only half of the screen width 【发布时间】:2020-12-19 09:28:42 【问题描述】:

Animated.View 仅缩放到提供的屏幕宽度的一半。 其次,为什么我必须在样式表中给出宽度才能使它起作用,以及给它长度 1 的具体原因是什么。 如果我将样式表中的宽度增加到 2,进度条会覆盖整个屏幕宽度

    import React from 'react'
    import  View, Animated, StyleSheet, Dimensions, Easing  from 'react-native'

export default class ProgressBar extends React.Component 
    state = 
        percent: new Animated.Value(0)
    

    componentDidMount() 
        this.startAnimation()
    

    startAnimation = () => 
        this.animation = Animated.timing(this.state.percent, 
            toValue: 100,
            duration: this.props.timeRemaining*1000,
            easing: Easing.linear,
            useNativeDriver: true,
        )

        this.animation.start()
    

    render() 
        return(
            <Animated.View 
                style=[
                    styles.bar,
                    transform: [
                        scaleX: this.state.percent.interpolate(
                            inputRange: [0, 100],
                            outputRange: [0, Dimensions.get('window').width]
                        )
                    ] 
                ]
            />

            // <View style=[styles.bar, width: Dimensions.get('window').width]/>
        )
    


const styles = StyleSheet.create(
    bar: 
        height: 30,
        width: 1,
        backgroundColor: 'tomato',
    
)

【问题讨论】:

【参考方案1】:

正如我在Animated View scaling only half of the screen width 中所说,你的一半&lt;Animated.View&gt; 不在你的屏幕上,你看不到它。 使用 TranslateX 来解决它。 这对我有用:

import * as React from 'react';
import 
  Animated,
  Dimensions
 from 'react-native';

export default function () 
  const timer = new Animated.Value(0);
  const  width  = Dimensions.get("window");

  const startAnimation = () => 
    Animated.timing(timer, 
      duration: 2000,
      toValue: 1,
      useNativeDriver: true,
      isInteraction: false,
    ).start();
  ;

  React.useEffect(() => 
    startAnimation()
  , []);

  return (
    <Animated.View
      style=[
        
          width,
          height: 5,
          backgroundColor: 'blue',
          transform: [
            
              translateX: timer.interpolate(
                
                  inputRange: [0, 1],
                  outputRange: [-width / 2, 0],
                
              ),
            ,
            
         // you can use scaleX : timer if you don't need interpolation
              scaleX: timer.interpolate(
                
                  inputRange: [0, 1],
                  outputRange: [0, 1],
                
              ),
            ,
          ],
        ,
      ]
    />
  );

【讨论】:

从 [0,1] 插值到 [0,1] 的目的是什么? 正如我在***.com/questions/63667787/… 中所说:ScaleX 将数字乘以项目宽度。在这个例子中,我的项目宽度是 Dimensions.get("window").width,然后首先我的项目宽度将为 0,因为 scaleX 为 0 且 width * 0 = 0 ,并且随着动画的进行,我的比例编号增加(并且项目宽度增加 ) 直到达到 1 然后我的项目宽度将是:width * 1 = Dimensions.get("window").width 您的回答没有解决我的问题。无论如何,答案是从 [0,1] 插值到 [0,1] 没有意义 我认为我的两个答案都很清楚,并且我在最好的反应本机库之一中找到了我的 ***.com/questions/63667787/… 代码。但是如果您认为“从 [0, 1] 到 [0,1]" 你应该和他们最好的程序员谈谈 :) 无论如何,选择是你的 你的主要问题是:1.为什么 Animated.View 只缩放到屏幕宽度的一半 2.为什么我必须在样式表中给出宽度......我已经回答了这两个正确的。如果你想要一个解决你问题的代码,我已经搜索并测试了一些解决方案,这个是最好的之一。如果你感谢付出了这么多时间帮助你的人,这表明了礼貌。祝你好运

以上是关于动画视图仅缩放屏幕宽度的一半的主要内容,如果未能解决你的问题,请参考以下文章

动画自定义视图在屏幕的一半,其中包含图像 - 突然的动画

ios中给uiscrollview添加的全屏子视图为啥宽度只显示屏幕的一半

CAAnimation 隐藏了一半的视图

动画(缩放和翻译)android画布视图上的图像的一部分

集合视图平铺

动画子视图控制器视图