android开发 交换方向,Android - 互换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换...
Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换现需要交换两个控件(本文中是两个RelativeLayout),找到了两个方法:1、使用LayoutParams改变两个layout的属性,即其相对关系(below等),实现位置的交换,但是并没有交换的动画效果,是“瞬间”交换。2、使用animation交换控件位置,实现了我需要的
Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换
现需要交换两个控件(本文中是两个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;
}
}
}
}
源代码下载传送门:稍后补链。
版权声明:本文为博主原创文章,未经博主允许不得转载。
更多推荐
所有评论(0)