android 动画效果移动,Android吸入动画效果

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

ed8aa8f51fe016b5ecfb1b287e1b4aa3.gif

代码简单,直接看:

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 

// 获取小球大小比例

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 (count % 3 == 0) {

bitmap = mStarOne;

} else if (count % 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 

return nextFloat;

} else {

// 如果不处于想要的数据段,则再随机一次,因为不断递归有风险

return (float) Math.random();

}

}

@Override

protected void onDestroy() {

super.onDestroy();

if(parent!=null){

parent.removeAllViews();

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值