码迷,mamicode.com
首页 > 移动开发 > 详细

Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换

时间:2015-07-15 22:49:16      阅读:411      评论:0      收藏:0      [点我收藏+]

标签:android   控件   animation   relativelayout   

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

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

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


如下图,交换layoutOne 与layoutTwo 。

技术分享



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


<span style="font-size:18px;">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;
    		}
    	}
    	
    }
}</span>


二、使用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;
    		}
    			
    	}
    	
    }
}

源代码下载传送门:稍后补链。

版权声明:本文为博主原创文章,未经博主允许不得转载。

Android - 交换控件位置:基于LayoutParams的瞬间交换与基于ObjectAnimator动画效果交换

标签:android   控件   animation   relativelayout   

原文地址:http://blog.csdn.net/zzukun/article/details/46898401

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!