Search code examples
androidanimationviewobjectanimator

android animationing views for multiple devices


I have a small game in my application, if you get something right balloons float up the screen, the balloons are views moved by 2 ObjectAnimators in an animation set, and on my main debugging device it works fine but on other devices (including tablets) it looks aweful the values are all over the place and the views violently sway from one side to the next. here is a snippet of what im doing:

//2 square balloons floating

            sb = (ImageView)findViewById(R.id.squareballoon);
            sb.setVisibility(View.VISIBLE);

            sb2 = (ImageView)findViewById(R.id.squareballoon2);
            sb2.setVisibility(View.VISIBLE);

            sp.play(inflate, 1, 1, 0, 0, 1);

//left balloon

            ObjectAnimator sqbalAnim3 = ObjectAnimator.ofFloat(sb,"x",-500,500);
            sqbalAnim3.setDuration(700);
            sqbalAnim3.setRepeatCount(5);
            sqbalAnim3.setRepeatMode(ValueAnimator.REVERSE);

            ObjectAnimator sqbalAnim = ObjectAnimator.ofFloat(sb,"y",2000,-1800);
            sqbalAnim.setDuration(3000);
            sqbalAnim.setRepeatMode(ValueAnimator.RESTART);

            AnimatorSet animSetXY = new AnimatorSet();
            animSetXY.playTogether(sqbalAnim, sqbalAnim3);
            animSetXY.start();

//right balloon

            ObjectAnimator sqbalAnim4 = ObjectAnimator.ofFloat(findViewById(R.id.squareballoon2),"x",-1500,-500);

            sqbalAnim4.setDuration(700);
            sqbalAnim4.setRepeatCount(5);
            sqbalAnim4.setRepeatMode(ValueAnimator.REVERSE);

            ObjectAnimator sqbal2Anim = ObjectAnimator.ofFloat(findViewById(R.id.squareballoon2),"y",1800,-1800);
            sqbal2Anim.setDuration(3000);
            sqbal2Anim.setRepeatMode(ValueAnimator.RESTART);


            AnimatorSet animSetXY2 = new AnimatorSet();
            animSetXY2.playTogether(sqbal2Anim,sqbalAnim4);
            animSetXY2.start();

//balloon animation end

            animSetXY2.addListener(new AnimatorListenerAdapter() {
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);

                            sp.play(dropSound,1,1,0,0,1);
                            sb.setBackgroundResource(R.drawable.burst);
                            pop = (AnimationDrawable) sb.getBackground();
                            pop.start();
                            sb2.setBackgroundResource(R.drawable.burst);
                            pop = (AnimationDrawable) sb2.getBackground();
                            pop.start();

                }
            });
            return true;}

        //end of square balloons

ive read i can use a fraction rather than explicit values, can anybody help me out with this or point in the right direction, any and all suggestions welcome, many thanks


Solution

  • I guess your problem is in parameters you are using (hardcoding) like:

    ObjectAnimator.ofFloat(sb,"x",-500,500);
    ObjectAnimator.ofFloat(sb,"y",2000,-1800);
    

    Since such values are only good for the device (screen actually) you are testing on. Other devices has other screens with other resolutions and you should consider it. Also you should maybe calc values from dp to pixels. What are 500 and 2000 actually? If its pixels then most probably thats the problem.
    Take a look here (for dp to px):
    What is the difference between "px", "dp", "dip" and "sp" on Android?
    Android: 'dp' to 'px' conversion?