Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Android模仿QQ的左右滑动切换界面和下拉更新的效果

因为功能还没有完全实现,所以效果不是太好,不过呢,还是能实现,左右滑动时候切换界面和显示QQ好友列表的简单功能!!好了,废话不多说了看看实现的过程吧!1.首先看看布局主布局main.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical" >  
  6.   
  7.     <HorizontalScrollView  
  8.         android:id="@+id/horizontalscrollview"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="wrap_content"  
  11.         android:background="@drawable/item"  
  12.         android:fadingEdge="@null"  
  13.         android:scrollbars="none" >  
  14.   
  15.         <LinearLayout  
  16.             android:id="@+id/linearlayout"  
  17.             android:layout_width="match_parent"  
  18.             android:layout_height="match_parent"  
  19.             android:orientation="horizontal"  
  20.             >  
  21.         </LinearLayout>  
  22.     </HorizontalScrollView>  
  23.   
  24.     <android.support.v4.view.ViewPager  
  25.         android:id="@+id/viewpaper"  
  26.         android:layout_width="fill_parent"  
  27.         android:layout_height="match_parent"  
  28.         android:layout_weight="1" >  
  29.     </android.support.v4.view.ViewPager>  
  30.   
  31. </LinearLayout>  
2,接着看看QQonline.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"   
  6.     android:background="@drawable/image2">  
  7.   
  8.       
  9. <ExpandableListView   
  10.     android:id="@+id/elistview"  
  11.     android:layout_width="fill_parent"   
  12.     android:layout_height="wrap_content"   
  13.     android:layout_marginLeft="5dp"  
  14.      
  15.       
  16.     />  
  17.   
  18. </LinearLayout>  
3.接着看看下拉更新的布局pullrefresh.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@drawable/image1"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <com.wang.pullrefresh.MyListView  
  9.         android:id="@+id/listView"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="fill_parent" />  
  12.   
  13.   
  14. </LinearLayout>  
4.下拉更新过程实现的布局refresh.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="wrap_content" >  
  5.   
  6.     <RelativeLayout  
  7.         android:id="@+id/head_contentLayout"  
  8.         android:layout_width="fill_parent"  
  9.         android:layout_height="wrap_content"  
  10.         android:paddingLeft="30dp" >  
  11.   
  12.         <FrameLayout  
  13.             android:layout_width="wrap_content"  
  14.             android:layout_height="wrap_content"  
  15.             android:layout_alignParentLeft="true"  
  16.             android:layout_centerVertical="true" >  
  17.   
  18.             <ImageView  
  19.                 android:id="@+id/head_arrowImageView"  
  20.                 android:layout_width="wrap_content"  
  21.                 android:layout_height="wrap_content"  
  22.                 android:layout_gravity="center"  
  23.                 android:src="@drawable/down" />  
  24.   
  25.             <ProgressBar  
  26.                 android:id="@+id/head_progressBar"  
  27.                 style="?android:attr/progressBarStyleSmall"  
  28.                 android:layout_width="wrap_content"  
  29.                 android:layout_height="wrap_content"  
  30.                 android:layout_gravity="center"  
  31.                 android:visibility="gone" />  
  32.         </FrameLayout>  
  33.   
  34.         <LinearLayout  
  35.             android:layout_width="wrap_content"  
  36.             android:layout_height="wrap_content"  
  37.             android:layout_centerHorizontal="true"  
  38.             android:gravity="center_horizontal"  
  39.             android:orientation="vertical" >  
  40.   
  41.             <TextView  
  42.                 android:id="@+id/head_tipsTextView"  
  43.                 android:layout_width="wrap_content"  
  44.                 android:layout_height="wrap_content"  
  45.                 android:text="下拉可以刷新"  
  46.                 android:textSize="15dp" />  
  47.   
  48.             <TextView  
  49.                 android:id="@+id/head_lastUpdatedTextView"  
  50.                 android:layout_width="wrap_content"  
  51.                 android:layout_height="wrap_content"  
  52.                 android:text="上次更新时间:"  
  53.                 android:textSize="12dp" />  
  54.         </LinearLayout>  
  55.     </RelativeLayout>  
  56.   
  57. </LinearLayout>  
