先看看百度手机助手5.0的样子:

发现他是用一个CustomTabHost.java来实现底部TabHost点击效果的,很漂亮,点击Tab的时候文字会上跑,图片会从底部跑出来的一个小动画。

下面我用自己的方法逆袭了他的CustomTabHost,感觉用起来比它的好用,而且简单不少!

本文只给出关键代码,需要工程的自行下载:

package com.wj.ring5577.ui;

import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.widget.TabHost;
import android.widget.TabHost.OnTabChangeListener; import com.wj.ring5577.R; public class MainActivity extends FragmentActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); TabHost tabHost = (TabHost) findViewById(R.id.tabhost);
tabHost.setup(); // Call setup() before adding tabs if loading TabHost
// using findViewById(). final WJTabMenuView mv = (WJTabMenuView) LayoutInflater.from(this)
.inflate(R.layout.test, null);
mv.setText("Tag A");
final WJTabMenuView mv2 = (WJTabMenuView) LayoutInflater.from(this)
.inflate(R.layout.test, null);
mv2.setText("Tag B");
final WJTabMenuView mv3 = (WJTabMenuView) LayoutInflater.from(this)
.inflate(R.layout.test, null);
mv3.setText("Tag C");
final WJTabMenuView mv4 = (WJTabMenuView) LayoutInflater.from(this)
.inflate(R.layout.test, null);
mv4.setText("Tag D"); tabHost.setOnTabChangedListener(new OnTabChangeListener() {
@Override
public void onTabChanged(String tabId) {
mv.unSelected();
mv2.unSelected();
mv3.unSelected();
mv4.unSelected();
if (tabId.equals("taba")) {
mv.selected();
} else if (tabId.equals("tabb")) {
mv2.selected();
} else if (tabId.equals("tabc")) {
mv3.selected();
} else if (tabId.equals("tabd")) {
mv4.selected();
}
}
}); tabHost.addTab(tabHost.newTabSpec("taba").setIndicator(mv)
.setContent(R.id.tab1));
tabHost.addTab(tabHost.newTabSpec("tabb").setIndicator(mv2)
.setContent(R.id.tab2));
tabHost.addTab(tabHost.newTabSpec("tabc").setIndicator(mv3)
.setContent(R.id.tab3));
tabHost.addTab(tabHost.newTabSpec("tabd").setIndicator(mv4)
.setContent(R.id.tab4)); } @Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.main, menu);
return true;
} }
package com.wj.ring5577.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.Animation.AnimationListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import com.wj.ring5577.R; /**
* Tab底部菜单视图
*
* @author Harris
*
*/
public class WJTabMenuView extends LinearLayout {
private TextView mTextView = null;
private ImageView mImageView = null;
private boolean interruptFlag;
private Context mContext;
private Animation mAnim_txt;
private Animation mAnim_img; public WJTabMenuView(Context context) {
super(context);
mContext = context;
} public WJTabMenuView(Context context, AttributeSet attrs) {
super(context, attrs); LayoutInflater layoutInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
layoutInflater.inflate(R.layout.wjtabmenulayout, this);
mTextView = (TextView) findViewById(R.id.wjtabmenu_tv);
mImageView = (ImageView) findViewById(R.id.wjtabmenu_iv);
mContext = context;
mAnim_txt = AnimationUtils.loadAnimation(mContext,
R.anim.bottommenu_txt_anim);
mAnim_txt.setAnimationListener(new AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
} @Override
public void onAnimationRepeat(Animation animation) {
} @Override
public void onAnimationEnd(Animation animation) {
if (!interruptFlag) {
mTextView.setVisibility(View.GONE);
}
}
}); mAnim_img = AnimationUtils.loadAnimation(mContext,
R.anim.bottommenu_img_anim);
} public void setText(String title) {
mTextView.setText(title);
} /**
* 放弃选择
*/
public void unSelected() {
interruptFlag = true;
clearAnimation();
mTextView.setVisibility(View.VISIBLE);
} /**
* 选中
*/
public void selected() {
interruptFlag = false;
mTextView.startAnimation(mAnim_txt);
mImageView.startAnimation(mAnim_img);
}
}

如果你觉得好,请帮忙下载
http://www.5577.com/5577.apk


源码:

