Android实现带动画效果的Tab Menu

今天给大家介绍如何在Android下实现一个带动画效果的Tab Menu。Tab Menu的打开动画效果为自下而上的淡入推进效果,关闭效果为自上而下的淡出推出效果。

实现的效果图如下(没有找到合适的屏幕录像工具,只能截静态图):

程序运行效果

[文件] dockmenu.rar ~ 49KB 下载(372)

[代码] TabMenuActivity.java

01package com.zhuozhuo;
02
03import android.app.Activity;
04import android.os.Bundle;
05import android.view.KeyEvent;
06import android.widget.TextView;
07
08public class TabMenuActivity extends Activity {
09/** Called when the activity is first created. */
10
11TabView dockView;
12TextView tv;
13
14@Override
15public void onCreate(Bundle savedInstanceState) {
16super.onCreate(savedInstanceState);
17setContentView(R.layout.main);
18tv = (TextView) findViewById(R.id.tv);
19dockView = new DockView(this);
20}
21
22public boolean onKeyDown(int keyCode, KeyEvent event) {
23if (keyCode == KeyEvent.KEYCODE_MENU) {//监听menu键
24if(dockView.isOpen()) {
25tv.setText("点击menu键打开dock");
26
27dockView.closeDock();//关闭dock
28}
29else {
30tv.setText("再次点击menu键或者back键关闭dock");
31dockView.openDock();//打开dock
32}
33return true;
34}
35if (keyCode == KeyEvent.KEYCODE_BACK) {//监听back键
36if(dockView.isOpen()) {//当dock打开时,按back键关闭dock
37dockView.closeDock();
38return true;
39}
40}
41return super.onKeyDown(keyCode, event);
42}
43
44
45}

[代码] TabView.java

001package com.zhuozhuo;
002
003import android.app.Activity;
004import android.content.Context;
005import android.view.View;
006import android.view.View.OnClickListener;
007import android.view.animation.Animation;
008import android.view.animation.Animation.AnimationListener;
009import android.view.animation.AnimationUtils;
010import android.widget.Toast;
011
012public class TabView {
013
014private static final int INTERVAL_TIME = 50;// 每个tab之间的动画时间间隔ms
015
016private View tab1;
017private View tab2;
018private View tab3;
019private View tab4;
020
021private Activity context;
022
023private boolean isOpen;
024
025public TabView(Activity context) {
026this.context = context;
027tab1 = context.findViewById(R.id.tab1);
028tab2 = context.findViewById(R.id.tab2);
029tab3 = context.findViewById(R.id.tab3);
030tab4 = context.findViewById(R.id.tab4);
031setOnClickListener(tab1, 1);
032setOnClickListener(tab2, 2);
033setOnClickListener(tab3, 3);
034setOnClickListener(tab4, 4);
035}
036
037public void openDock() {//打开dock
038tab(tab1, 0, true);
039tab(tab2, INTERVAL_TIME * 1, true);
040tab(tab3, INTERVAL_TIME * 2, true);
041tab(tab4, INTERVAL_TIME * 3, true);
042isOpen = true;
043}
044
045private void setOnClickListener(View view, final int pos) {
046view.setOnClickListener(new OnClickListener() {
047
048@Override
049public void onClick(View v) {
050Toast.makeText(context, "view" + pos + " click!", Toast.LENGTH_SHORT).show();//点击tab时显示toast
051closeDock();
052}
053});
054}
055
056private void tab(final View view,int delayTime,final boolean toOpen) {
057view.postDelayed(new Runnable() {
058
059@Override
060public void run() {
061Animation animation;
062
063if(toOpen) {
064view.setVisibility(View.VISIBLE);//动画开始前,设置view可见
065animation = AnimationUtils.loadAnimation(context, R.anim.show_tab);
066view.startAnimation(animation);
067
068}
069else {
070animation = AnimationUtils.loadAnimation(context, R.anim.close_tab);
071animation.setAnimationListener(new AnimationListener() {
072
073@Override
074public void onAnimationStart(Animation animation) {
075
076}
077
078@Override
079public void onAnimationRepeat(Animation animation) {
080
081}
082
083@Override
084public void onAnimationEnd(Animation animation) {
085view.setVisibility(View.INVISIBLE);//动画结束时,view不可见
086
087}
088});
089view.startAnimation(animation);
090
091
092}
093
094}
095}, delayTime);
096}
097
098public boolean isOpen() {
099return isOpen;
100}
101
102public void closeDock() {//关闭dock
103tab(tab1, 0, false);
104tab(tab2, INTERVAL_TIME * 1, false);
105tab(tab3, INTERVAL_TIME * 2, false);
106tab(tab4, INTERVAL_TIME * 3, false);
107isOpen = false;
108}
109}

转载于:https://www.cnblogs.com/tuncaysanli/archive/2012/04/24/2469110.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值