文档章节

Android动画之属性动画1 自由落体

 非著名程序員ML
发布于 2016/04/06 10:20
字数 663
阅读 59
收藏 0

效果图有点赖,大家凑合看。

废话不多说,下面说一下我实现这个效果的步奏:

  1. 图片出现的时候有一个效果就是由小变大,为了使效果看起来更自然,我又加上了一个alpha的渐变。透明值  0-1.

    2.在 1中的效果执行完之后,接下来就是一个自由落体的运动了。  自由落体运动速度是越来越快的,这个大家都知道,我也不多说了。要实现这个就得实时的改变  图片的  Y值,这里就要用 中学时 学的   物理公式了  h=1/2gt^2 ,忘了的百度去,为了使动画看起来自然我又加上了透明度的渐变动画

DropDownShitLayout 
这个是整体的布局
DropDownTypeEvaluator 
这个是属性动画里面的自定义的属性值,主要就是这个实现的自由落体的功能

    

    下面上代码:

package com.dropdown.shit;

import java.util.Random;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.animation.ValueAnimator.AnimatorUpdateListener;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.PointF;
import android.util.AttributeSet;
import android.view.View;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.example.cicleprogrossbar.R;

public class DropDownShitLayout extends RelativeLayout{

	int width,height;
	public DropDownShitLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
	Random random=new Random();
	@SuppressLint("NewApi")
	public void addShit(){
		int shit[]={R.drawable.shit1,R.drawable.shit2,R.drawable.shit3,R.drawable.shit4,R.drawable.shit5};
		final ImageView image=new ImageView(getContext());
		image.setImageResource(shit[random.nextInt(shit.length)]);
 		addView(image);

		AnimatorSet set=getAnimatorSet(image);
		set.start();
		set.addListener(new AnimatorListenerAdapter() {
			@Override
			public void onAnimationEnd(Animator animation) {
				// TODO Auto-generated method stub
				super.onAnimationEnd(animation);
				removeView(image);
			}
		}); 
 	}
	  @Override
	    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
	        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
	       height = getMeasuredHeight();
	       width = getMeasuredWidth();
	    }
	@SuppressLint("NewApi")
	private AnimatorSet  getAnimatorSet(final View view){
		PointF  start=new PointF(random.nextInt(width),random.nextInt(height/7));
		view.setX(start.x);
		view.setY(start.y);
		
		PointF  end=new PointF(start.x,height);
		
		ObjectAnimator  objectAnimator=ObjectAnimator.ofFloat(view,"alpha",0.2f,1f);
		ObjectAnimator  scaleX=ObjectAnimator.ofFloat(view, "scaleX",0.2f,1f);
		ObjectAnimator  scaleY=ObjectAnimator.ofFloat(view, "scaleY",0.2f,1f);
		
		AnimatorSet startAnim=new AnimatorSet();
		startAnim.playTogether(objectAnimator,scaleX,scaleY);
		startAnim.setDuration(1000);
		startAnim.setTarget(view);
		//图片放大 透明度渐变
		
		DropDownTypeEvaluator dropdown=new DropDownTypeEvaluator();
  		ObjectAnimator   dropdownAnimator=ObjectAnimator.ofObject(view, "y", dropdown, start,end);
 		dropdownAnimator.setDuration(2000);
 		//dropdownAnimator.setInterpolator(new AccelerateInterpolator());
 		dropdownAnimator.addUpdateListener(new AnimatorUpdateListener() {
			
			@Override
			public void onAnimationUpdate(ValueAnimator arg0) {
				// TODO Auto-generated method stub
				PointF p=(PointF) arg0.getAnimatedValue();
				view.setY(p.y);
 			}
		});
		//自由落体
 		
 		 AnimatorSet endAnim=new AnimatorSet();
 		 endAnim.playSequentially(startAnim,dropdownAnimator);
 		 //playSequentially  这句话是让  变大和 自由落体  串行执行
 		return endAnim;
	}
	
	
	
	
	

}

      

package com.dropdown.shit;

import android.animation.TypeEvaluator;
import android.annotation.SuppressLint;
import android.graphics.PointF;

@SuppressLint("NewApi")
public class DropDownTypeEvaluator implements TypeEvaluator<PointF> {
	 