http://download.csdn.net/detail/h3c4lenovo/5992279

完美逆向百度手机助手5.0底部菜单栏 - Android Tabhost 点击动画的更多相关文章

  1. Android 仿百度手机助手首页滑动效果

    今天看到百度手机助手首页上的滑动效果非常nice,主要功能归结为: 1.当手指上划时,顶部搜索栏随手指移动距离而缩小到隐藏,隐藏后内容还是可以继续移动 2.手指下滑时,当显示内容达到第一个时,顶部搜索 ...

  2. 安卓app上传到应用宝、360手机助手、小米应用商店、百度手机助手/安卓市场/91助手

    1.小米应用商店 小米开放平台网站:https://account.xiaomi.com 注册帐号教程地址:http://dev.xiaomi.com/doc/?p=90 应用提交流程:http:// ...

  3. Bdsyn百度手机助手是何物,它是怎样神不知鬼不觉地安装到你的电脑里的?

    [电脑软件管理中Bdsyn手机助手的问题]Bdsyn手机助手 is developed by Baidu, Inc. and is used by 10 users of Software Infor ...

  4. Android静默安装实现方案,仿360手机助手秒装和智能安装功能

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/47803149 之前有非常多朋友都问过我.在Android系统中如何才干实现静默安装 ...

  5. Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  6. Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  7. Anroid 手机助手 详细解析 概述(二)

    这篇主要说一下手机插入之后的一些动作. 1)  捕获窗口消息 插入拔出一个USB设备windows 会给所有的窗口发送特定的消息,只要我们捕获这些消息就可以处理设备插入和拔出.需要注意的是插入或者拔出 ...

  8. 解决手机助手与 android sdk 的adb 冲突问题

    现象:手机助手与 sdk 内的 adb冲突,用助手与真机连接后,sdk adb 就被干掉了 突发奇想: 突然有一天想到用助手的adb来覆盖sdk内的adb,果然奏效.现在eclipse.助手.cmd窗 ...

  9. 2星|《腾讯产品法》:标题党,作者只有QQ手机助手的短期产品经验

    腾讯产品法(一本书读懂腾讯产品思维与运营方法,<腾讯传>作者吴晓波推荐) 全书是作者的一些产品设计与运营的经验.如果书名不误导读者,这本书的内容值3星. 基于书名的误导,读后比较失望,作者 ...

随机推荐

  1. 表中查询重复的数据,如何通过sql语句查询?

    1.最直观的思路:要知道所有名字有重复人资料,首先必须知道哪个名字重复了:select name from emp group by name having count(*)>1所有名字重复人的 ...

  2. 外部式css样式,写在单独的一个文件中

    外部式css样式(也可称为外联式)就是把css代码写一个单独的外部文件中,这个css样式文件以“.css”为扩展名,在<head>内(不是在<style>标签内)使用<l ...

  3. 通常我们使用[NSDate date]方法得到的时间与当前时间不一致,如何解决?

    NSDate *date = [NSDate date];    NSTimeZone *zone = [NSTimeZone systemTimeZone];    NSInteger interv ...

  4. Android ListView+image的使用

    首先创建layout部局文件xml: <?xml version="1.0" encoding="utf-8"?> <RelativeLayo ...

  5. javascript实现ajax

    什么是 ajax ajax 即“Asynchronous JavaScript and XML”(异步 JavaScript 和 XML),也就是无刷新数据读取. http 请求 首先需要了解 htt ...

  6. php基础知识【函数】(6)mysql数据库

    一.连接和关闭 1.mysql_connect('example.com:3307', 'root', '123456') --打开一个到 MySQL 服务器的非永久连接 2.mysql_pconne ...

  7. php计算时间差/两个时间日期相隔的天数,时,分,秒.

    function timediff( $begin_time, $end_time ) { if ( $begin_time < $end_time ) { $starttime = $begi ...

  8. windows 下 pgsql 拓展开启

    环境:windowxp + apache2.2+php5.2.13+postgresql8.3 操作步骤:1.修改php.ini,去掉“extension=php_pgsql.dll ”和“exten ...

  9. atoi的实现

    #include <iostream> using namespace std; int atoi(char* s) { int retval=0; int n=1; if (*s=='- ...

  10. javascript深入理解js闭包[转]

    一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量 ...