<span style="color:#ff0000;">MainActivity </span>
import android.app.Activity;
import android.app.TabActivity;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.view.View;
import android.view.ViewTreeObserver;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TabHost;
import itcast.zz.myapp.R;
public class MainActivity extends TabActivity implements View.OnClickListener {
/**
* TabHost 的使用步骤:
* 1- 在布局文件中,声明指定ID的tabHost \ tabWidget \ FrameLayout
* 2- 让MainActivity 继承自 TabActivity
* 3- tabHost = getTabHost(); 获得tabHost
* 4- 参照:addTab 方法 添加标签
*/
//获得TabHost
private TabHost tabHost;
private ImageView ivSlide;
private LinearLayout llConversation;
private LinearLayout llFolder;
private LinearLayout llGroup;
private final String conversation = "conversation";
private final String folder = "folder";
private final String group = "group";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//setContentView的执行,Activity就会调用onContentChanged()
setContentView(R.layout.activity_main);
//直接通过getTabHost()即可获得, 因为在TabActivity的onContentChanged()中已经写过findbyid了
tabHost = getTabHost();
// //创建标签 参数可以认为是标签的命名
// TabHost.TabSpec tabSpec = tabHost.newTabSpec("conversation");
//
// //设置标签的文字和图标
// tabSpec.setIndicator("会话",getResources().getDrawable(R.drawable.tab_conversation));
//
// //设置内容
// Intent intent = new Intent(this,ConversationUi.class);
// tabSpec.setContent(intent);
//
// //添加标签
// tabHost.addTab(tabSpec);
addTab("conversation","会话",R.drawable.tab_conversation,ConversationUi.class);
addTab("folder","文件夹",R.drawable.tab_folder,FolderUi.class);
addTab("group","群组",R.drawable.tab_group,GroupUi.class);
ivSlide = (ImageView) findViewById(R.id.iv_slide_bg);
llConversation = (LinearLayout) findViewById(R.id.ll_conversation);
llFolder = (LinearLayout) findViewById(R.id.ll_folder);
llGroup = (LinearLayout) findViewById(R.id.ll_group);
llConversation.setOnClickListener(this);
llFolder.setOnClickListener(this);
llGroup.setOnClickListener(this);
// 初始化滑动图片的大小和位置
// 在onCreate 不能直接获得控件的大小,位置,因为此时,还没有测量控件,也没有指定位置
// int width = llConversation.getWidth();
// System.out.println("width:"+width);
// 获得view树的观察者
ViewTreeObserver viewTreeObserver = llConversation.getViewTreeObserver();
//添加一个全局改变位置的监听
viewTreeObserver.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
@Override
//当位置大小改变后调用此方法
public void onGlobalLayout() {
int width = llConversation.getWidth();
int height = llConversation.getHeight();
// System.out.println("width:"+width);
//获得布局参数,设置宽,高,注意,布局参数一定要和父View的类型保持一致
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams)ivSlide.getLayoutParams();
layoutParams.width = width;
layoutParams.height = height;
// llConversation 在其父view中的左边距
int left = llConversation.getLeft();
//为滑动框设置左边距
layoutParams.leftMargin = left;
//有些android版本的兼容性问题
// ivSlide.setLayoutParams(layoutParams);
//设置图片框移动的距离 即屏幕的1/3
itemLength = ((View)llConversation.getParent()).getWidth();
}
});
}
/**
* 添加标签
* @param tabName 标签的命名 在屏幕上显示不出来 是TabHost用来管理标签用的
* @param tabLabel 标签的显示标题文字
* @param iconId 图标
* @param clazz Activity的字节码
*/
private void addTab(String tabName, CharSequence tabLabel, int iconId, Class<?extends Activity> clazz) {
//创建标签 参数可以认为是标签的命名
TabHost.TabSpec tabSpec = tabHost.newTabSpec(tabName);
//设置标签的文字和图标
tabSpec.setIndicator(tabLabel,getResources().getDrawable(iconId));
//设置内容
Intent intent = new Intent(this,clazz);
tabSpec.setContent(intent);
//添加标签
tabHost.addTab(tabSpec);
//添加标签
tabHost.addTab(tabSpec);
}
/**
* 滑动图片所移动的单位长度 = 屏幕的1/3
*/
private int itemLength;
/**
* 滑动图片做动画时的开始位置
*/
private int lastPosition;
@Override
/**
* @param v 点击的view
*/
public void onClick(View v) {
switch(v.getId()){
case R.id.ll_conversation : //点击会话标签
ivSlide.startAnimation(getAnimation(0));// 为当前view设置动画 目标位置为起点 0
//为当前位置赋值 起始位置 0
lastPosition = 0;
break;
case R.id.ll_folder : //点击文件夹标签
TranslateAnimation ta = getAnimation(itemLength);
ivSlide.startAnimation(ta);// 为当前view设置动画 即ta
//每一次动画执行完之后,都应该更新最新的当前位置,将上一次的目标位置赋值为新的当前位置
lastPosition = itemLength;
break;
case R.id.ll_group : //点击群组标签
ivSlide.startAnimation(getAnimation(itemLength*2));// 为当前view设置动画以及动画的目标位置
//为当前位置赋值
lastPosition = itemLength*2;
break;
}
}
@NonNull
/**
* 创建一个从当前位置到 目标位置的平移动画
* @param destPosition 目标位置
*/
private TranslateAnimation getAnimation(float destPosition) {
TranslateAnimation ta = new TranslateAnimation(
Animation.ABSOLUTE,lastPosition, //ABSOLUTE绝对值 动画的原点坐标为它所在的view的左上角
Animation.ABSOLUTE,destPosition,
Animation.ABSOLUTE,0,
Animation.ABSOLUTE,0);
ta.setDuration(300);//动画的持续时间 毫秒值
ta.setFillAfter(true); //是否保持动画完成时的状态
return ta;
}
}
activity_main.xml<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >
<TabHost
android:id="@android:id/tabhost"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TabWidget
android:id="@android:id/tabs"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone" >
</TabWidget>
<!-- 写一个布局来替换 TabWidget 的导航功能 -->
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingTop="8dp"
android:paddingBottom="8dp"
android:background="#aaa" >
<ImageView
android:id="@+id/iv_slide_bg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/slide_background" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal" >
<!-- 第一个三分之一 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<!-- 会话标签 -->
<LinearLayout
android:id="@+id/ll_conversation"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_conversation" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="会话" />
</LinearLayout>
</LinearLayout>
<!-- 第二个三分之一 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/ll_folder"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/tab_folder" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="文件夹" />
</LinearLayout>
</LinearLayout>
<!-- 第三个三分之一 -->
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:gravity="center_horizontal"
android:orientation="horizontal" >
<LinearLayout
android:id="@+id/ll_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="vertical"
android:paddingLeft="10dp"
android:paddingRight="10dp" >
<ImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:background="@drawable/tab_group" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="群组" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<FrameLayout
android:id="@android:id/tabcontent"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</FrameLayout>
</LinearLayout>
</TabHost>
</RelativeLayout>
还需要新建三个Activity:
public class ConversationUi extends Activity{
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text= new TextView(this);
text.setText("我是会话页面");
setContentView(text);
}
}
public class FolderUi extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text= new TextView(this);
text.setText("我是文件夹页面");
setContentView(text);
}
}
public class GroupUi extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
TextView text= new TextView(this);
text.setText("我是群组页面");
setContentView(text);
}
}