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
- Android吸入动画效果
- Android 吸入动画效果详解
- Android 吸入动画效果详解
- Android 吸入动画效果详解
- Android 吸入动画效果详解
- Android 吸入动画效果详解
- Android 吸入动画效果详解
- Android 吸入动画效果实现分解
- Android 吸入动画效果详解(仿mac退出效果)
- Android动画之图片吸入动画详解
- Android Mesh吸入式动画详解
- Android动画---Animation动画效果
- Android 动画效果 --Animation 动画
- Android 动画效果 --Animation 动画
- Android 动画效果 --Animation 动画
- Android 动画效果 --Animation 动画
- Android 动画效果 --Animation 动画
- Android 动画效果 --Animation 动画
- 容量评估与应用水位
- ubuntu下Tomcat7安装
- 图片上传前 预览
- BZOJ 4008 [HNOI2015]亚瑟王
- WalkerSimulate
- Android吸入动画效果
- <br>和javascript中\n的区别
- MyBatis通过自行配置的方式输出日志
- “我的工作,是推动腾讯的边界”
- Codeforces 176E
- 剑指Offer之面试题8:旋转数组中的最小数字
- SQL中的组合查询概述
- C++ 线程同步的四种方式
- 第三方开源库:retrofit