Android动画效果(一) 任意两点间的抛物线动画

先上图:

这里要实现的是,点击上面的按钮后,将TextView随机移动到底部按钮的位置

首先,将底部按钮放入list中,方便后面随机取值

list = new ArrayList<Button>();
list.add(btn1);
list.add(btn2);
list.add(btn3);
list.add(btn4);

然后就是点击按钮后的抛物线动画了

点击按钮后,先写一个数组用来存储点击按钮的X、Y坐标,然后new一个用来展示抛物线的控件,楼主这里用的TextView,也可以换成其他任何控件

int[] start_location = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
v.getLocationInWindow(start_location);// 这是获取当前点击的按钮在屏幕的X、Y坐标(这也是动画开始的坐标)
TextView te = new TextView(this);
te.setText("啊");

接下来,将要移动的控件放入一个动画层中

ViewGroup rootView = (ViewGroup) this.getWindow().getDecorView();
LinearLayout animLayout = new LinearLayout(this);
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT,
LinearLayout.LayoutParams.MATCH_PARENT);
animLayout.setLayoutParams(lp);
animLayout.setId(Integer.MAX_VALUE);
animLayout.setBackgroundResource(android.R.color.transparent);
rootView.addView(animLayout);

int x = location[0];
int y = location[1];
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
lp.leftMargin = x;
lp.topMargin = y;
view.setLayoutParams(lp);

紧接着,就是写抛物线的动画了。

抛物线其实就是两个位移动画,一个横向移动,一个竖向移动,两个动画同时执行,就有了抛物线的效果

<span style="color:#000000;">int endX = 0 - start_location[0] + list.get(ra.nextInt(list.size())).getLeft();// 动画位移的X坐标
int endY = end_location[1] - start_location[1];// 动画位移的y坐标
TranslateAnimation translateAnimationX = new TranslateAnimation(0,endX, 0, 0);
translateAnimationX.setInterpolator(new LinearInterpolator());

translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);

TranslateAnimation translateAnimationY = new TranslateAnimation(0,0, 0, endY);
translateAnimationY.setInterpolator(new AccelerateInterpolator());
translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
translateAnimationX.setFillAfter(true);

AnimationSet set = new AnimationSet(false);
set.setFillAfter(false);
set.addAnimation(translateAnimationY);
set.addAnimation(translateAnimationX);
set.setDuration(800);// 动画的执行时间
view.startAnimation(set);</span>

最后,监听动画,在动画执行的时候将要移动的控件显示出来,动画结束了将之隐藏

完整代码如下:

package com.example.movetest;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationSet;
import android.view.animation.LinearInterpolator;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.TextView;

/***
 *
 * @author 帽檐遮不住阳光
 *
 * @date 2016/5/9
 *
 */
public class MainActivity extends Activity implements OnClickListener {

 private List<Button> list = null;
 private ViewGroup viewGroup;// 动画层
 private Button btn1, btn2, btn3, btn4;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  findViewById(R.id.btn).setOnClickListener(this);
  btn1 = (Button) findViewById(R.id.btn1);
  btn2 = (Button) findViewById(R.id.btn2);
  btn3 = (Button) findViewById(R.id.btn3);
  btn4 = (Button) findViewById(R.id.btn4);

  list = new ArrayList<Button>();
  list.add(btn1);
  list.add(btn2);
  list.add(btn3);
  list.add(btn4);
 }

 @Override
 public void onClick(View v) {
  // TODO Auto-generated method stub
  switch (v.getId()) {
  case R.id.btn:
   int[] start_location = new int[2];// 一个整型数组,用来存储按钮的在屏幕的X、Y坐标
   v.getLocationInWindow(start_location);// 这是获取当前点击的按钮在屏幕的X、Y坐标(这也是动画开始的坐标)
   TextView te = new TextView(this);
   te.setText("啊");
   move(te, start_location);
   break;
  }
 }

 private void move(final View v, int[] start_location) {
  viewGroup = null;
  viewGroup = createAnimLayout();
  viewGroup.addView(v);// 把要移动的控件添加到动画层
  final View view = addViewToAnimLayout(viewGroup, v, start_location);
  int[] end_location = new int[2];// 这是用来存储动画结束位置的X、Y坐标
  Random ra = new Random();
  for (int i = 0; i < list.size(); i++) {
   list.get(ra.nextInt(list.size())).getLocationInWindow(end_location);
   // 计算位移
   int endX = 0 - start_location[0]
     + list.get(ra.nextInt(list.size())).getLeft();// 动画位移的X坐标
   int endY = end_location[1] - start_location[1];// 动画位移的y坐标
   TranslateAnimation translateAnimationX = new TranslateAnimation(0,
     endX, 0, 0);
   translateAnimationX.setInterpolator(new LinearInterpolator());
   translateAnimationX.setRepeatCount(0);// 动画重复执行的次数
   translateAnimationX.setFillAfter(true);

   TranslateAnimation translateAnimationY = new TranslateAnimation(0,
     0, 0, endY);
   translateAnimationY.setInterpolator(new AccelerateInterpolator());
   translateAnimationY.setRepeatCount(0);// 动画重复执行的次数
   translateAnimationX.setFillAfter(true);

   AnimationSet set = new AnimationSet(false);
   set.setFillAfter(false);
   set.addAnimation(translateAnimationY);
   set.addAnimation(translateAnimationX);
   set.setDuration(800);// 动画的执行时间
   view.startAnimation(set);
   // 动画监听事件
   set.setAnimationListener(new AnimationListener() {
    // 动画的开始
    @Override
    public void onAnimationStart(Animation animation) {
     v.setVisibility(View.VISIBLE);
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
     // TODO Auto-generated method stub
    }

    // 动画的结束
    @Override
    public void onAnimationEnd(Animation animation) {
     v.setVisibility(View.GONE);
    }
   });
   break;
  }
 }

 /**
  * 创建动画层
  *
  * @return
  */
 private ViewGroup createAnimLayout() {
  ViewGroup rootView = (ViewGroup) this.getWindow().getDecorView();
  LinearLayout animLayout = new LinearLayout(this);
  LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.MATCH_PARENT,
    LinearLayout.LayoutParams.MATCH_PARENT);
  animLayout.setLayoutParams(lp);
  animLayout.setId(Integer.MAX_VALUE);
  animLayout.setBackgroundResource(android.R.color.transparent);
  rootView.addView(animLayout);
  return animLayout;
 }

 private View addViewToAnimLayout(final ViewGroup vg, final View view,
   int[] location) {
  int x = location[0];
  int y = location[1];
  LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
    LinearLayout.LayoutParams.WRAP_CONTENT,
    LinearLayout.LayoutParams.WRAP_CONTENT);
  lp.leftMargin = x;
  lp.topMargin = y;
  view.setLayoutParams(lp);
  return view;
 }

}

下载地址:http://download.csdn.net/detail/qq_18612815/9514682



时间: 2024-07-30 03:29:12

Android动画效果(一) 任意两点间的抛物线动画的相关文章

Android动画效果之初识Property Animation(属性动画)(三)

前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Android动画效果之Frame Animation(逐帧动画)(二),其实总结前两个的根本目的就是为了学习今天的主角Property Animation(属性动画).其实在Android最早期只提供了前两种动画方式,在Android 3.0才引入了属性动画,谷歌为何要引入属性动画呢?今天我们来总结学习一

Android动画效果之Frame Animation(逐帧动画)

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). 其他几种动画效果: Android动画效果之Tween Animation(补间动画) Android动画效果之Frame Animation(逐帧动画) Android动画效果之初识Property Animation(属性动画) Android动画效果之Prop

基于pgrouting的任意两点间的最短路径查询函数二

在前面的博文中写过一篇查询任意两点间最短路径的函数,当时对pgrouting不熟悉,功能很low.现在对该函数进行扩展,支持用户自己输入查询的数据库表,这一点看似简单,其实意义很大,在做室内导航的时候当用户所在的楼层变化的时候最短路径函数查询的数据表名称也会发生变化,不可能一栋大楼里的道路都是一样的吧,另外进行跨楼层的最短路径规划时,需要查询从A到楼梯口的最短路径和楼梯口到B的最短路径,这些都需要进行最短路径规划的时候能够自己选择数据表. DROP FUNCTION pgr_fromAtoB(t

Floyd-Warshall算法(求解任意两点间的最短路) 详解 + 变形 之 poj 2253 Frogger

/* 好久没有做有关图论的题了,复习一下. --------------------------------------------------------- 任意两点间的最短路(Floyd-Warshall算法) 动态规划: dp[k][i][j] := 节点i可以通过编号1,2...k的节点到达j节点的最短路径. 使用1,2...k的节点,可以分为以下两种情况来讨论: (1)i到j的最短路正好经过节点k一次 dp[k-1][i][k] + dp[k-1][k][j] (2)i到j的最短路完全

基于pgrouting的任意两点间的最短路径查询函数

前面文章介绍了如何利用postgresql创建空间数据库,建立空间索引和进行路径规划.但是在真实的场景中用户进行路径规划的时候都是基于经纬度数据进行路径规划的,因为用户根本不会知道道路上节点的ID.因此文本讲述如何查询任意两点间的最短路径. 一.定义函数名及函数参数 函数名定义为: pgr_fromAtoB 参数设置分别为: 输入为数据库表名,起点和终点的经纬度坐标 输出为:路段序号,gid号,道路名,消耗及道路集合体. IN tbl varchar, --数据库表名 IN x1 double

图论之最短路02-1——任意两点间最短距离及路径

======================================================== 求任意两点间最短距离及其路径.(万能最短路) 输入:权值矩阵,起点,终点 输出:最短距离矩阵,指定起讫点路径(经过的顶点编号) 为任意一点到其他点最短路奠定基础 ======================================================== function [P d]=liangdianzuiduanlu(W,qidian,zhongdian) W

图论之最短路02-2——改进的任意两点间最短距离及路径

======================================================== 重要程度 ***** 求任意两点间最短距离及其路径.(万能最短路) 输入:权值矩阵,起点,终点 输出:最短距离矩阵,指定起讫点路径(经过的顶点编号) ======================================================== function renyizuiduanlu(W) clc disp('                        

任意两点间的最短路问题 Floyd-Warshall算法

这一算法与之前的Bellman-F=Ford算法一样,都可以判断负环 只需要检查dp [i] [j] 是负数的顶点i即可 1 // 求解任意两点间的最短路径问题 2 // Floyed-Warshall算法 3 // 复杂度O(N^3),N为顶点数 4 5 #include <cstdio> 6 #include <iostream> 7 8 using namespace std; 9 // 用dp的思路来求解 10 // dp[k][i][j]:从i到j,只利用前K个节点的最短

Android动画效果之Frame Animation(逐帧动画)(二)(

前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame Animation(逐帧动画). Frame Animation(逐帧动画): 逐帧动画(Frame-by-frame Animations)从字面上理解就是一帧挨着一帧的播放图片,就像放电影一样.和补间动画一样可以通过xml实现也可以通过java代码实现.接下来借助目前项目中的一个开奖的动画来总结