Android吸入动画效果

来源:互联网 发布:网络推广服务费 编辑:程序博客网 时间:2024/05/15 17:26

因工作需求,要实现一个中心小球吸入的效果,本来想在onDraw方法绘制,发现坐标不好计算和控制,以手机中心点为半径,在一定范围内,随机生成需求小球坐标,然后小球慢慢移到中心坐标即可,只要不断修改小球坐标即可,但是发现小球的坐标得控制,不能超过中心坐标,到中心坐标还得回到起始位置,觉得繁琐,就想了个简单方法,直接new 若干个小球,设置小球随机坐标,也知道中心点坐标,使用补间动画,ScaleAnimation TranslateAnimation进行set即可,在小球慢慢移向中心点的同时慢慢缩小,重复动画即可;效果图如下:


代码简单,直接看:

package com.kakaxi.haha.animtionapplication;import android.content.Context;import android.content.Intent;import android.graphics.Bitmap;import android.graphics.drawable.BitmapDrawable;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.util.DisplayMetrics;import android.util.Log;import android.view.animation.AccelerateInterpolator;import android.view.animation.Animation;import android.view.animation.AnimationSet;import android.view.animation.ScaleAnimation;import android.view.animation.TranslateAnimation;import android.widget.ImageView;import android.widget.RelativeLayout;import java.util.Random;public class IndraftActivity extends AppCompatActivity {    private static final String TAG = "IndraftActivity";    private int ANIMATION_TIME = 1000;    private int ANIMATION_SCALE_TIME = 1000;    private RelativeLayout parent;    private int mTotalWidth;    private int mTotalHeight;    private int count = 40;    private Bitmap mStarOne, mStarTwo, mStarThree;    private int mCenterX, mCenterY;    private Bitmap bitmap;    public static Intent getIntent(Context context) {        Intent intent=new Intent(context, IndraftActivity.class);        return intent;    }    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_indraft);        parent = (RelativeLayout) findViewById(R.id.float_btn);    }    @Override    public void onWindowFocusChanged(boolean hasFocus) {        super.onWindowFocusChanged(hasFocus);        if(hasFocus){            indraftStar();        }    }    private void indraftStar() {        DisplayMetrics dm = getApplicationContext().getResources().getDisplayMetrics();        mTotalWidth = dm.widthPixels;        mTotalHeight = dm.heightPixels;        Log.i(TAG,"mTotalWidth="+mTotalWidth+"--------mTotalHeight="+mTotalHeight);        mCenterX = mTotalWidth/2-30;        mCenterY = mTotalHeight/2-100;        //不同样式,大小的小球        mStarOne = ((BitmapDrawable) getResources().getDrawable(R.drawable.snow1)).getBitmap();        mStarTwo = ((BitmapDrawable) getResources().getDrawable(R.drawable.snow2)).getBitmap();        mStarThree = ((BitmapDrawable) getResources().getDrawable(R.drawable.snow3)).getBitmap();        Log.i(TAG,"mCenterX="+mCenterX+"----0----mCenterY="+mCenterY);        //初始化,造批量小球        Random random = new Random();        for (int i = 0; i < count; i++) {            // 获取小球大小比例            float starSize = getStarSize(0.2f, 0.8f);            // 初始化小球大小            ImageView starInfovView = new ImageView(this);            starInfovView.setScaleX(starSize);            starInfovView.setScaleY(starSize);            // 初始化小球透明度            starInfovView.setAlpha(getStarSize(0.5f, 1.8f));            // 初始化小球位置,随机生成一定坐标范围内的小球            int rvalueX =400-random.nextInt(800);            int rvalueY = 450-random.nextInt(900);            Log.i(TAG, "rvalueX = " + rvalueX + "--rvalueY = " + rvalueY);            int x = mCenterX +rvalueX;            int y = mCenterY +rvalueY;            Log.i(TAG, "xLocation = " + x + "--yLocation = " + y);            RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams                    (RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);            starInfovView.setTop(y);            starInfovView.setLeft(x);            if (i% 3 == 0) {                bitmap = mStarOne;            } else if (i% 2 == 0) {                bitmap = mStarThree;            } else {                bitmap = mStarTwo;            }            starInfovView.setImageBitmap(bitmap);            starInfovView.setLayoutParams(layoutParams);            AnimationSet animatorSet =new AnimationSet (false);            ScaleAnimation scaleAnimation =new ScaleAnimation(1.0f, 0.0f, 1.0f, 0.0f,                    Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);            scaleAnimation.setDuration(ANIMATION_SCALE_TIME);            scaleAnimation.setInterpolator(new AccelerateInterpolator());            scaleAnimation.setRepeatCount(Animation.INFINITE);            scaleAnimation.setRepeatMode(Animation.RESTART);            animatorSet.addAnimation(scaleAnimation);            TranslateAnimation translateAnimation = new TranslateAnimation(x,mCenterX ,y , mCenterY);            translateAnimation.setDuration(ANIMATION_TIME);            translateAnimation.setInterpolator(new AccelerateInterpolator());            translateAnimation.setRepeatMode(Animation.RESTART);            translateAnimation.setRepeatCount(Animation.INFINITE);            animatorSet.addAnimation(translateAnimation);            starInfovView.startAnimation(animatorSet);            parent.addView(starInfovView);        }    }    /**     * 获取小球大小     */    private float getStarSize(float start, float end) {        float nextFloat = (float) Math.random();        if (start < nextFloat && nextFloat < end) {            return nextFloat;        } else {            // 如果不处于想要的数据段,则再随机一次,因为不断递归有风险            return (float) Math.random();        }    }    @Override    protected void onDestroy() {        super.onDestroy();        if(parent!=null){            parent.removeAllViews();        }    }}



2 0
原创粉丝点击