Adi*_*ain 21 android android-animation android-view
在第一次单击按钮时,我想View
沿x轴滑动(向右滑动200像素).在第二次按下按钮时,我想View
沿x轴向后滑动到原来的位置.
该View.setTranslationX(float)
方法跳转查看与通话对象的水平位置myView.setTranslationX(200);
和myView.setTranslationX(0);
分别.任何人都知道我怎么能滑动的View
,而不是目标的水平位置?
注1: A
TranslateAnimation
是不好的,因为它实际上并没有移动,View
但只是呈现它移动的错觉.注2:在提出问题时我没有意识到这些
setTranslationX(float)
和setTranslationY(float)
方法是从API级别11开始引入的.如果你的目标是针对Honeycomb(API级别11),那么Gautam K的答案就足够了.否则,请参阅我的答案以获得建议的解决方案
Gau*_*tam 26
尝试研究ObjectAnimator及其超类Value Animator
你可以做这样的事情
ObjectAnimator anim = ObjectAnimator.ofFloat(this, "translationX", 0,200);
,然后
anim.start();
使用boolean
值并200,0
在对象动画制作器中切换它以向后滑动
PS:您可以使用setDuration
方法设置动画完成所需的时间
尝试查看提供向后兼容性的支持库.
正如@AdilHussain指出的那样,有一个名为nineoldandroids的库可以用于旧机器人的相同目的.
这个让我难以忍受了几天(让它在冰淇淋三明治之前上班),但我想我终于到了那儿!(感谢Gautam K和迈克以色列的领导)我最后做的是扩展我的View
(a FrameLayout
)按需要开始翻译右/左动画并听取动画的结束以重新定位我的FrameLayout
权利/如适用,如下:
public class SlidingFrameLayout extends FrameLayout
{
private final int durationMilliseconds = 1000;
private final int displacementPixels = 200;
private boolean isInOriginalPosition = true;
private boolean isSliding = false;
public SlidingFrameLayout(Context context)
{
super(context);
}
public SlidingFrameLayout(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public SlidingFrameLayout(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
@Override
protected void onAnimationEnd()
{
super.onAnimationEnd();
if (isInOriginalPosition)
offsetLeftAndRight(displacementPixels);
else
offsetLeftAndRight(-displacementPixels);
isSliding = false;
isInOriginalPosition = !isInOriginalPosition;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom)
{
super.onLayout(changed, left, top, right, bottom);
// need this since otherwise this View jumps back to its original position
// ignoring its displacement
// when (re-)doing layout, e.g. when a fragment transaction is committed
if (changed && !isInOriginalPosition)
offsetLeftAndRight(displacementPixels);
}
public void toggleSlide()
{
// check whether frame layout is already sliding
if (isSliding)
return; // ignore request to slide
if (isInOriginalPosition)
startAnimation(new SlideRightAnimation());
else
startAnimation(new SlideLeftAnimation());
isSliding = true;
}
private class SlideRightAnimation extends TranslateAnimation
{
public SlideRightAnimation()
{
super(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, displacementPixels,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0);
setDuration(durationMilliseconds);
setFillAfter(false);
}
}
private class SlideLeftAnimation extends TranslateAnimation
{
public SlideLeftAnimation()
{
super(
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, -displacementPixels,
Animation.ABSOLUTE, 0,
Animation.ABSOLUTE, 0);
setDuration(durationMilliseconds);
setFillAfter(false);
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,要SlidingFrameLayout
向右/向左滑动,您所要做的就是调用SlidingFrameLayout.toggleSlide()
方法.当然你可以调整这个SlidingFrameLayout
用于滑动更多像素,滑动更长时间等的目的,但这应该足以让你开始:)
归档时间: |
|
查看次数: |
42400 次 |
最近记录: |