本文将带您了解关于开始在嵌入PyQT4GUI的funcAnimation中工作的新内容,另外,我们还将为您提供关于AndroidScaleAnimation和TranslateAnimation,如何
本文将带您了解关于开始在嵌入PyQT4 GUI的funcAnimation中工作的新内容,另外,我们还将为您提供关于Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动、android.view.animation.Animation.AnimationListener的实例源码、animation-timing-function 的 steps 详解、animation-timing-function属性有什么用的实用信息。
本文目录一览:- 开始在嵌入PyQT4 GUI的funcAnimation中工作
- Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动
- android.view.animation.Animation.AnimationListener的实例源码
- animation-timing-function 的 steps 详解
- animation-timing-function属性有什么用
开始在嵌入PyQT4 GUI的funcAnimation中工作
从下面显示的有效Matplotlib动画代码开始,我的目标是将此动画(只是一个在屏幕上移动的圆圈)嵌入PyQT4 GUI中。
import matplotlib.pyplot as pltfrom matplotlib.patches import Circlefrom matplotlib import animationfig,ax = plt.subplots()ax.set_aspect(''equal'',''box'')circle = Circle((0,0), 1.0)ax.add_artist(circle)ax.set_xlim([0,10])ax.set_ylim([-2,2])def animate(i): circle.center=(i,0) return circle,anim = animation.FuncAnimation(fig,animate,frames=10,interval=100,repeat=False,blit=True)plt.show()
我可以使用以下代码来完成此操作,但是有一个障碍:我无法直言不讳地工作。
import sysfrom PyQt4 import QtGui, QtCorefrom matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvasfrom matplotlib.figure import Figurefrom matplotlib.patches import Circlefrom matplotlib import animationclass Window(QtGui.QDialog): #or QtGui.QWidget ??? def __init__(self): super(Window, self).__init__() self.fig = Figure(figsize=(5,4),dpi=100) self.canvas = FigureCanvas(self.fig) self.ax = self.fig.add_subplot(111) # create an axis self.ax.hold(False) # discards the old graph self.ax.set_aspect(''equal'',''box'') self.circle = Circle((0,0), 1.0) self.ax.add_artist(self.circle) self.ax.set_xlim([0,10]) self.ax.set_ylim([-2,2]) self.button = QtGui.QPushButton(''Animate'') self.button.clicked.connect(self.animate) # set the layout layout = QtGui.QVBoxLayout() layout.addWidget(self.canvas) layout.addWidget(self.button) self.setLayout(layout) def animate(self): self.anim = animation.FuncAnimation(self.fig,self.animate_loop,frames=10,interval=100,repeat=False,blit=False) self.canvas.draw() def animate_loop(self,i): self.circle.center=(i,0) return self.circle,def main(): app = QtGui.QApplication(sys.argv) ex = Window() sys.exit(app.exec_())if __name__ == ''__main__'': main()
设置时blit=True
,按下Animate按钮后,出现以下错误: a.figure.canvas.restore_region(bg_cache
[a])KeyError:matplotlib.axes._subplots.AxesSubplot对象位于0x00000000095F1D30
在寻找这个错误,我找到阻击器怎么没有在Mac上工作很多帖子,但我使用的是Windows
7,我曾尝试更换self.canvas.draw()
用self.canvas.update()
,但这并不工作。
答案1
小编典典一段时间后,我设法通过直接使用基础函数而不是使用动画包装器来重新创建动画:
import sysfrom PyQt4 import QtGui, QtCorefrom matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvasfrom matplotlib.figure import Figurefrom matplotlib.patches import Circlefrom matplotlib import animationfrom time import sleepclass Window(QtGui.QDialog): #or QtGui.QWidget ??? def __init__(self): super(Window, self).__init__() self.fig = Figure(figsize=(5, 4), dpi=100) self.canvas = FigureCanvas(self.fig) self.ax = self.fig.add_subplot(111) # create an axis self.ax.hold(False) # discards the old graph self.ax.set_aspect(''equal'', ''box'') self.circle = Circle((0,0), 1.0, animated=True) self.ax.add_artist(self.circle) self.ax.set_xlim([0, 10]) self.ax.set_ylim([-2, 2]) self.button = QtGui.QPushButton(''Animate'') self.button.clicked.connect(self.animate) # set the layout layout = QtGui.QVBoxLayout() layout.addWidget(self.canvas) layout.addWidget(self.button) self.setLayout(layout) self.canvas.draw() self.ax_background = self.canvas.copy_from_bbox(self.ax.bbox) def animate(self): self.animate_loop(0) def animate_loop(self,begin): for i in range(begin,10): self.canvas.restore_region(self.ax_background) self.circle.center=(i,0) self.ax.draw_artist(self.circle) self.canvas.blit(self.ax.bbox) self.canvas.flush_events() sleep(0.1)def main(): app = QtGui.QApplication(sys.argv) ex = Window() ex.show() sys.exit(app.exec_())if __name__ == ''__main__'': main()
也许这对您有用。
Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动
TranslateAnimation:
TranslateAnimation goTopFromright = new TranslateAnimation(0,-(right.getLeft()-top.getLeft()),-(right.getTop()-top.getTop()));
ScaleAnimation:
ScaleAnimation = setSizeforTop = new ScaleAnimation(1,2,1,2);
和AnimationSet:
bringToLeftFromTopAnimationSet = new AnimationSet(true); bringToTopFromrightAnimationSet.addAnimation(goTopFromright); bringToTopFromrightAnimationSet.addAnimation(setSizeforTop);
问题是,当我尝试仅使用ScaleAnimation时,我的项目会转到我想要的位置,但是当我在AnimationSet中使用ScaleAnimation和TranslateAnimation时,我的项目翻译的次数超出了我的需要,就像ScaleAnimation引入了一些补充一样动作abd我不知道如何删除它们.
谢谢您的帮助.
解决方法
bringToTopFromrightAnimationSet.addAnimation(setSizeforTop); bringToTopFromrightAnimationSet.addAnimation(goTopFromright);
android.view.animation.Animation.AnimationListener的实例源码
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,alpha is used in place of scale up to show the // progress circle appearing. // Don't adjust the alpha during appearance otherwise. mProgress.setAlpha(MAX_ALPHA); } mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,AnimationListener listener) { if (mScale) { // Scale the item back down startScaleDownReturnToStartAnimation(from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoStartPosition); } }
private void startScaleDownReturnToStartAnimation(int from,AnimationListener listener) { mFrom = from; if (isAlphaUsedForScale()) { mStartingScale = mProgress.getAlpha(); } else { mStartingScale = ViewCompat.getScaleX(mCircleView); } mScaleDownToStartAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mHeadViewContainer.setVisibility(View.VISIBLE); mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
private void startScaleDownReturnToStartAnimation(int from,Animation.AnimationListener listener) { mFrom = from; if (isAlphaUsedForScale()) { mStartingScale = mProgress.getAlpha(); } else { mStartingScale = ViewCompat.getScaleX(mCircleView); } mScaleDownToStartAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mHeadViewContainer.setVisibility(View.VISIBLE); mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,AnimationListener listener) { if (mScale) { startScaleDownReturnToStartAnimation(from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mAnimatetoStartPosition); } resetTargetLayoutDelay(ANIMATE_TO_START_DURATION); }
private void startScaleDownReturnToStartAnimation(int from,AnimationListener listener) { mFrom = from; mStartingScale = ViewCompat.getScaleX(mHeadViewContainer); mScaleDownToStartAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { this.mCircleView.setVisibility(0); if (VERSION.SDK_INT >= 11) { this.mProgress.setAlpha(255); } this.mScaleAnimation = new Animation() { public void applyTransformation(float interpolatedTime,Transformation t) { SwipeRefreshLayout.this.setAnimationProgress(interpolatedTime); } }; this.mScaleAnimation.setDuration((long) this.mMediumAnimationDuration); if (listener != null) { this.mCircleView.setAnimationListener(listener); } this.mCircleView.clearanimation(); this.mCircleView.startAnimation(this.mScaleAnimation); }
private void startScaleDownReturnToStartAnimation(int from,AnimationListener listener) { this.mFrom = from; if (isAlphaUsedForScale()) { this.mStartingScale = (float) this.mProgress.getAlpha(); } else { this.mStartingScale = ViewCompat.getScaleX(this.mCircleView); } this.mScaleDownToStartAnimation = new Animation() { public void applyTransformation(float interpolatedTime,Transformation t) { SwipeRefreshLayout.this.setAnimationProgress(SwipeRefreshLayout.this.mStartingScale + ((-SwipeRefreshLayout.this.mStartingScale) * interpolatedTime)); SwipeRefreshLayout.this.movetoStart(interpolatedTime); } }; this.mScaleDownToStartAnimation.setDuration(150); if (listener != null) { this.mCircleView.setAnimationListener(listener); } this.mCircleView.clearanimation(); this.mCircleView.startAnimation(this.mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoStartPosition); } }
@SuppressLint("NewApi") private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mHeadViewContainer.setVisibility(View.VISIBLE); mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void startScaleDownReturnToStartAnimation(int from,Animation.AnimationListener listener) { mFrom = from; mStartingScale = ViewCompat.getScaleX(mHeadViewContainer); mScaleDownToStartAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mHeadViewContainer.setVisibility(View.VISIBLE); mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mAnimatetoStartPosition); } resetTargetLayoutDelay(ANIMATE_TO_START_DURATION); }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoStartPosition); } }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoStartPosition); } }
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoStartPosition); } }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { this.mCircleView.setVisibility(0); if (VERSION.SDK_INT >= 11) { this.mProgress.setAlpha(255); } this.mScaleAnimation = new Animation() { public void applyTransformation(float interpolatedTime,Transformation t) { SwipeRefreshLayout.this.setAnimationProgress(interpolatedTime); } }; this.mScaleAnimation.setDuration((long) this.mMediumAnimationDuration); if (listener != null) { this.mCircleView.setAnimationListener(listener); } this.mCircleView.clearanimation(); this.mCircleView.startAnimation(this.mScaleAnimation); }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { SwipeRefreshLayout.this.setAnimationProgress(SwipeRefreshLayout.this.mStartingScale + ((-SwipeRefreshLayout.this.mStartingScale) * interpolatedTime)); SwipeRefreshLayout.this.movetoStart(interpolatedTime); } }; this.mScaleDownToStartAnimation.setDuration(150); if (listener != null) { this.mCircleView.setAnimationListener(listener); } this.mCircleView.clearanimation(); this.mCircleView.startAnimation(this.mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mHeadViewContainer.setVisibility(View.VISIBLE); mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
private void animateOffsetToStartPosition(int from,listener); } else { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mAnimatetoStartPosition); } resetTargetLayoutDelay(ANIMATE_TO_START_DURATION); }
private void startScaleDownReturnToStartAnimation(int from,Transformation t) { float targetScale = (mStartingScale + (-mStartingScale * interpolatedTime)); setAnimationProgress(targetScale); movetoStart(interpolatedTime); } }; mScaleDownToStartAnimation.setDuration(SCALE_DOWN_DURATION); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleDownToStartAnimation); }
private void startScaleUpAnimation(AnimationListener listener) { mCircleView.setVisibility(View.VISIBLE); if (android.os.Build.VERSION.SDK_INT >= 11) { // Pre API 11,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mScaleAnimation); }
private void animateOffsetToCorrectPosition(int from,AnimationListener listener) { mFrom = from; mAnimatetoCorrectPosition.reset(); mAnimatetoCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION); mAnimatetoCorrectPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mCircleView.setAnimationListener(listener); } mCircleView.clearanimation(); mCircleView.startAnimation(mAnimatetoCorrectPosition); }
private Animation createAnimation(int top,AnimationListener l) { AnimationSet set = new AnimationSet(false); set.addAnimation(startAlpha()); set.addAnimation(startScale()); int duration = (int) (Math.random() * 10000 + 3000); set.addAnimation(randomrotate(duration)); set.addAnimation(randomScale()); set.addAnimation(endScale(duration)); //添加的顺序很重要,TranslateAnimation必须在ScaleAnimation的后面,否则会出现奇怪的现象 set.addAnimation(randomTranslate(top,duration,l)); set.addAnimation(randomTranslateX()); set.addAnimation(endAlpha(duration)); return set; }
private TranslateAnimation randomTranslate(int startTopInParent,int duration,AnimationListener l) { float halfPercent = (1 + startTopInParent * 1.0f / mScreenHeight) / 2; TranslateAnimation trans = new TranslateAnimation(Animation.RELATIVE_TO_SELF,Animation.RELATIVE_TO_SELF,(float) ((Math.random() > 0.5f ? 1 : -1) * Math.random()) * 5,Animation.RELATIVE_TO_PARENT,(float) (Math.random() * halfPercent + halfPercent)); trans.setInterpolator(this,android.R.anim.linear_interpolator); trans.setStartOffset(0); trans.setDuration(duration); trans.setAnimationListener(l); return trans; }
private void startScaleDownAnimation(AnimationListener listener) { mScaleDownAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(1 - interpolatedTime); } }; mScaleDownAnimation.setDuration(SCALE_DOWN_DURATION); mHeadViewContainer.setAnimationListener(listener); mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleDownAnimation); }
private void animateOffsetToCorrectPosition(int from,AnimationListener listener) { mFrom = from; mAnimatetoCorrectPosition.reset(); mAnimatetoCorrectPosition.setDuration(ANIMATE_TO_TRIGGER_DURATION); mAnimatetoCorrectPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mAnimatetoCorrectPosition); }
private void animateOffsetToStartPosition(int from,AnimationListener listener) { mFrom = from; mAnimatetoStartPosition.reset(); mAnimatetoStartPosition.setDuration(ANIMATE_TO_START_DURATION); mAnimatetoStartPosition.setInterpolator(mDecelerateInterpolator); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mAnimatetoStartPosition); resetTargetLayoutDelay(ANIMATE_TO_START_DURATION); }
private void startScaleUpAnimation(AnimationListener listener) { mScaleAnimation = new Animation() { @Override public void applyTransformation(float interpolatedTime,Transformation t) { setAnimationProgress(interpolatedTime); } }; mScaleAnimation.setDuration(mMediumAnimationDuration); if (listener != null) { mHeadViewContainer.setAnimationListener(listener); } mHeadViewContainer.clearanimation(); mHeadViewContainer.startAnimation(mScaleAnimation); }
animation-timing-function 的 steps 详解
W3C 里的定义:
animation-timing-function 规定动画的速度曲线。
这个属性有很多取值,
linear:
线性过渡。等同于贝塞尔曲线(0.0, 0.0, 1.0, 1.0)
ease:
平滑过渡。等同于贝塞尔曲线(0.25, 0.1, 0.25, 1.0)
ease-in:
由慢到快。等同于贝塞尔曲线(0.42, 0, 1.0, 1.0)
ease-out:
由快到慢。等同于贝塞尔曲线(0, 0, 0.58, 1.0)
ease-in-out:
由慢到快再到慢。等同于贝塞尔曲线(0.42, 0, 0.58, 1.0)
step-start:
等同于 steps(1, start)
step-end:
等同于 steps(1, end)
steps(<integer>[, [ start | end ] ]?):
接受两个参数的步进函数。第一个参数必须为正整数,指定函数的步数。第二个参数取值可以是start或end,指定每一步的值发生变化的时间点。第二个参数是可选的,默认值为end。
cubic-bezier(<number>, <number>, <number>, <number>):
特定的贝塞尔曲线类型,4个数值需在[0, 1]区间内
然后今天我想巴拉的是 steps (1,start) 和 steps (1,end) 的区别;
首先,
steps(<integer>[, [ start | end ] ]?):
接受两个参数的步进函数。
第一个参数必须为正整数,指定了函数中的间隔数量。
第二个参数取值可以是 start 或 end,指定每一步的值发生变化的时间点。
第二个参数是可选的,默认值为 end。
step-start 等同于 steps (1,start),动画分成 1 步,动画执行时为开始左侧端点的部分为开始;
step-end 等同于 steps (1,end):动画分成一步,动画执行时以结尾端点为开始,默认值为 end。
上例子吧!
.bird{
min-width: 91px;
min-height: 71px;
background: url(../img/bird.png) -182px 0px no-repeat;
}
.birdFly {
animation: bird-slow 900ms infinite steps(1,start);
}
@keyframes bird-slow{
0% {
background-position: -182px 0px;//第三只小鸟
}
50% {
background-position: 0px 0px;//第一只小鸟
}
75% {
background-position: -91px 0px;//第二只小鸟
}
100% {
background-position: -182px 0px;//第三只小鸟
}
}
图片是这张雪碧图;动画效果就是模拟小鸟展翅飞翔,一直扇动翅膀;默认是先显示第三只小鸟
steps (1,start); 第一个参数为 1 的意思就是,每俩关键帧之间只要 1 步完成,也就是 0%-50%,只分为一步完成,50%-75%,也是一步完成;以此类推;注意 steps 的设置都是针对两个关键帧之间的,而非是整个 keyframes;
timing-function 作用于每两个关键帧之间,而不是整个动画。
steps(1,start) : 第一只鸟和第二只鸟相互切换
steps(1,end) : 第三只鸟和第一只鸟相互切换
start 跳过 0%,end 跳过 100%
step-start 在变化过程中,都是以下一帧的显示效果来填充间隔动画,所以 0% 到 50% 直接就显示了第一只鸟
step-end 与上面相反,都是以上一帧的显示效果来填充间隔动画,所以 0% 到 50% 直接就显示了第三只鸟
然后思考下,此时我们设置成 start,小鸟会是怎样的呢?
答案是:
start: 进入页面就会显示第一只小鸟,因为跳过了 0%;
end: 进入页面就会显示第三只小鸟,因为跳过了 100%;
所以如果你一进来想显示小鸟展翅的样子就得是 start, 如果是一进来展示小鸟收翅膀的样子,那就设置成 end;
个人觉得一进来看到小鸟展翅的样子还是比较喜欢的,哇哈哈哈、
再说下 "forwards" 和 "infinite"
使用 "forwards" 和 "infinite" 对步数的的作用是不同的。
如果我们改变成 "infinite",将不会出现 "100%", 因为 "forwards" 命令使动画在我们设置的步数外添加了额外的一步。
"forwards" 使动画保持结束时的状态,所以在步数执行完毕后,动画会跳到最后一帧的状态并保持不变。
(做那种雨滴滴下来,然后种子就发芽,然后就长成了参天大树,就定格到最后一帧的大树的效果;animation: grow 5000ms forwards steps (20); 这里的 steps 是你的雪碧图里的图片的数量减一哦)
总结:
steps 函数,它可以传入两个参数,第一个是分成多少步完成,第二个参数可选,决定显示效果(是上一帧填充还是下一帧填充);
steps 的设置都是针对两个关键帧之间的,而非是整个 keyframes;
timing-function 作用于每两个关键帧之间,而不是整个动画;
"forwards" 命令使动画在我们设置的步数外添加了额外的一步。
animation-timing-function属性有什么用
animation-timing-function属性是用来设置动画的速度曲线,它可以设置动画速度为匀速、以低速开始、以低速结束、以低速开始和结束、先慢后快再变慢或者是自己自定义数值。
CSS3 animation-timing-function属性
作用:
animation-timing-function 规定动画的速度曲线。速度曲线定义动画从一套 CSS 样式变为另一套所用的时间。速度曲线用于使变化更为平滑。
语法:
animation-timing-function: value;
说明:
animation-timing-function 使用名为三次贝塞尔(Cubic Bezier)函数的数学函数,来生成速度曲线。您能够在该函数中使用自己的值,也可以预定义的值:
linear:动画从头到尾的速度是相同的。
ease:默认值。动画以低速开始,然后加快,在结束前变慢。
ease-in:动画以低速开始。
ease-out:动画以低速结束。
ease-in-out:动画以低速开始和结束。
cubic-bezier(n,n,n,n):在 cubic-bezier 函数中自己的值。可能的值是从 0 到 1 的数值。
注:Internet Explorer 9 以及更早的版本不支持 animation-timing-function 属性。
CSS3 animation-timing-function属性的使用示例
<!DOCTYPE html> <html> <head> <style> div { width:100px; height:100px; background:red; position:relative; animation:mymove 5s infinite; animation-timing-function:linear; /* Safari and Chrome */ -webkit-animation:mymove 5s infinite; -webkit-animation-timing-function:linear; } @keyframes mymove { from {left:0px;} to {left:200px;} } @-webkit-keyframes mymove /* Safari and Chrome */ { from {left:0px;} to {left:200px;} } </style> </head> <body> <div></div> </body> </html>
效果图:
以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!
以上就是animation-timing-function属性有什么用的详细内容,更多请关注php中文网其它相关文章!
今天关于开始在嵌入PyQT4 GUI的funcAnimation中工作的介绍到此结束,谢谢您的阅读,有关Android ScaleAnimation和TranslateAnimation,如何避免ScaleAnimation运动、android.view.animation.Animation.AnimationListener的实例源码、animation-timing-function 的 steps 详解、animation-timing-function属性有什么用等更多相关知识的信息可以在本站进行查询。
本文标签: