现需要交换两个控件(本文中是两个RelativeLayout),找到了两个方法:

1、使用LayoutParams改变两个layout的属性,即其相对关系(below等),实现位置的交换,但是并没有交换的动画效果,是“瞬间”交换。

2、使用animation交换控件位置,实现了我需要的动画效果。

如下图,交换layoutOne 与layoutTwo 。

一、首先介绍使用LayoutParams的方法。

package com.exchange;

import com.exchange.R;

import android.app.Activity;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.RelativeLayout;

import android.widget.Toast;

/*

* Exchange layout with LayoutParams

* Author : likun@stu.zzu.edu.cn

* Date: 2015/7/15

*/

public class ParamsExchangeActivity extends Activity {

private Button btnEx;

private LayoutInflater inflater;

private RelativeLayout myFirst,mySecond,layoutOne,layoutTwo;

//set controls' id , the id is random as you like , do NOT use zero

private int btnExId = 11;

private int layoutOneId = 12;

private int layoutTwoId = 13;

//exchange flag , in order to swap back and forth

private boolean TAG_firstLayoutTop;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layout_main);

btnEx=(Button)findViewById(R.id.button_exchange);

btnEx.setOnClickListener(new BtnExOnClickListener());

inflater=getLayoutInflater();

TAG_firstLayoutTop = true;

//init layoutOne

myFirst = (RelativeLayout) inflater.inflate(

R.layout.layout_first, null).findViewById(R.id.myFirst);

layoutOne = (RelativeLayout)findViewById(R.id.LayoutOne);

layoutOne.removeAllViews();

layoutOne.addView(myFirst);

//init layoutTwo

mySecond = (RelativeLayout) inflater.inflate(

R.layout.layout_second, null).findViewById(R.id.mySecond);

layoutTwo = (RelativeLayout)findViewById(R.id.LayoutTwo);

layoutTwo.removeAllViews();

layoutTwo.addView(mySecond);

}

public class BtnExOnClickListener implements OnClickListener

{

@Override

public void onClick(View v){

Toast.makeText(getBaseContext(), "exchange!", Toast.LENGTH_SHORT).show();

//set id for controls in order to change their Params

btnEx.setId(btnExId);

layoutOne.setId(layoutOneId);

layoutTwo.setId(layoutTwoId);

RelativeLayout.LayoutParams params;

if(TAG_firstLayoutTop){

params = (RelativeLayout.LayoutParams)layoutTwo.getLayoutParams();

params.removeRule(RelativeLayout.BELOW);//remove the exist 'BELOW' rule

params.addRule(RelativeLayout.BELOW,11);//add a new one 'BELOW' rule,below control NO. 11

layoutTwo.setLayoutParams(params);

params = (RelativeLayout.LayoutParams)layoutOne.getLayoutParams();

params.removeRule(RelativeLayout.BELOW);

params.addRule(RelativeLayout.BELOW,13);//below control NO. 13

layoutOne.setLayoutParams(params);

TAG_firstLayoutTop=false;// change the flag

}else{

//vice versa

params = (RelativeLayout.LayoutParams)layoutOne.getLayoutParams();

params.removeRule(RelativeLayout.BELOW);

params.addRule(RelativeLayout.BELOW,11);

layoutOne.setLayoutParams(params);

params = (RelativeLayout.LayoutParams)layoutTwo.getLayoutParams();

params.removeRule(RelativeLayout.BELOW);

params.addRule(RelativeLayout.BELOW,12);

layoutTwo.setLayoutParams(params);

TAG_firstLayoutTop=true;

}

}

}

}

二、使用animation交换控件

使用animation交换的方法非常简单:

ObjectAnimator.ofFloat(layoutTwo, "TranslationY", -300).setDuration(1000).start();

ObjectAnimator.ofFloat(layoutOne, "TranslationY", 300).setDuration(1000).start();

全部代码如下:

package com.exchange;

import android.animation.ObjectAnimator;

import android.app.Activity;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.Button;

import android.widget.RelativeLayout;

import android.widget.Toast;

public class AnimExchangeActivity extends Activity {

private Button btnEx;

private LayoutInflater inflater;

private RelativeLayout myFirst,mySecond,layoutOne,layoutTwo;

private boolean TAG_firstLayoutTop;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.layout_main);

btnEx=(Button)findViewById(R.id.button_exchange);

btnEx.setOnClickListener(new BtnExOnClickListener());

inflater=getLayoutInflater();

TAG_firstLayoutTop = true;

//init layoutOne

myFirst = (RelativeLayout) inflater.inflate(

R.layout.layout_first, null).findViewById(R.id.myFirst);

layoutOne = (RelativeLayout)findViewById(R.id.LayoutOne);

layoutOne.removeAllViews();

layoutOne.addView(myFirst);

//init layoutTwo

mySecond = (RelativeLayout) inflater.inflate(

R.layout.layout_second, null).findViewById(R.id.mySecond);

layoutTwo = (RelativeLayout)findViewById(R.id.LayoutTwo);

layoutTwo.removeAllViews();

layoutTwo.addView(mySecond);

}

public class BtnExOnClickListener implements OnClickListener

