模仿QQ的左右滑动切换界面的效果

暑假第四十天,在南阳,天气好闷热,幸亏下午下了一场好雨,嗯,爽啊!嘿嘿,最近四十天天宅在地下室看电脑,我的眼睛最近都有点不舒服了,哎,无语中......今天没事就来写点东西,因为功能还没有完全实现,所以效果不是太好,不过呢,还是能实现,左右滑动时候切换界面和显示QQ好友列表的简单功能!!好了,废话不多说了看看实现的过程吧!

1.首先看看布局

主布局main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" ><HorizontalScrollViewandroid:id="@+id/horizontalscrollview"android:layout_width="match_parent"android:layout_height="wrap_content"android:background="@drawable/item"android:fadingEdge="@null"android:scrollbars="none" ><LinearLayoutandroid:id="@+id/linearlayout"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal"></LinearLayout></HorizontalScrollView><android.support.v4.view.ViewPagerandroid:id="@+id/viewpaper"android:layout_width="fill_parent"android:layout_height="match_parent"android:layout_weight="1" ></android.support.v4.view.ViewPager></LinearLayout>

2,接着看看QQonline.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="fill_parent"android:layout_height="fill_parent"android:orientation="vertical" android:background="@drawable/image2"><ExpandableListView android:id="@+id/elistview"android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp"/></LinearLayout>

3.接着看看主活动的实现过程ViewPaper1Activity.java

