Animation 模拟纸盒的爆破(使用AnimationSet实现)

用简单的Animation动作模拟爆破的瞬间,仔细的调整各种参数效果会更像

 

原理:用定义好的纸张从onTouch中心点向四面八方散开,散开过程中,使用不用的速度、大小、方向、旋转角度、透明度(这里纸张可以加上火焰,效果会更好,纸张燃烧代表透明度)、位置、3D旋转  ;

 

复制代码
//3D翻转 ,模拟力量方向俯冲
Rotate3d rota3d = new Rotate3d((int) (Math.random()*90), (float) (Math.random()*90), 
(float) (Math.random()*x), (int) (Math.random()*y), 310.0f, true);  

//3D翻转
//Rotate3d rota3d = new Rotate3d((int) (Math.random()*90),
 //(float) (Math.random()*90,0, 0, 310.0f, true);  
复制代码

3D动作,float centerX, float centerY 的位置能够模拟出力量的方向,如果都为0,均从中心散出

这里虽然好象有点扯淡,不过效果还是蛮像的

 

复制代码
  1 public class MainActivity extends Activity {
  2     private FrameLayout fl;
  3     //定义Bitmap对象
  4     Bitmap    mBit = null;
  5     //AnimationSet animationSet;
  6     List<ExplosionView> exvArrayList = new ArrayList<ExplosionView>();
  7     List<AnimationSet> animationArrayList = new ArrayList<AnimationSet>();
  8     DisplayMetrics dm;
  9     private float dmw=0,dmh=0;
 10     //定义碎片的形状
 11     private int s1 = R.drawable.s1,s2=R.drawable.s2,s3=R.drawable.s3,s4=R.drawable.s4,
 12             s5=R.drawable.s5,s6=R.drawable.s6,s7=R.drawable.s7,s8=R.drawable.s8,
 13             s9=R.drawable.s9,s10=R.drawable.s10,s11=R.drawable.s11,s12=R.drawable.s12,
 14             s13=R.drawable.s13,s14=R.drawable.s14;
 15     private int[] chip = {s1,s2,s3,s4,s5,s6,s7,s8,s9,s10,s11,s12,s13,s14};
 16     private int x=1;
 17     @Override
 18     public void onCreate(Bundle savedInstanceState) {
 19         super.onCreate(savedInstanceState);
 20         
 21         requestWindowFeature(Window.FEATURE_NO_TITLE);
 22         getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,
 23                       WindowManager.LayoutParams. FLAG_FULLSCREEN);
 24         
 25         dm = new DisplayMetrics();   
 26         getWindowManager().getDefaultDisplay().getMetrics(dm);   
 27         //获得手机的宽度和高度像素单位为px   
 28         dmw = dm.widthPixels;
 29         dmh = dm.heightPixels;   
 30         
 31         fl = new FrameLayout(this);
 32         
 33         //添加50个爆炸碎片
 34         for (int i = 0; i < 50; i++) {
 35             int width=getResources().getDrawable(chip[x]).getIntrinsicWidth();
 36             int height=getResources().getDrawable(chip[x]).getIntrinsicHeight();
 37             fl.addView(createExv(chip[x],width,height));
 38             if(x==13){
 39                 x=0;
 40             }
 41             x++;
 42         }
 43         fl.setOnTouchListener(new LayoutListener());
 44         setContentView(fl);
 45     }
 46     
 47     public ExplosionView createExv(int chipx,int w,int h){
 48         ExplosionView exv = new ExplosionView(this,w,h);
 49         exv.setImageResource(chipx);
 50         exv.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
 51         exv.setVisibility(View.INVISIBLE);    
 52         exvArrayList.add(exv);
 53         //animationArrayList.add(animationSet);
 54         return exv;
 55     }
 56 
 57     class LayoutListener implements OnTouchListener{
 58         
 59         public boolean onTouch(View v, MotionEvent event) {
 60             float x = event.getX();
 61             float y = event.getY();
 62             
 63 //            Iterator it1 = exvArrayList.iterator();   
 64 //            while(it1.hasNext()){   
 65 ////System.out.println(it1.next()); 
 66 //                ExplosionView tempExplosion = (ExplosionView) it1.next();
 67 //                tempExplosion.setVisibility(View.VISIBLE);
 68 //                tempExplosion.setLocation((int)y-20, (int)x-20);
 69 //                tempExplosion.startAnimation(animation);
 70 //            }   
 71             for(int i = 0;i < exvArrayList.size(); i ++){   
 72                 //System.out.println(exvArrayList.get(i));   
 73                 ExplosionView tempExplosion = (ExplosionView) exvArrayList.get(i);
 74                 tempExplosion.setVisibility(View.VISIBLE);
 75                 tempExplosion.setLocation((int)y, (int)x);
 76                 AnimationSet animationSet = new AnimationSet(false);
 77                 
 78                 //设置碎片的透明程度变化
 79                 AlphaAnimation alpha = new AlphaAnimation(1.0f, 0.0f);
 80                 //透明动作:减速
 81                 alpha.setInterpolator(new DecelerateInterpolator());
 82                 
 83                 
 84                 //设置碎片的旋转角度
 85                 RotateAnimation rotate = new RotateAnimation(0, (int) (Math.random()*330+30),
 86                         Animation.RELATIVE_TO_SELF, 0.5f,
 87                         Animation.RELATIVE_TO_SELF, 0.5f);
 88                 //旋转动作:减速
 89                 rotate.setInterpolator(new DecelerateInterpolator());
 90     
 91                 
 92                 //设置碎片的移动变化
 93                 TranslateAnimation translate = new TranslateAnimation(
 94                         0,
 95                         (float) ( dmw/2-(Math.random()*(dmw))),
 96                         0, 
 97                         (float) ( dmw/2-(Math.random()*(dmw))));
 98                 //移动动作:减速
 99                 translate.setInterpolator(new DecelerateInterpolator());
100             
101                 //设置碎片的大小变化
102                 ScaleAnimation scaleAnimation = new ScaleAnimation(
103                         1, (float)(Math.random()), 
104                         1, (float)(Math.random()),
105                         Animation.RELATIVE_TO_SELF, 0,
106                         Animation.RELATIVE_TO_SELF, 0);
107                 //大小动作:加速度
108                 scaleAnimation.setInterpolator(new AccelerateInterpolator());
109                 
110                 //3D翻转 ,模拟力量方向俯冲
111                 Rotate3d rota3d = new Rotate3d((int) (Math.random()*90), (float) (Math.random()*90), 
112                         (float) (Math.random()*x), (int) (Math.random()*y), 310.0f, true);  
113                 //Rotate3d rota3d = new Rotate3d((int) (Math.random()*90), (float) (Math.random()*90), 
114 //        0, 0, 310.0f, true);  
115                 
116                 
117                 animationSet.addAnimation(alpha);
118                 animationSet.addAnimation(rotate);
119                 animationSet.addAnimation(translate);
120                 animationSet.addAnimation(rota3d);
121                 animationSet.addAnimation(scaleAnimation);
122                 
123                 //动画持续时间,使每个碎片的动作速度都不一样 
124 //animationSet.setDuration(5000);
125                 animationSet.setDuration((int) (Math.random()*4000+100));
126                 //开始停顿时间
127                 animationSet.setStartOffset(0);
128                 animationSet.setFillAfter(true);
129                 
130                 tempExplosion.startAnimation(animationSet);
131             }   
132 
133             return false;
134         }
135     }
136     
137     class ExplosionView extends ImageView{
138         private int exvw,exvh;
139         public ExplosionView(Context context,int ew,int eh) {
140             super(context);
141             this.exvw=ew;
142             this.exvh=eh;
143         }
144         //handle the location of the explosion
145         public void setLocation(int top,int left){
146             this.setFrame(left, top, left+exvw, top+exvh);
147         }    
148     }
149     
150     class Rotate3d extends Animation{   
151         private final float mFromDegrees;      
152         private final float mToDegrees;      
153         private final float mCenterX;      
154         private final float mCenterY;      
155         private final float mDepthZ;      
156         private final boolean mReverse;      
157         private Camera mCamera;  
158         
159         public Rotate3d(float fromDegrees, float toDegrees,float centerX, float centerY, 
160                 float depthZ, boolean reverse) {          
161             mFromDegrees = fromDegrees;          
162             mToDegrees = toDegrees;          
163             mCenterX = centerX;          
164             mCenterY = centerY;          
165             mDepthZ = depthZ;          
166             mReverse = reverse;      
167         }    
168         
169         @Override      
170         public void initialize(int width, int height, int parentWidth, int parentHeight) {          
171             super.initialize(width, height, parentWidth, parentHeight);          
172             mCamera = new Camera();      
173         }     
174         
175         @Override      
176         protected void applyTransformation(float interpolatedTime, Transformation t) {          
177             final float fromDegrees = mFromDegrees;          
178             float degrees = fromDegrees + ((mToDegrees - fromDegrees) * interpolatedTime);          
179             final float centerX = mCenterX;          
180             final float centerY = mCenterY;          
181             final Camera camera = mCamera;          
182             final Matrix matrix = t.getMatrix();          
183             camera.save();          
184             if (mReverse) {              
185                 camera.translate(0.0f, 0.0f, mDepthZ * interpolatedTime);          
186             } else {              
187                 camera.translate(0.0f, 0.0f, mDepthZ * (1.0f - interpolatedTime));          
188             }          
189             
190             camera.rotateY(degrees);          
191             camera.getMatrix(matrix);          
192             camera.restore();           
193             matrix.preTranslate(-centerX, -centerY);          
194             matrix.postTranslate(centerX, centerY);      
195             }  
196         } 
复制代码

 

这里没结合到物理学,如果要做得更仔细,可以加有手机的重力感应和撞击屏幕边缘的反弹效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值