編輯:關於Android編程
現需要交換兩個控件(本文中是兩個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 : [email protected] * 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; } } } }
上一篇文章將Android 實現變色狀態欄我們實現了變色的狀態欄,也介紹了沉浸式狀態欄和透明狀態欄的區別,這篇文章我們實現沉浸式狀態欄。 沉浸式狀態欄的來源就是很多手機用
一、DatePicker繼承自FrameLayout類,日期選擇控件的主要功能是向用戶提供包含年、月、日的日期數據並允許用戶對其修改。如果要捕獲用戶修改日期選擇控件中的數
上一篇文章主要講述了Android的TouchEvent的分發過程,其中有兩個重要的函數:onInterceptTouchEvent和onTouchEvent,這兩個函數
推薦閱讀:使用RecyclerView添加Header和Footer的方法