package com.wang;import java.util.ArrayList;import android.app.ActivityGroup;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.BitmapDrawable;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.View.OnClickListener;
import android.widget.HorizontalScrollView;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.LinearLayout.LayoutParams;public class ViewPaper1Activity extends ActivityGroup implementsOnClickListener {private RadioGroup radioGroup;private String array[] = { "QQ空间", "QQ", "QQ消息" };private LinearLayout linearLayout;private ArrayList<TextView> textViews;private ViewPager viewPager;private ArrayList<View> pageViews;private HorizontalScrollView horizontalScrollView;/****初始化视图* * */void InItView() {// 构造一个新的ArrayList实例对象pageViews = new ArrayList<View>();/***   开始一个新的活动中运行的组织。 每一个活动你开始必须有一个独一无二的字符串标识与其相关联* **/View view1 = getLocalActivityManager().startActivity("main1",new Intent(this, main1.class)).getDecorView();View view2 = getLocalActivityManager().startActivity("main2",new Intent(this, QQonline.class)).getDecorView();View view3 = getLocalActivityManager().startActivity("main3",new Intent(this, main3.class)).getDecorView();// 添加指定的对象在文章末尾的ArrayList。pageViews.add(view1);pageViews.add(view2);pageViews.add(view3);}/**** 初始化话标题栏*/void InItTitle() {// 获取窗口管理器显示自定义窗口,去掉默认显示对象。得到1/3屏幕宽度int width = getWindowManager().getDefaultDisplay().getWidth() / 3;for (int i = 0; i < array.length; i++) {// 声明一个radioButton对象RadioButton radioButton = new RadioButton(this, null);radioButton.setText(array[i]);radioButton.setWidth(width);radioButton.setHeight(70);// 集水平对齐文本和垂直重力的时候将会使用有额外的空间在TextView超出要求的文本本身radioButton.setGravity(Gravity.CENTER);// 添加子视图。如果没有布局参数对孩子已经设置,默认参数对于这个ViewGroup上设置的孩子。radioGroup.addView(radioButton);}}/**** 初始化文本*/void initTextView() {// 声明一个ArrayList对象textViews = new ArrayList<TextView>();// 获取窗口管理器显示自定义窗口,去掉默认显示对象。得到1/3屏幕宽度int width = getWindowManager().getDefaultDisplay().getWidth() / 3;int height = 60;for (int i = 0; i < array.length; i++) {TextView textView = new TextView(this);textView.setText(array[i]);textView.setTextSize(17);textView.setWidth(width);textView.setHeight(height - 30);textView.setGravity(Gravity.CENTER);textView.setId(i);// 设置文本的监听事件textView.setOnClickListener(this);textViews.add(textView);LinearLayout.LayoutParams layoutParams = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);layoutParams.width = 1;layoutParams.height = height - 40;layoutParams.gravity = Gravity.CENTER;// 添加子视图。如果没有布局参数对孩子已经设置,默认参数对于这个ViewGroup上设置的孩子。linearLayout.addView(textView);}}/**** 选中后的处理*/public void select(int id) {for (int i = 0; i < array.length; i++) {if (id == i) {// 得到图片的资源Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.itembg);// 设置背景图textViews.get(id).setBackgroundDrawable(new BitmapDrawable(bitmap));viewPager.setCurrentItem(i);}else {textViews.get(i).setBackgroundDrawable(new BitmapDrawable());}}}@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 去除标题栏this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 取消状态栏,充满全屏this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);setContentView(R.layout.main);// 实例化组件linearLayout = (LinearLayout) findViewById(R.id.linearlayout);viewPager = (ViewPager) findViewById(R.id.viewpaper);horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalscrollview);// 调用方法实现initTextView();select(0);InItView();viewPager.setAdapter(new PagerAdapter() {// 得到数目public int getCount() {return pageViews.size();}@Overridepublic boolean isViewFromObject(View view, Object object) {return view == object;}@Overridepublic int getItemPosition(Object object) {// TODO Auto-generated method stubreturn super.getItemPosition(object);}@Overridepublic void destroyItem(View view, int id, Object arg2) {// TODO Auto-generated method stub((ViewPager) view).removeView(pageViews.get(id));}// 获取每一个item的id@Overridepublic Object instantiateItem(View view, int id) {((ViewPager) view).addView(pageViews.get(id));return pageViews.get(id);}});// 页面改变时候的监听事件viewPager.setOnPageChangeListener(new OnPageChangeListener() {@Overridepublic void onPageSelected(int arg0) {select(arg0);}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {}@Overridepublic void onPageScrollStateChanged(int arg0) {}});}@Overridepublic void onClick(View v) {select(v.getId());}}

4.接着看看QQonline.java 的实现

package com.wang;import android.app.Activity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.Toast;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;public class QQonline extends Activity {// 创建一个上下文菜单的方法public void onCreateContextMenu(ContextMenu menu, View v,ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);// 一个垂直滚动的两级列表。取得菜单项ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;// 获得这个类型 的位置int type = ExpandableListView.getPackedPositionType(info.packedPosition);// 取得所在组的索引int group = ExpandableListView.getPackedPositionGroup(info.packedPosition);// 取得子菜单的索引int child = ExpandableListView.getPackedPositionGroup(info.packedPosition);Toast.makeText(QQonline.this,"类型 =" + type + "  分组:" + group + "  子选项:" + child,Toast.LENGTH_LONG).show();}private ExpandableListView eListView = null;private ExpandableListAdapter adapter = null;@Overridepublic void onCreate(Bundle savedInstanceState) {// 去除标题,this.requestWindowFeature(Window.FEATURE_NO_TITLE);// 取消状态栏,充满全屏this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);super.onCreate(savedInstanceState);super.setContentView(R.layout.qqonline);// 实例化组件this.eListView = (ExpandableListView) findViewById(R.id.elistview);// 声明一个adapter对象adapter = new myExpendableadapler(this);// 设置适配器提供了数据this.eListView.setAdapter(this.adapter);//  注册一个上下文菜单显示给定的视图(多个视图可以显示上下文菜单)。super.registerForContextMenu(this.eListView);// 设置点击时候触发的事件 1,子选项点击事件 2。父选项单击事件 3.分组打开事件 4.分组关闭事件this.eListView.setOnChildClickListener(new ChildClickListener());this.eListView.setOnGroupClickListener(new GroupClickListener());this.eListView.setOnGroupExpandListener(new GroupExpandListener());this.eListView.setOnGroupCollapseListener(new GroupCollapseListener());}// /1,子选项点击事件private class ChildClickListener implements OnChildClickListener {public boolean onChildClick(ExpandableListView parent, View v,int groupPosition, int childPosition, long id) {Toast.makeText(QQonline.this,"子选项被选中,所的组:" + groupPosition + "  子选项的位置:"+ childPosition, Toast.LENGTH_LONG).show();return false;}}// 2。父选项单击事件private class GroupClickListener implements OnGroupClickListener {public boolean onGroupClick(ExpandableListView parent, View v,int groupPosition, long id) {Toast.makeText(QQonline.this, "分组选项被选中,所在组: " + groupPosition,Toast.LENGTH_LONG).show();return false;}}// 3.分组打开事件private class GroupExpandListener implements OnGroupExpandListener {public void onGroupExpand(int groupPosition) {// TODO Auto-generated method stubToast.makeText(QQonline.this, "打开分组,所在组:" + groupPosition,Toast.LENGTH_LONG).show();}}// 4.分组关闭事件private class GroupCollapseListener implements OnGroupCollapseListener {public void onGroupCollapse(int groupPosition) {Toast.makeText(QQonline.this, "关闭分组,所在组:" + groupPosition,Toast.LENGTH_LONG).show();}}}

5.接着需要myExpendableadapler.java

package com.wang;import android.content.Context;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.TextView;public class myExpendableadapler extends BaseExpandableListAdapter {// 组名称private String[] group = new String[] { "在线好友", "高中同学", "南阳理工同学", "寝室哥们" };// 子选项的名字private String[][] child = new String[][] {{ "李彦宏", "马云", "雷军", "周鸿祎", "唐骏", "赵威威", "李冕", "马海刚", "李斌", "刘洪刚","马玉龙", "刘慧敏", "王文龙" },{ "赵威威", "李冕", "马海刚", "李斌", "刘洪刚", "马玉龙", "刘慧敏", "王文龙" },{ "张紫阳", "王亚光", "刘一鸣", "崔芳芳", "董卫杰", "刘永乐" },{ "武云册", "王俊伟", "王杰", "付永振", "杜新峰", "应志超" } };private Context context = null;// 构造函数public myExpendableadapler(Context context) {this.context = context;}public Object getChild(int groupPosition, int childPosition) {return this.child[groupPosition][childPosition];}public long getChildId(int groupPosition, int childPosition) {return childPosition;}private TextView buildTextView() {// LayoutParams AbsListView扩展提供一个位置来保存视图类型。AbsListView.LayoutParams params = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 40);TextView textView = new TextView(this.context);textView.setLayoutParams(params);// 大小textView.setTextSize(15.0f);textView.setGravity(Gravity.LEFT + 3);textView.setPadding(40, 8, 3, 3);return textView;}public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {TextView textView = new TextView(this.context);// 得到每组的子选项并转换成字符串textView.setText(this.getChild(groupPosition, childPosition).toString());return textView;}// 统计子选项的个数public int getChildrenCount(int groupPosition) {// TODO Auto-generated method stubreturn this.child[groupPosition].length;}// 得到复选项的位置public Object getGroup(int groupPosition) {// TODO Auto-generated method stubreturn this.group[groupPosition];}// 得到复选项的个数public int getGroupCount() {// TODO Auto-generated method stubreturn this.group.length;}// 得到复选项的idpublic long getGroupId(int groupPosition) {// TODO Auto-generated method stubreturn groupPosition;}public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView = this.buildTextView();textView.setText(this.getGroup(groupPosition).toString());return textView;}// 是否子选项和父选项id是稳定在改变底层数据。public boolean hasStableIds() {// TODO Auto-generated method stubreturn true;}// p判断子选项是否可以选择public boolean isChildSelectable(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn true;}}

6.有两个界面还没有添加功能main1.java

package com.wang;import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;public class main1 extends Activity {protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main1);}}

7:没有添加功能的main3.java

package com.wang;import android.app.Activity;
import android.os.Bundle;
import android.widget.ImageView;public class main3 extends Activity {protected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.main3);}}

