Android UI开发第六篇——仿QQ的滑动Tab

简介:

 

代码下载地址:http://www.devdiv.com/thread-101454-1-1.html

使用了ActivityGroup。

 
  1. public class MainActivity extends ActivityGroup { 
  2.  
  3.  
  4.  
  5.  
  6.      private RelativeLayout layout; 
  7.  
  8.      
  9.  
  10.      private RelativeLayout layout1; 
  11.  
  12.      private RelativeLayout layout2; 
  13.  
  14.      private RelativeLayout layout3; 
  15.  
  16.      
  17.  
  18.      private RelativeLayout bodylayout; 
  19.  
  20.      
  21.  
  22.      private ImageView tab1; 
  23.  
  24.      private ImageView tab2; 
  25.  
  26.      private ImageView tab3; 
  27.  
  28.      
  29.  
  30.      private ImageView first; 
  31.  
  32.      private int current = 1//默认选中第一个,可以动态的改变此参数值 
  33.  
  34.      
  35.  
  36.      public void onCreate(Bundle savedInstanceState) { 
  37.  
  38.          super.onCreate(savedInstanceState); 
  39.  
  40.          setContentView(R.layout.main); 
  41.  
  42.          initUI(); 
  43.  
  44.      } 
  45.  
  46.      
  47.  
  48.      private void initUI(){ 
  49.  
  50.          layout = (RelativeLayout) findViewById(R.id.root); 
  51.  
  52.          
  53.  
  54.          layout1 = (RelativeLayout) findViewById(R.id.layout1); 
  55.  
  56.          layout2 = (RelativeLayout) findViewById(R.id.layout2); 
  57.  
  58.          layout3 = (RelativeLayout) findViewById(R.id.layout3); 
  59.  
  60.          bodylayout = (RelativeLayout) findViewById(R.id.bodylayout); 
  61.  
  62.          
  63.  
  64.          tab1 = (ImageView) findViewById(R.id.tab1); 
  65.  
  66.          tab1.setOnClickListener(onClickListener); 
  67.  
  68.          tab2 = (ImageView) findViewById(R.id.tab2); 
  69.  
  70.          tab2.setOnClickListener(onClickListener); 
  71.  
  72.          tab3 = (ImageView) findViewById(R.id.tab3); 
  73.  
  74.          tab3.setOnClickListener(onClickListener); 
  75.  
  76.          
  77.  
  78.          RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
  79.  
  80.          rl.addRule(RelativeLayout.CENTER_IN_PARENT, RelativeLayout.TRUE); 
  81.  
  82.          first = new ImageView(this); 
  83.  
  84.          first.setTag("first"); 
  85.  
  86.          first.setImageResource(R.drawable.topbar_select); 
  87.  
  88.          
  89.  
  90.          // 默认选中项 
  91.  
  92.          switch (current) { 
  93.  
  94.          case 1
  95.  
  96.              layout1.addView(first, rl); 
  97.  
  98.              current = R.id.tab1; 
  99.  
  100.              break
  101.  
  102.          case 2
  103.  
  104.              layout2.addView(first, rl); 
  105.  
  106.              current = R.id.tab2; 
  107.  
  108.              break
  109.  
  110.          case 3
  111.  
  112.              layout3.addView(first, rl); 
  113.  
  114.              current = R.id.tab3; 
  115.  
  116.              break
  117.  
  118.          default
  119.  
  120.              break
  121.  
  122.          } 
  123.  
  124.          View view = getLocalActivityManager().startActivity("index"
  125.  
  126.                  new Intent(MainActivity.this, Tab1.class)) 
  127.  
  128.                  .getDecorView(); 
  129.  
  130.          bodylayout.addView(view); 
  131.  
  132.          
  133.  
  134.      } 
  135.  
  136.  
  137.  
  138.  
  139.      private boolean isAdd = false// 是否添加过 top_select 
  140.  
  141.      private int select_width; // top_select_width 
  142.  
  143.      private int select_height; // top_select_height 
  144.  
  145.      private int firstLeft; // 第一次添加后的左边距***** 
  146.  
  147.      private int startLeft; // 起始左边距 
  148.  
  149.      
  150.  
  151.      // 添加一个view,移除一个view 
  152.  
  153.      private void replace() { 
  154.  
  155.          switch (current) { 
  156.  
  157.          case R.id.tab1: 
  158.  
  159.              changeTop(layout1); 
  160.  
  161.              break
  162.  
  163.          case R.id.tab2: 
  164.  
  165.              changeTop(layout2); 
  166.  
  167.              break
  168.  
  169.          case R.id.tab3: 
  170.  
  171.              changeTop(layout3); 
  172.  
  173.              break
  174.  
  175.          default
  176.  
  177.              break
  178.  
  179.          } 
  180.  
  181.      } 
  182.  
  183.      
  184.  
  185.      private void changeTop(RelativeLayout relativeLayout){ 
  186.  
  187.          ImageView old = (ImageView) relativeLayout.findViewWithTag("first");; 
  188.  
  189.          select_width = old.getWidth(); 
  190.  
  191.          select_height = old.getHeight(); 
  192.  
  193.          
  194.  
  195.          RelativeLayout.LayoutParams rl = new RelativeLayout.LayoutParams(select_width, select_height); 
  196.  
  197.          rl.leftMargin = old.getLeft() + ((RelativeLayout)old.getParent()).getLeft(); 
  198.  
  199.          rl.topMargin = old.getTop() + ((RelativeLayout)old.getParent()).getTop(); 
  200.  
  201.          
  202.  
  203.          // 获取起始位置 
  204.  
  205.          firstLeft = old.getLeft() + ((RelativeLayout)old.getParent()).getLeft(); 
  206.  
  207.          
  208.  
  209.          ImageView iv = new ImageView(this); 
  210.  
  211.          iv.setTag("move"); 
  212.  
  213.          iv.setImageResource(R.drawable.topbar_select); 
  214.  
  215.          
  216.  
  217.          layout.addView(iv , rl); 
  218.  
  219.          relativeLayout.removeView(old); 
  220.  
  221.      } 
  222.  
  223.      
  224.  
  225.      private OnClickListener onClickListener = new OnClickListener(){ 
  226.  
  227.          public void onClick(View v) { 
  228.  
  229.              if(!isAdd){ 
  230.  
  231.                  replace(); // 初次使用移除old 添加新的top_select为RelativeLayout所使用 
  232.  
  233.                  isAdd = true
  234.  
  235.              } 
  236.  
  237.              
  238.  
  239.              ImageView top_select = (ImageView) layout.findViewWithTag("move"); 
  240.  
  241.              int tabLeft; 
  242.  
  243.              int endLeft = 0
  244.  
  245.              
  246.  
  247.              boolean run = false
  248.  
  249.  
  250.  
  251.  
  252.              switch (v.getId()) { 
  253.  
  254.              case R.id.tab1: 
  255.  
  256.                  if (current != R.id.tab1) { 
  257.  
  258.                      // 中心位置 
  259.  
  260.                      tabLeft = ((RelativeLayout) tab1.getParent()).getLeft() + tab1.getLeft() + tab1.getWidth() / 2
  261.  
  262.                      // 最终位置 
  263.  
  264.                      endLeft = tabLeft - select_width / 2
  265.  
  266.                      current = R.id.tab1; 
  267.  
  268.                      run = true
  269.  
  270.                      bodylayout.removeAllViews(); 
  271.  
  272.                      View view = getLocalActivityManager().startActivity("index"
  273.  
  274.                              new Intent(MainActivity.this, Tab1.class)) 
  275.  
  276.                              .getDecorView(); 
  277.  
  278.                      bodylayout.addView(view); 
  279.  
  280.                  } 
  281.  
  282.                  break
  283.  
  284.              case R.id.tab2: 
  285.  
  286.                  if (current != R.id.tab2) { 
  287.  
  288.                      tabLeft = ((RelativeLayout) tab2.getParent()).getLeft() + tab2.getLeft() + tab2.getWidth() / 2
  289.  
  290.                      endLeft = tabLeft - select_width / 2
  291.  
  292.                      current = R.id.tab2; 
  293.  
  294.                      run = true
  295.  
  296.                      bodylayout.removeAllViews(); 
  297.  
  298.                      View view = getLocalActivityManager().startActivity("index"
  299.  
  300.                              new Intent(MainActivity.this, Tab2.class)) 
  301.  
  302.                              .getDecorView(); 
  303.  
  304.                      bodylayout.addView(view); 
  305.  
  306.                  } 
  307.  
  308.                  break
  309.  
  310.              case R.id.tab3: 
  311.  
  312.                  if (current != R.id.tab3) { 
  313.  
  314.                      tabLeft = ((RelativeLayout) tab3.getParent()).getLeft() + tab3.getLeft() + tab3.getWidth() / 2
  315.  
  316.                      endLeft = tabLeft - select_width/2
  317.  
  318.                      current = R.id.tab3; 
  319.  
  320.                      run = true
  321.  
  322.                      bodylayout.removeAllViews(); 
  323.  
  324.                      View view = getLocalActivityManager().startActivity("index"
  325.  
  326.                              new Intent(MainActivity.this, Tab3.class)) 
  327.  
  328.                              .getDecorView(); 
  329.  
  330.                      bodylayout.addView(view); 
  331.  
  332.                  } 
  333.  
  334.                  break
  335.  
  336.              default
  337.  
  338.                  break
  339.  
  340.              } 
  341.  
  342.              
  343.  
  344.              if(run){ 
  345.  
  346.                  TranslateAnimation animation = new TranslateAnimation(startLeft, endLeft - firstLeft, 00); 
  347.  
  348.                  startLeft = endLeft - firstLeft; // 重新设定起始位置 
  349.  
  350.                  animation.setDuration(400); 
  351.  
  352.                  animation.setFillAfter(true); 
  353.  
  354.                  top_select.bringToFront(); 
  355.  
  356.                  top_select.startAnimation(animation); 
  357.  
  358.              } 
  359.  
  360.              
  361.  
  362.          } 
  363.  
  364.  
  365.  
  366.  
  367.      }; 
  368.  
  369.  
  370.  
  371.  

 

 
  1. <?xml version="1.0" encoding="utf-8"?> 
  2.  
  3. <RelativeLayout  
  4.  
  5.      xmlns:android="http://schemas.android.com/apk/res/android" 
  6.  
  7.      android:id="@+id/root" 
  8.  
  9.      android:layout_width="fill_parent"  
  10.  
  11.      android:layout_height="fill_parent"  
  12.  
  13.      > 
  14.  
  15.      <LinearLayout  
  16.  
  17.          android:orientation="vertical" 
  18.  
  19.          android:layout_width="fill_parent"  
  20.  
  21.          android:layout_height="fill_parent"  
  22.  
  23.          android:background="@drawable/default_bg" 
  24.  
  25.          > 
  26.  
  27.          <LinearLayout  
  28.  
  29.              android:orientation="horizontal" 
  30.  
  31.              android:layout_width="fill_parent"  
  32.  
  33.              android:layout_height="fill_parent"  
  34.  
  35.              android:layout_weight="6.0" 
  36.  
  37.              > 
  38.  
  39.              <RelativeLayout  
  40.  
  41.                  android:id="@+id/layout1" 
  42.  
  43.                  android:layout_width="fill_parent"  
  44.  
  45.                  android:layout_height="wrap_content"  
  46.  
  47.                  android:layout_weight="1.0" 
  48.  
  49.                  android:layout_gravity="center_vertical" 
  50.  
  51.                  > 
  52.  
  53.                  <ImageView 
  54.  
  55.                      android:id="@+id/tab1" 
  56.  
  57.                      android:layout_width="wrap_content"  
  58.  
  59.                      android:layout_height="wrap_content"  
  60.  
  61.                      android:src="@drawable/tab1" 
  62.  
  63.                      android:layout_centerInParent="true" 
  64.  
  65.                      /> 
  66.  
  67.              </RelativeLayout> 
  68.  
  69.              <RelativeLayout  
  70.  
  71.                  android:id="@+id/layout2" 
  72.  
  73.                  android:layout_width="fill_parent"  
  74.  
  75.                  android:layout_height="wrap_content"  
  76.  
  77.                  android:layout_weight="1.0" 
  78.  
  79.                  android:layout_gravity="center_vertical" 
  80.  
  81.                  > 
  82.  
  83.                  <ImageView 
  84.  
  85.                      android:id="@+id/tab2" 
  86.  
  87.                      android:layout_width="wrap_content"  
  88.  
  89.                      android:layout_height="wrap_content"  
  90.  
  91.                      android:src="@drawable/tab2" 
  92.  
  93.                      android:layout_centerInParent="true" 
  94.  
  95.                      /> 
  96.  
  97.              </RelativeLayout> 
  98.  
  99.              <RelativeLayout  
  100.  
  101.                  android:id="@+id/layout3" 
  102.  
  103.                  android:layout_width="fill_parent"  
  104.  
  105.                  android:layout_height="wrap_content"  
  106.  
  107.                  android:layout_weight="1.0" 
  108.  
  109.                  android:layout_gravity="center_vertical" 
  110.  
  111.                  > 
  112.  
  113.                  <ImageView 
  114.  
  115.                      android:id="@+id/tab3" 
  116.  
  117.                      android:layout_width="wrap_content"  
  118.  
  119.                      android:layout_height="wrap_content"  
  120.  
  121.                      android:src="@drawable/tab3" 
  122.  
  123.                      android:layout_centerInParent="true" 
  124.  
  125.                      /> 
  126.  
  127.              </RelativeLayout> 
  128.  
  129.          </LinearLayout> 
  130.  
  131.          <RelativeLayout  
  132.  
  133.              android:orientation="horizontal" 
  134.  
  135.              android:layout_width="fill_parent"  
  136.  
  137.              android:layout_height="fill_parent"  
  138.  
  139.              android:layout_weight="1.0" 
  140.  
  141.              android:background="#ffffff" 
  142.  
  143.              android:gravity="center" 
  144.  
  145.              android:id="@+id/bodylayout" 
  146.  
  147.              > 
  148.  
  149.              
  150.  
  151.          </RelativeLayout> 
  152.  
  153.      </LinearLayout> 
  154.  
  155. </RelativeLayout> 

本文转自xyz_lmn51CTO博客,原文链接:http://blog.51cto.com/xyzlmn/817371 ,如需转载请自行联系原作者


相关文章
|
3天前
|
Linux 编译器 Android开发
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
在Linux环境下,本文指导如何交叉编译x265的so库以适应Android。首先,需安装cmake和下载android-ndk-r21e。接着,下载x265源码,修改crosscompile.cmake的编译器设置。配置x265源码,使用指定的NDK路径,并在配置界面修改相关选项。随后,修改编译规则,编译并安装x265,调整pc描述文件并更新PKG_CONFIG_PATH。最后,修改FFmpeg配置脚本启用x265支持,编译安装FFmpeg,将生成的so文件导入Android工程,调整gradle配置以确保顺利运行。
24 1
FFmpeg开发笔记(九)Linux交叉编译Android的x265库
|
11天前
|
编解码 Android开发 UED
安卓UI/UX设计原则:打造引人入胜的用户体验
【4月更文挑战第13天】本文探讨了安卓UI/UX设计的关键原则,包括一致性、简洁性、反馈、清晰性、效率和适应性。一致性要求视觉和行为保持一致,利用系统UI;简洁性减少用户行动,简化导航;反馈需即时且明确;清晰性强调表达清晰,布局有序;效率关注性能优化和任务简化;适应性涉及多设备适配和用户多样性。遵循这些原则,可创建出色应用,提供无缝用户体验。设计应持续迭代,适应技术发展和用户需求。
|
15天前
|
XML 移动开发 Android开发
构建高效安卓应用:采用Jetpack Compose实现动态UI
【4月更文挑战第10天】 在现代移动开发中,用户界面的流畅性和响应性对于应用的成功至关重要。随着技术的不断进步,安卓开发者寻求更加高效和简洁的方式来构建动态且吸引人的UI。本文将深入探讨Jetpack Compose这一革新性技术,它通过声明式编程模型简化了UI构建过程,并提升了性能与跨平台开发的可行性。我们将从基本概念出发,逐步解析如何利用Jetpack Compose来创建具有数据动态绑定能力的安卓应用,同时确保应用的高性能和良好用户体验。
15 0
|
16天前
|
XML Java Android开发
Android之UI基础控件
Android之UI基础控件
|
17天前
|
XML 开发工具 Android开发
构建高效的安卓应用:使用Jetpack Compose优化UI开发
【4月更文挑战第7天】 随着Android开发不断进化,开发者面临着提高应用性能与简化UI构建流程的双重挑战。本文将探讨如何使用Jetpack Compose这一现代UI工具包来优化安卓应用的开发流程,并提升用户界面的流畅性与一致性。通过介绍Jetpack Compose的核心概念、与传统方法的区别以及实际集成步骤,我们旨在提供一种高效且可靠的解决方案,以帮助开发者构建响应迅速且用户体验优良的安卓应用。
|
1月前
|
前端开发 搜索推荐 开发者
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
SAP UI5 sap.m.Column 控件的 minScreenWidth 属性介绍
27 0
|
1月前
|
JavaScript 前端开发 开发者
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
SAP UI5 控件 sap.m.ListBase 的 inset 属性的作用介绍
15 0
|
1月前
|
前端开发 JavaScript API
SAP UI5 sap.ui.require.toUrl 的作用介绍
SAP UI5 sap.ui.require.toUrl 的作用介绍
28 0
|
1月前
|
JSON 前端开发 测试技术
SAP UI5 sap.ui.core.util.MockServer.simulate 方法介绍
SAP UI5 sap.ui.core.util.MockServer.simulate 方法介绍
21 0
|
1月前
使用 SAP UI5 Event Bus 机制,修复 SAP UI5 分页显示数据的一个 bug 试读版
使用 SAP UI5 Event Bus 机制,修复 SAP UI5 分页显示数据的一个 bug 试读版
20 0