I have two animation with different duration like below:
Anim 1:
TranslateAnimation trans1 = new TranslateAnimation(0, 0, 0, 500);
trans1.setStartOffset(0);
trans1.setDuration(5000);
trans1.setFillAfter(true);
Anim 2:
TranslateAnimation trans2 = new TranslateAnimation(0, -100, -200, -200);
trans2.setDuration(200);
trans2.setRepeatCount(25);
trans2.setFillAfter(true);
As you see these animation have different durations. I would like to animate Anim2 (duration 200) in loop 25 times during one time Anim1 (duration 5000) animation from Y: 0 to 500.
I've tried to do with AnimationSet and addAnimation but it doesn't want to work.
Could You give me some tips how can I solve this problem?
My code:
AnimationSet rootSet = new AnimationSet(true);
rootSet.setInterpolator(new AccelerateInterpolator());
rootSet.setRepeatMode(Animation.INFINITE);
rootSet.setRepeatCount(200);
rootSet.setDuration(5000);
rootSet.setFillAfter(true);
TranslateAnimation trans1 = new TranslateAnimation(0, 0, 0, 500);
trans1.setStartOffset(0);
trans1.setDuration(5000);
trans1.setFillAfter(true);
rootSet.addAnimation(trans1);
AnimationSet rootSet2 = new AnimationSet(true);
rootSet2.setInterpolator(new AccelerateInterpolator());
rootSet2.setRepeatMode(Animation.INFINITE);
rootSet2.setRepeatCount(200);
rootSet2.setDuration(200);
TranslateAnimation trans2 = new TranslateAnimation(0, -100, -200, -200);
trans2.setDuration(200);
trans2.setRepeatCount(25);
trans2.setFillAfter(true);
rootSet2.addAnimation(trans2);
rootSet.addAnimation(rootSet2);
iv.startAnimation(rootSet);
EDIT:
When I play only trans2 animation it repeats 25 times as I wanted (in horizontal way).
And additionally I would like this animation to animate (whole horizontal animation not only imageview) in vertical way (trans1).
I hope that this description will be clearer.
When I added these two animations in one AnimationSet the first animation doesnt work at all and imageview (not animationn) is translated linear to -200,500.
Now I see what you want to do. You probably are better of doing multiple animations - one for each "line". Add an AnimationListener to know when the previous Animation ends (onAnimationEnd callback), jump down one line and go from right to left again.
They all basically are the same, just the fromYDelta and toYDelta values would change for each Animation.
Related
I want to create animation like this image
I create point to point animation and beizier path animation but I am not able to develop animation like this image.
Please help me out.
You can put 2 translate on the same object like this :
AnimationSet set = new AnimationSet(true);
set.addAnimation(translateX);
set.addAnimation(translateY);
image.startAnimation(set);
In your case it's like gravity. So i would suggest to use accelerate interpolator on the translateY animation and a linear Interpolator on translateX.
Here is the code :
TranslateAnimation animationX = new TranslateAnimation(fromX,toX,0,0);
animationX.setInterpolator(new LinearInterpolator());
TranslateAnimation animationY = new TranslateAnimation(0,0,fromY,toY);
animationX.setInterpolator(new AccelerateInterpolator());
AnimationSet set = new AnimationSet(true);
set.addAnimation(animationX);
set.addAnimation(animationY);
image.startAnimation(set);
Set the duration by using:
translationX.setDuration(duration);
Hope this helps.
I am using a ViewFlipper to display a series of images, however the animation I am trying to apply (zoom+fade) is only shown on the very last image in the ViewFlipper. Anyone know where I'm going wrong? Below is my code:
mViewFlipper = (ViewFlipper) fragmentView.findViewById(R.id.view_flipper);
mViewFlipper.setVisibility(View.VISIBLE);
for(int i=0;i<galleryGridImages.size();i++)
{
setFlipperImage(galleryGridImages.get(i));
}
AnimationSet as = new AnimationSet(false);
fade = new AlphaAnimation(1.0f,0.0f);
fade.setDuration(transitionSpeed);
as.addAnimation(fade);
zoom = new ScaleAnimation(1, 3, 1, 3, Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
zoom.setDuration(transitionSpeed);
as.addAnimation(zoom);
mViewFlipper.setOutAnimation(as);
mViewFlipper.setAutoStart(true);
mViewFlipper.setFlipInterval(interval);
mViewFlipper.startFlipping();
I'm using an AnimationSet to do many Translate animations. In this example I want to move an ImageView from 0 to 700 (offscreen) and from -700 to 0 (the view move to the extreme right and re-enter from the extreme left). I use this code:
AnimationSet set = new AnimationSet(true);
set.setInterpolator(new AccelerateDecelerateInterpolator());
set.setFillEnabled(true);
if(traject!=null){
TranslateAnimation tmpAnim = null;
set.setDuration(duration);
int d = traject.size()!=0 ? duration/traject.size() : duration;
for(int i =0; i<traject.size();i++){
tmpAnim = new TranslateAnimation( traject.get(i).getStartX(),
traject.get(i).getEndX(),
traject.get(i).getStartY(),
traject.get(i).getEndY() );
tmpAnim.setDuration(d);
tmpAnim.setFillAfter(true);
tmpAnim.setStartOffset(d*i);
set.addAnimation(tmpAnim);
}
}
traject is an arraylist holding each TranslateAnimation start and end points
But in my test example the animation goes from -700 to 700. I tried switching the order of the TranslateAnimations, using setStartTime() instead of setStartOffset(), skipping the call to setStartOffset(), the result is the same. Do you have any idea on what I am missing ?
Hi i want to reduce the length of the edittext view to 3/4 of the screen by animation. Help me on this and below is my code to animate. But it does not happen to move. I want to move it from right to left. Help me please thanks in advance
below is my code
private void animate() {
initialLength = etSearchText.getWidth();
currentLength = initialLength - ibtnSearch.getWidth();
ScaleAnimation anim = new ScaleAnimation(initialLength, currentLength,0, 0);
anim.setInterpolator(new LinearInterpolator());
anim.setDuration(3000);
etSearchText.startAnimation(anim);
initialLength = currentLength;
}
If the above code is called in the onCreate method, you'll find that ibtnSearch.getWidth() is equal to 0. Elements only gain a size after the onResume method I believe. Try temporally hardcoding the size of the search button to see if the animation works or not
Also you'll need to change the scale constructor used to change the point of scaling
try new ScaleAnimation(1, 0.75, 1, 1, 0, 0); Note that the scaling is done by factor terms, not pixel difference.
OK here's the problem
i have an ImageView in my activity, here's what it looks in main.xml:
<ImageView
android:id="#+id/ic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="#drawable/icon"
android:layout_gravity="center_horizontal"/>
I want this image to move -200(left) and then to 100(right) and then back to 0 with bouncing effect.
I've implement this with my code:
as = new AnimationSet(true);
as.setFillEnabled(true);
as.setInterpolator(new BounceInterpolator());
TranslateAnimation ta = new TranslateAnimation(-300, 100, 0, 0);
ta.setDuration(2000);
as.addAnimation(ta);
AnimationSet sa = new AnimationSet(true);
sa.setFillEnabled(true);
sa.setInterpolator(new DecelerateInterpolator());
TranslateAnimation ta2 = new TranslateAnimation(100, 0, 0, 0);
ta2.setDuration(2000);
sa.addAnimation(ta2);
as.addAnimation(sa);
you can see at the code the X transition that i want (-300,100) then (100, 0)
however, the image doesn't move like it should, instead it just stop at 100 and then bouncing...
hmmm...., do you guys know what is wrong or what should i do to accomplish this?
If I'm not mistaking, you're shooting for a sequence of animations.
Interestingly, once you start an AnimationSet, all the animations added are ran simultaneously and not sequentially; therefore you need to setStartOffset(long offSet) for each animation that follows the first animation.
Maybe something like this will work...
as = new AnimationSet(true);
as.setFillEnabled(true);
as.setInterpolator(new BounceInterpolator());
TranslateAnimation ta = new TranslateAnimation(-300, 100, 0, 0);
ta.setDuration(2000);
as.addAnimation(ta);
TranslateAnimation ta2 = new TranslateAnimation(100, 0, 0, 0);
ta2.setDuration(2000);
ta2.setStartOffset(2000); // allowing 2000 milliseconds for ta to finish
as.addAnimation(ta2);
I suggest you to use ObjectAnimator. It is very easy to implement your case. Your animation may look like this:
ObjectAnimator animator1 = ObjectAnimator.ofFloat(targetView, "translationX", -200f);
animator1.setRepeatCount(0);
animator1.setDuration(1000);
ObjectAnimator animator2 = ObjectAnimator.ofFloat(targetView, "translationX", 100f);
animator2.setRepeatCount(0);
animator2.setDuration(1000);
ObjectAnimator animator3 = ObjectAnimator.ofFloat(targetView, "translationX", 0f);
animator3.setRepeatCount(0);
animator3.setDuration(1000);
//sequencial animation
AnimatorSet set = new AnimatorSet();
set.play(animator1).before(animator2);
set.play(animator2).before(animator3);
set.start();
If you are not familior with ObjectAnimator, you can check this android example tutorial:
Android View Animation Example
Something like this is very easy in 3.0 and above. Here are two links that I used to accomplish something similar.
http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html
http://developer.android.com/reference/android/animation/AnimatorSet.Builder.html