8.亲,由于用到Activity,要注意注册哦!!

  <activity android:name=".main1"></activity><activity android:name=".QQonline"></activity><activity android:name=".main3"></activity>

9.最后,还有一个重要的问题,本程序需要第三方jar包的支持,所以呢还需要导入第三方android-support-v4.jar包,不会的可以看我以前的博客

下载地址http://download.csdn.net/download/wjky2014/4467595

10,这样过后就可以看到运行效果咯: 第一张和第三张是还没有完善其上面的功能,第二张是模仿QQ在线列表,第四张是左右滑动时候的效果

仿照QQ的左右滑动切换界面的效果相关推荐

  1. Android模仿QQ的左右滑动切换界面和下拉更新的效果

    转自http://www.linuxidc.com/Linux/2012-08/67207.htm 主布局main.xml <?xml version="1.0" encod ...

  2. 模仿QQ的左右滑动切换界面和下拉更新的效果

    1.首先看看布局 主布局main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  3. QT实现滑动切换界面,ARM/Linux触屏滑动切换界面,切换Qwidget

    QT实现滑动切换界面,触屏滑动切换界面 实现思想 实现过程 完整代码 实现思想 项目中要用到ARM,要求手势滑动能够切屏,首先我们想到使用 QGestureEvent,但使用起来比较麻烦,并且个人了解 ...

  4. android切换页面上滑动动画,Android ViewPager多页面滑动切换以及动画效果

    评论 #28楼[楼主] 2012-06-01 14:27D.Winter @孤寒江雪 我猜 要么在头尾各再加入一个页卡 在页卡切换监听中判断,如果选中了头尾的页卡,就返回到相邻的那个页卡.头尾页卡的界 ...

  5. Tab页面手势滑动切换以及动画效果

    . 3张页卡之间的切换.带动画效果. 工程结构. 主要应用到android-support-v4.jar这个jar包. 布局文件. 1.main.xml中的代码 [html] <?xml ver ...

  6. html页面 tab JS滑动切换,JS+CSS实现滑动切换tab菜单效果

    本文实例讲述了JS+CSS实现滑动切换tab菜单效果.分享给大家供大家参考.具体如下: 这是风格简单的一款JS+CSS滑动门特效代码,当鼠标滑过菜单的时候,二级菜单自动切换,鼠标不需要点击,滑动门效果 ...

  7. android tab之间滑动切换界面功能

    1. onTouchListener();                       //捕捉touch事件,比如说onDown 需要将可滑动的控件加上两个方法:(1)view.setOnTouch ...

  8. react滑动切换tab动画效果_Swiper - 免费开源、功能强大的触摸滑动js特效插件

    简单配置就能实现手机.PC 网页中滑动.焦点轮播图.tab 切换和触摸导航等大部分功能. js 滑动特效插件 Swiper 是一款纯 javascript 打造的滑动特效插件,主要用对移动端 web ...

  9. react滑动切换tab动画效果_[React Native]react-native-scrollable-tab-view(入门篇)

    官方为我们提供的Tab控制器有两种: TabBarIOS,仅适用于IOS平台 ViewPagerAndroid,仅适用于Android平台(严格来讲并不算,因为我们还需要自己实现Tab) 如果我们需要 ...

