先看看百度手机助手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. 【转】 iOS-Core-Animation-Advanced-Techniques(七)

    高效绘图.图像IO以及图层性能 高效绘图 原文:http://www.cocoachina.com/ios/20150106/10840.html 不必要的效率考虑往往是性能问题的万恶之源. ——Wi ...

  2. js做全选,用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false

    用一个checkbox复选框做多个checkbox复选框的全选按钮,有一个复选框未被选择时,全选按钮的checked就为false,当所有checkbox都被选中时,全选按钮也被选中. 详解: 有两种 ...

  3. javascript基础学习(七)

    javascript之Object对象 学习要点: 创建Object对象 Object对象属性 Object对象方法 一.创建Object对象 new Object(); new Object(val ...

  4. tbody 滚动条

    ARRIVALS TO BRISTOL - ENGLAND FLIGHT CODE FROM STA ETA Notes T3 4264 ISLE OF MAN 11:40 11:42 LANDED ...

  5. 面试后 follow up letter 分享

    分享一下最近面试外企的follow up letter. Dear Mr. Xu,     Thank you again for the time you and Mr. Guo spent wit ...

  6. CentOS 6.8安装Python2.7.13

    查看当前系统中的 Python 版本 python --version 返回 Python 2.6.6 为正常. 检查 CentOS 版本 cat /etc/redhat-release 返回 Cen ...

  7. linux系统删除空间后系统分区空间仍不释放问题

    总结的原因: 1.删除文件文件后没有清空回收站; 2.删除的文件不在系统分区,在其他分区上; 3.删除的文件被保留在了/tmp分区下,而/tmp分区不是独立的分区,是在根分区/的基础上划分出来的分区; ...

  8. 《python学习手册》之一——程序运行

    Python解释器执行Python代码时候,大概经历如下几个阶段:(1) 加载代码文件 (2)翻译成AST (3)生成bytecode(.pyc文件,与编译的python版本有关).可以使用pytho ...

  9. 简单的贴图显示shander

    Shader "ztq/Diffuse" {    Properties {           _Color ("Main Color", Color) =  ...

  10. 2、MyBatis.NET学习笔记之CodeSmith使用

    说明:本系列随笔会与CSDN同步发布,当然这里先发,因为这里可以用WLW.但刚才由于误操作,没有重新发上来.只好先在CSDN先发了.重往这里发时图片无法处理,索性直接粘过来吧! 使用框架后一些相关的配 ...