5.下拉更新的列表显示的布局list_item.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="wrap_content"  
  5.     android:gravity="center_vertical"  
  6.     android:orientation="horizontal" >  
  7.   
  8.     <ImageView  
  9.         android:id="@+id/imageView_item"  
  10.         android:layout_width="60dp"  
  11.         android:layout_height="60dp"  
  12.         android:layout_marginLeft="5dp"  
  13.         android:src="@drawable/qq" />  
  14.   
  15.     <TextView  
  16.         android:id="@+id/textView_item"  
  17.         android:layout_width="wrap_content"  
  18.         android:layout_height="wrap_content"  
  19.         android:layout_marginLeft="10dp"  
  20.         android:textColor="#FFFFFF"  
  21.         />  
  22.   
  23. </LinearLayout>  
6.接着看看还没有完善的QQ聊天信息的布局main3.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:orientation="vertical"   
  6.     android:background="@drawable/image3">  
  7.   
  8.        
  9.   
  10. </LinearLayout>  
7.接着看看主活动的实现过程ViewPaper1Activity.java
  1. package com.wang;  
  2.   
  3. import java.util.ArrayList;  
  4.   
  5. import android.app.ActivityGroup;  
  6. import android.content.Intent;  
  7. import android.graphics.Bitmap;  
  8. import android.graphics.BitmapFactory;  
  9. import android.graphics.drawable.BitmapDrawable;  
  10. import android.os.Bundle;  
  11. import android.support.v4.view.PagerAdapter;  
  12. import android.support.v4.view.ViewPager;  
  13. import android.support.v4.view.ViewPager.OnPageChangeListener;  
  14. import android.view.Gravity;  
  15. import android.view.View;  
  16. import android.view.Window;  
  17. import android.view.WindowManager;  
  18. import android.view.View.OnClickListener;  
  19. import android.widget.HorizontalScrollView;  
  20. import android.widget.LinearLayout;  
  21. import android.widget.RadioButton;  
  22. import android.widget.RadioGroup;  
  23. import android.widget.TextView;  
  24. import android.widget.LinearLayout.LayoutParams;  
  25.   
  26. public class ViewPaper1Activity extends ActivityGroup implements  
  27.         OnClickListener {  
  28.     private RadioGroup radioGroup;  
  29.   
  30.     private String array[] = { "QQ空间""QQ""QQ消息" };  
  31.     private LinearLayout linearLayout;  
  32.     private ArrayList<TextView> textViews;  
  33.     private ViewPager viewPager;  
  34.     private ArrayList<View> pageViews;  
  35.     private HorizontalScrollView horizontalScrollView;  
  36.   
  37.     /*** 
  38.      *初始化视图 
  39.      *  
  40.      *  
  41.      */  
  42.     void InItView() {  
  43.         // 构造一个新的ArrayList实例对象   
  44.         pageViews = new ArrayList<View>();  
  45.         /** 
  46.          *  开始一个新的活动中运行的组织。 每一个活动你开始必须有一个独一无二的字符串标识与其相关联 
  47.          * **/  
  48.         View view1 = getLocalActivityManager().startActivity("main1",  
  49.                 new Intent(this, pullrefreshtest.class)).getDecorView();  
  50.         View view2 = getLocalActivityManager().startActivity("main2",  
  51.                 new Intent(this, QQonline.class)).getDecorView();  
  52.         View view3 = getLocalActivityManager().startActivity("main3",  
  53.                 new Intent(this, main3.class)).getDecorView();  
  54.         // 添加指定的对象在文章末尾的ArrayList。   
  55.         pageViews.add(view1);  
  56.         pageViews.add(view2);  
  57.         pageViews.add(view3);  
  58.     }  
  59.   
  60.     /*** 
  61.      * 初始化话标题栏 
  62.      */  
  63.     void InItTitle() {  
  64.         // 获取窗口管理器显示自定义窗口,去掉默认显示对象。得到1/3屏幕宽度   
  65.         int width = getWindowManager().getDefaultDisplay().getWidth() / 3;  
  66.   
  67.         for (int i = 0; i < array.length; i++) {  
  68.             // 声明一个radioButton对象   
  69.             RadioButton radioButton = new RadioButton(thisnull);  
  70.             radioButton.setText(array[i]);  
  71.             radioButton.setWidth(width);  
  72.             radioButton.setHeight(70);  
  73.             // 集水平对齐文本和垂直重力的时候将会使用有额外的空间在TextView超出要求的文本本身   
  74.             radioButton.setGravity(Gravity.CENTER);  
  75.             // 添加子视图。如果没有布局参数对孩子已经设置,默认参数对于这个ViewGroup上设置的孩子。   
  76.             radioGroup.addView(radioButton);  
  77.         }  
  78.     }  
  79.   
  80.     /*** 
  81.      * 初始化文本 
  82.      */  
  83.     void initTextView() {  
  84.         // 声明一个ArrayList对象   
  85.         textViews = new ArrayList<TextView>();  
  86.         // 获取窗口管理器显示自定义窗口,去掉默认显示对象。得到1/3屏幕宽度   
  87.         int width = getWindowManager().getDefaultDisplay().getWidth() / 3;  
  88.         int height = 60;  
  89.         for (int i = 0; i < array.length; i++) {  
  90.             TextView textView = new TextView(this);  
  91.             textView.setText(array[i]);  
  92.             textView.setTextSize(17);  
  93.             textView.setWidth(width);  
  94.             textView.setHeight(height - 30);  
  95.             textView.setGravity(Gravity.CENTER);  
  96.             textView.setId(i);  
  97.             // 设置文本的监听事件   
  98.             textView.setOnClickListener(this);  
  99.             textViews.add(textView);  
  100.             LinearLayout.LayoutParams layoutParams = new LayoutParams(  
  101.                     LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  102.             layoutParams.width = 1;  
  103.             layoutParams.height = height - 40;  
  104.             layoutParams.gravity = Gravity.CENTER;  
  105.             // 添加子视图。如果没有布局参数对孩子已经设置,默认参数对于这个ViewGroup上设置的孩子。   
  106.             linearLayout.addView(textView);  
  107.   
  108.         }  
  109.     }  
  110.   
  111.     /*** 
  112.      * 选中后的处理 
  113.      */  
  114.     public void select(int id) {  
  115.         for (int i = 0; i < array.length; i++) {  
  116.             if (id == i) {  
  117.                 // 得到图片的资源   
  118.                 Bitmap bitmap = BitmapFactory.decodeResource(getResources(),  
  119.                         R.drawable.itembg);  
  120.                 // 设置背景图   
  121.                 textViews.get(id).setBackgroundDrawable(  
  122.                         new BitmapDrawable(bitmap));  
  123.                 viewPager.setCurrentItem(i);  
  124.             }  
  125.   
  126.             else {  
  127.                 textViews.get(i).setBackgroundDrawable(new BitmapDrawable());  
  128.             }  
  129.         }  
  130.     }  
  131.   
  132.     @Override  
  133.     public void onCreate(Bundle savedInstanceState) {  
  134.         super.onCreate(savedInstanceState);  
  135.         // 去除标题栏   
  136.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  137.         // 取消状态栏,充满全屏   
  138.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  139.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  140.   
  141.         setContentView(R.layout.main);  
  142.         // 实例化组件   
  143.         linearLayout = (LinearLayout) findViewById(R.id.linearlayout);  
  144.         viewPager = (ViewPager) findViewById(R.id.viewpaper);  
  145.         horizontalScrollView = (HorizontalScrollView) findViewById(R.id.horizontalscrollview);  
  146.         // 调用方法实现   
  147.         initTextView();  
  148.         select(0);  
  149.         InItView();  
  150.   
  151.         viewPager.setAdapter(new PagerAdapter() {  
  152.             // 得到数目   
  153.             public int getCount() {  
  154.                 return pageViews.size();  
  155.             }  
  156.   
  157.             @Override  
  158.             public boolean isViewFromObject(View view, Object object) {  
  159.                 return view == object;  
  160.             }  
  161.   
  162.             @Override  
  163.             public int getItemPosition(Object object) {  
  164.                 // TODO Auto-generated method stub   
  165.                 return super.getItemPosition(object);  
  166.             }  
  167.   
  168.             @Override  
  169.             public void destroyItem(View view, int id, Object arg2) {  
  170.                 // TODO Auto-generated method stub   
  171.                 ((ViewPager) view).removeView(pageViews.get(id));  
  172.             }  
  173.   
  174.             // 获取每一个item的id   
  175.             @Override  
  176.             public Object instantiateItem(View view, int id) {  
  177.                 ((ViewPager) view).addView(pageViews.get(id));  
  178.                 return pageViews.get(id);  
  179.             }  
  180.   
  181.         });  
  182.         // 页面改变时候的监听事件   
  183.         viewPager.setOnPageChangeListener(new OnPageChangeListener() {  
  184.   
  185.             @Override  
  186.             public void onPageSelected(int arg0) {  
  187.                 select(arg0);  
  188.             }  
  189.   
  190.             @Override  
  191.             public void onPageScrolled(int arg0, float arg1, int arg2) {  
  192.   
  193.             }  
  194.   
  195.             @Override  
  196.             public void onPageScrollStateChanged(int arg0) {  
  197.   
  198.             }  
  199.         });  
  200.     }  
  201.   
  202.     @Override  
  203.     public void onClick(View v) {  
  204.         select(v.getId());  
  205.     }  
  206.   
  207. }  
8.接着看看QQonline.java 的实现
  1. package com.wang;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.ContextMenu;  
  6. import android.view.View;  
  7. import android.view.Window;  
  8. import android.view.WindowManager;  
  9. import android.view.ContextMenu.ContextMenuInfo;  
  10. import android.widget.ExpandableListAdapter;  
  11. import android.widget.ExpandableListView;  
  12. import android.widget.Toast;  
  13. import android.widget.ExpandableListView.OnChildClickListener;  
  14. import android.widget.ExpandableListView.OnGroupClickListener;  
  15. import android.widget.ExpandableListView.OnGroupCollapseListener;  
  16. import android.widget.ExpandableListView.OnGroupExpandListener;  
  17.   
  18. public class QQonline extends Activity {  
  19.     // 创建一个上下文菜单的方法   
  20.     public void onCreateContextMenu(ContextMenu menu, View v,  
  21.             ContextMenuInfo menuInfo) {  
  22.   
  23.         super.onCreateContextMenu(menu, v, menuInfo);  
  24.   
  25.         // 一个垂直滚动的两级列表。取得菜单项   
  26.         ExpandableListView.ExpandableListContextMenuInfo info = (ExpandableListView.ExpandableListContextMenuInfo) menuInfo;  
  27.         // 获得这个类型 的位置   
  28.         int type = ExpandableListView  
  29.                 .getPackedPositionType(info.packedPosition);  
  30.         // 取得所在组的索引   
  31.         int group = ExpandableListView  
  32.                 .getPackedPositionGroup(info.packedPosition);  
  33.         // 取得子菜单的索引   
  34.         int child = ExpandableListView  
  35.                 .getPackedPositionGroup(info.packedPosition);  
  36.   
  37.         Toast.makeText(QQonline.this,  
  38.                 "类型 =" + type + "  分组:" + group + "  子选项:" + child,  
  39.                 Toast.LENGTH_LONG).show();  
  40.   
  41.     }  
  42.   
  43.     private ExpandableListView eListView = null;  
  44.     private ExpandableListAdapter adapter = null;  
  45.   
  46.     @Override  
  47.     public void onCreate(Bundle savedInstanceState) {  
  48.   
  49.         // 去除标题,   
  50.         this.requestWindowFeature(Window.FEATURE_NO_TITLE);  
  51.         // 取消状态栏,充满全屏   
  52.         this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,  
  53.                 WindowManager.LayoutParams.FLAG_FULLSCREEN);  
  54.   
  55.         super.onCreate(savedInstanceState);  
  56.         super.setContentView(R.layout.qqonline);  
  57.   
  58.         // 实例化组件   
  59.         this.eListView = (ExpandableListView) findViewById(R.id.elistview);  
  60.   
  61.         // 声明一个adapter对象   
  62.         adapter = new myExpendableadapler(this);  
  63.         // 设置适配器提供了数据   
  64.         this.eListView.setAdapter(this.adapter);  
  65.   
  66.         //  注册一个上下文菜单显示给定的视图(多个视图可以显示上下文菜单)。   
  67.         super.registerForContextMenu(this.eListView);  
  68.   
  69.         // 设置点击时候触发的事件 1,子选项点击事件 2。父选项单击事件 3.分组打开事件 4.分组关闭事件   
  70.         this.eListView.setOnChildClickListener(new ChildClickListener());  
  71.         this.eListView.setOnGroupClickListener(new GroupClickListener());  
  72.         this.eListView.setOnGroupExpandListener(new GroupExpandListener());  
  73.         this.eListView.setOnGroupCollapseListener(new GroupCollapseListener());  
  74.   
  75.     }  
  76.   
  77.     // /1,子选项点击事件   
  78.     private class ChildClickListener implements OnChildClickListener {  
  79.   
  80.         public boolean onChildClick(ExpandableListView parent, View v,  
  81.                 int groupPosition, int childPosition, long id) {  
  82.             Toast  
  83.                     .makeText(  
  84.                             QQonline.this,  
  85.                             "子选项被选中,所的组:" + groupPosition + "  子选项的位置:"  
  86.                                     + childPosition, Toast.LENGTH_LONG).show();  
  87.             return false;  
  88.         }  
  89.   
  90.     }  
  91.   
  92.     // 2。父选项单击事件   
  93.     private class GroupClickListener implements OnGroupClickListener {  
  94.   
  95.         public boolean onGroupClick(ExpandableListView parent, View v,  
  96.                 int groupPosition, long id) {  
  97. &n