最新文章

  1. Python经典面试题100道(附PDF下载地址)
  2. 安全之美(英文影印版)
  3. 三天打工生活终于结束了
  4. binlog二进制文件解析
  5. geth访问节点_以太坊客户端Geth控制台使用及 Web3.js 使用实战
  6. 弹出taskeng.exe窗口的解决方法
  7. 二叉查找树转换成有序的双向链表
  8. oracle计算1到一百偶数的和,Perl 打印在1..100内所有偶数和奇数
  9. C语言中全局变量和局部变量,作用域与生命周期的相关问题。
  10. python装饰器不错的教程
  11. 如何避免面试现场被虐?
  12. 3D MAX导出插件编写
  13. Spring注入静态类型
  14. array 删除指定的元素的方法
  15. [转]关于java的动态代理
  16. c# 用SqlParameter实现多字段模糊查询
  17. OCSNG inventory | 介绍
  18. Matlab 画热力图(heat-map)
  19. 用狼的处世哲学做SOHO(一)
  20. TX2 用文件IO的方式操作GPIO

热门文章

  1. 视觉SLAM十四讲:第3讲 三维空间刚体运动
  2. Python 3 怎么快速搭建服务器
  3. maven学习笔记【二】私服Nexus
  4. 郑莉版java第三章答案_java语言程序设计(郑莉)第七章课后习题答案.docx
  5. 手动搭建 React 项目
  6. Gephi学习笔记-画出图形基本流程
  7. 米家扫拖一体机器人重置键_如何评价小米米家扫拖一体机器人?
  8. S1到S9,545名职业选手,有多少人折戟全球总决赛?
  9. 团队-团队编程项目作业名称-团队信息
  10. 几款主流浏览器的简单比对实验,360极速最适合我