{

@Override

public void onClick(View v){

Toast.makeText(getBaseContext(), "exchange!", Toast.LENGTH_SHORT).show();

if(TAG_firstLayoutTop){

//move upward and downward 300

ObjectAnimator.ofFloat(layoutTwo, "TranslationY", -300).setDuration(1000).start();

ObjectAnimator.ofFloat(layoutOne, "TranslationY", 300).setDuration(1000).start();

TAG_firstLayoutTop = false;

}else{

//back to normal position

ObjectAnimator.ofFloat(layoutOne, "TranslationY", 0).setDuration(1000).start();

ObjectAnimator.ofFloat(layoutTwo, "TranslationY", 0).setDuration(1000).start();

TAG_firstLayoutTop = true;

}

}

}

} 源代码下载传送门: http://download.csdn.net/detail/zzukun/8903479

android控件之间的过渡动画效果,Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换...相关推荐

  1. android 水滴动画效果图,Android控件实现水滴效果

    看到ios版上QQ刷新效果像水滴,然后自己也想着去实现这样的效果,这篇文章暂时没有介绍下拉刷新的效果,只是单独用一个控件来实现这样的水滴效果. 效果图如下: 一.总体思路 1.画两个圆形,其中一个就是 ...

  2. android 颜色过渡动画效果,Android buttom textview 颜色平滑过渡的动画效果

    1.TransitionDrawable.例如,在文件夹中绘制一个xml文件,你可以这样写: 然后,在你的xml的实际检视你都引用这个TransitionDrawable在android:backgr ...

  3. android触摸效果,Android开发进阶:仿MIUI12控件触摸反馈效果(下沉+倾斜)附源码...

    简单模仿了下MIUI12里控件的触摸反馈效果,转载请标明出处 效果简述 按压控件内圈区域,控件整体缩小,高度降低(阴影消失) 按压内圈 按压控件外圈区域,依据触摸点控件以中心为支点,向触摸点倾斜 按压 ...

  4. Android自定义控件之3D上下翻页效果的倒计时控件

    这是一个自定义的倒计时控件,具有3D上下翻页翻转效果.最近项目中需要做一个倒计时控件,需要和iOS端的效果保持一样.大致效果是这样的,如下图所示: 由于暂时还不会怎么样制作gif动态图,所以想看具体效 ...

  5. Android开发详解:第4章《UI 控件》

    Android开发详解:第4章<UI 控件> 控件是Android程序设计的基本组成单位,通过使用控件可以高效地开发Android应用程序.所以熟练掌握控件的使用是合理.有效地进行Andr ...

  6. 云炬Android开发笔记 15评价晒单功能实现(自定义评分控件和仿微信自动多图选择控件)

    阅读目录 1. 晒单评价 1.1 点击页面跳转的实现 1.2 自定义评价订单的布局实现 1.3 星星布局的实现 2. 仿微信自动多图及删除控件 2.1 属性值及控件的定义 2.2 图片初始化方法onM ...

  7. android属性动画作用范围,Android开发之动画效果浅析(一)

    程序运行效果图: Android动画主要包含补间动画(Tween)View Animation.帧动画(Frame)Drawable Animation.以及属性动画Property Animatio ...

  8. Android开发笔记(三十六)展示类控件

    View/ViewGroup View是单个视图,所有的控件类都是从它派生出来:而ViewGroup是个视图组织,所有的布局视图类都是从它派生出来.由于View和ViewGroup是基类,因此很少会直 ...

  9. android 自定义view 动画效果,Android自定义view实现阻尼效果的加载动画

    效果: 需要知识: 1. 二次贝塞尔曲线 2. 动画知识 3. 基础自定义view知识 先来解释下什么叫阻尼运动 阻尼振动是指,由于振动系统受到摩擦和介质阻力或其他能耗而使振幅随时间逐渐衰减的振动,又 ...

最新文章

  1. Mila唐建团队新作:可迁移、可解释的单细胞RNA测序模型
  2. 如何在Go中编写多行字符串?
  3. 掩耳盗铃之使用WebBrowser封装网页
  4. 泰康人寿信息化三大核心战略:移动优先、数据驱动和云计算
  5. 动手造轮子:写一个日志框架
  6. 北大青鸟c语言课后答案,北大青鸟C语言教程--第一章 C语言基础.ppt
  7. 计算机时代 英语,雅思8分范文:计算机时代教师角色 【出国英语】
  8. 使用phpstudy中的apache进行虚拟主机的配置(自定义网站名进行访问,如http://wei.com)
  9. jquery 获取data-* 属性值
  10. 【SUSE Linux kernel版本升级】SUSE Linux Enterprise Server 12 SP5
  11. 启动3Dmax到初始化..界面卡住然后闪退解决办法
  12. 立通信电杆——水泥杆
  13. 知识点15:文件的高级应用
  14. 使用Python的psutil包获取机器IPv4信息
  15. 解决linux下.AppImage文件无法运行问题
  16. java preferences设置_Java利用Preferences设置个人偏好
  17. Sgu 101 欧拉通路
  18. Python smtp gmail发送邮件(to,cc)
  19. 使用邮件发送自定义报表
  20. 如何解决资源管理器被结束任务后的问题,怎么重启或新建资源管理器任务?

热门文章

  1. python读写excel模块pandas_如何用python pandas操作excel?
  2. Java编程思想学习笔记-第11章
  3. 部门日报系统部署备忘录
  4. 对VSCode在安装了Dev-cpp的电脑上的配置
  5. disk磁盘管理与Linux驱动编写
  6. Spring进阶教程之在ApplicationContext初始化完成后重定义Bean
  7. HTML-CSS-JS Prettify报错Node.js was not found 解决方法
  8. 用户名和密码都正确,无法直接登陆虚拟机上的linux
  9. CakePHP中文手册【翻译】
  10. windows和linux打印树状目录结构