	@Override
	public PointF evaluate(float t, PointF start, PointF end) {
		// TODO Auto-generated method stub
        PointF pointF = new PointF();
        pointF.x=start.x;
        //1/2gt^2
        int g=10;
        pointF.y=end.y*g*t*t+start.y;
 		
		return pointF;
	}

}

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
   	android:orientation="vertical"
     >
   
  <com.dropdown.shit.DropDownShitLayout
      android:layout_height="fill_parent"
       android:layout_width="fill_parent"
       android:layout_weight="1"
       android:id="@+id/layout"
      >
        </com.dropdown.shit.DropDownShitLayout>
  
</RelativeLayout>

setContentView(R.layout.dropdownshit);
		
 		
 		final Handler handler=new Handler();
 		new Timer().schedule(new TimerTask() {
			
			@Override
			public void run() {
				// TODO Auto-generated method stub
				handler.post(new Runnable() {
					
					@Override
					public void run() {
						// TODO Auto-generated method stub
						add();
					}
				});
				
			}
		}, 1000,200);
	}
	
	private void  add(){
 				// TODO Auto-generated method stub
				DropDownShitLayout add=(DropDownShitLayout) findViewById(R.id.layout);
				add.addShit();
 				 
 
	}


© 著作权归作者所有

共有 人打赏支持
粉丝 1
博文 4
码字总数 1993
作品 2
杭州
程序员
私信 提问
animation的xml定义中的android:interpolator属性

可能有很多人不理解其中的android:interpolator="@android:anim/decelerate_interpolator"是什么含义,文档里说的也不太清楚,其实很简单,看下面: interpolator定义一个动画的变化率(the...

鉴客
2011/11/27
2.5K
0
Android 众多的布局属性详解

Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料,花费本人一个下午搞出来的,希望对其他人有用。 第一类:属性值为true或false android:lay...

GeorgeBrown
2015/06/09
0
0
Android应用资源---动画资源(Animation Resources)

有两种类型的动画资源: 属性动画 在设定的时间内,通过修改与Animator类相关的对象的属性值来创建一个动画。 视图动画 有两种类型的视图动画框架 补间动画(Tween animation):通过执行通过...

davidpark
2014/02/01
0
0
Android应用资源---动画资源(Animation Resources)(一)

有两种类型的动画资源: 属性动画 在设定的时间内,通过修改与Animator类相关的对象的属性值来创建一个动画。 视图动画 有两种类型的视图动画框架 补间动画(Tween animation):通过执行通过...

长平狐
2012/10/16
263
0
分析android动画模块[转]

作者: 刘鹏 日期: 2009-03-07 Android 平台提供了两类动画,一类是 Tween 动画,即通过对场景里的对象不断做图像变换(平移、缩放、旋转)产生动画效果;第二类是 Frame 动画,即顺序播放事先做...

kevin.gan
2010/01/06
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

glide 下载golang.org包问题

今天编译Uber的Aresgo。依赖管理用 glide,下载golang.org 包的时候遇到问题。 方法一: 设置 glide mirror glide mirror set https://golang.org/x/mobile https://github.com/golang/mobi...

shengjuntu
28分钟前
0
0
4.线程

线程是操作系统中最小的执行单元。 它本身不是一个程序,而是在程序中运行。 换句话说,线程并不相互独立,并与其他线程共享代码段,数据段等。 这些线程也被称为轻量级进程。 线程状态 新线...

Eappo_Geng
35分钟前
0
0
在Linux上编译LLVM/Clang 8.0.0等全部源代码

本教程使用的操作系统是Ubuntu Linux 18.04.2 LTS版本,要编译的LLVM源代码是8.0.0。 1、安装必要的软件。它们是:build-essential/cmake/swig/python-swigpk/libxml2/libxml2-dev/libncurs...

ryanliue
43分钟前
5
0
毕业季,我的Linux求职之路

秋招终于告一段落了,本硕的七年求学之路也快画上了句号。回首求职的这一段日子,痛苦并快乐着。感谢所有陪伴着我走过这一段路程的同学,所有的辛酸都值得铭记。求职的过程中在网上看了很多的...

linux-tao
今天
4
0
Mybatis动态语句,if test字符串不用进行null判断

描述:根据creator列进行过滤获取image表的数据。 代码如下: @Select("<script>" + " select * from image " + " <where>" + " <if test='isAllCreator != 1'> ......

Coder顾
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部