仿网易新闻效果源码分析

原博客地址:http://blog.csdn.net/lilu_leo/article/details/8158128

==================================================================================================================================

一直想知道这种效果到底是如何做出来的,直到看到代码,原来还是动画。从网上找了两份代码,原理基本相同,两份代码中应该有相互参考部分,现在简单解析下,做一个记录,另外,代码中做了些许不妨碍功能的修改(如果有时间的话,自己也会考虑用fragment实现下)。先看下效果图:


这里主要讲解的是以下部分:


先看下注释里面的说明:

[plain]  view plain copy
  1. /**  
  2.  * Android实现局部图片滑动指引效果  
  3.  * @Description: 实现以下功能:  
  4.  * 1、顶部单张图片左右拖拉滑动;  
  5.  * 2、带指引;  
  6.  * 3、仅滑动顶部单张图片,不滑动页面,下面的图文内容不动;   
  7.  * 4、类似于新闻客户端的功能  


看下它的主Activity里面的全局变量(也就是上面图形):

[java]  view plain copy
  1. public class MainActivity extends ActivityGroup implements OnClickListener{  
  2.     // 选中的新闻条目  
  3.     private TextView mSelectedItem = null;  
  4.     // 头部新闻条目的Layout  
  5.     private RelativeLayout mHeader = null;  
  6.     // 中间新闻主体的Layout  
  7.     private RelativeLayout mNewsMainLayout = null;  
  8.     private LayoutParams params = null;  
  9.     //顶部提示  
  10.     private TextView mNetEaseTop = null;  
  11.     // 新闻分类  
  12.     private TextView mNewsItem = null;  
  13.     private TextView mInfoItem = null;  
  14.     private TextView mBlogItem = null;  
  15.     private TextView mMagezineItem = null;  
  16.     private TextView mDomainItem = null;  
  17.     private TextView mMoreItem = null;  
  18.       
  19.     // 新闻分类中每条分类的宽度  
  20.     private int mItemWidth = 0;  
  21.     // 条目背景移动开始位置  
  22.     private int startX = 0;  
  23.     private Intent mIntent = null;  
  24.     // 设置新闻主题  
  25.     private View mNewsMain = null;  


注释比较详细。可以看到这个activity继承自activityGroup类,而activityGroup类在3.0以后是deprecated,所以在开头说想要用fragment重新实现一下。

[plain]  view plain copy
  1. Deprecated. Use the new Fragment and FragmentManager APIs instead; these are also available on older platforms through the Android compatibility package.  


再看onCreate方法:

[java]  view plain copy
  1. @Override  
  2.     public void onCreate(Bundle savedInstanceState) {  
  3.         super.onCreate(savedInstanceState);  
  4.         setContentView(R.layout.main);        
  5.         // 初始化控件  
  6.         initeViews();  
  7.     }  
  8.       
  9.     /** 
  10.      * 初始化控件 
  11.      */  
  12.     private void initeViews(){  
  13.         mNewsItem = (TextView) findViewById(R.id.tv_title_news);  
  14.         mInfoItem = (TextView) findViewById(R.id.tv_title_info);  
  15.         mBlogItem = (TextView) findViewById(R.id.tv_title_blog);  
  16.         mMagezineItem = (TextView) findViewById(R.id.tv_title_magazine);  
  17.         mDomainItem = (TextView) findViewById(R.id.tv_title_domain);  
  18.         mMoreItem = (TextView) findViewById(R.id.tv_title_more);  
  19.           
  20.         mNewsItem.setOnClickListener(this);  
  21.         mInfoItem.setOnClickListener(this);  
  22.         mBlogItem.setOnClickListener(this);  
  23.         mMagezineItem.setOnClickListener(this);  
  24.         mDomainItem.setOnClickListener(this);  
  25.         mMoreItem.setOnClickListener(this);  
  26.   
  27.         // 设置选中条目属性  
  28.         mSelectedItem = new TextView(this);  
  29.         mSelectedItem.setText(R.string.title_news_category_tops);  
  30.         mSelectedItem.setTextColor(Color.WHITE);  
  31.         mSelectedItem.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 17);  
  32.         mSelectedItem.setGravity(Gravity.CENTER);  
  33.         mSelectedItem.setWidth((getScreenWidth() - DimensionUtility.dip2px(this20)) / 6);  
  34.         mSelectedItem.setBackgroundResource(R.drawable.slidebar);  
  35.         RelativeLayout.LayoutParams param = new RelativeLayout.LayoutParams(  
  36.                 LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);  
  37.         param.addRule(RelativeLayout.CENTER_VERTICAL, RelativeLayout.TRUE);  
  38.           
  39.         mHeader = (RelativeLayout) findViewById(R.id.layout_title_bar);  
  40.         mNetEaseTop = (TextView) findViewById(R.id.tv_netease_top);  
  41.           
  42.         mHeader.addView(mSelectedItem, param);  
  43.           
  44.         // 设置头条新闻主体  
  45.         mIntent = new Intent(MainActivity.this, TopicNews.class);  
  46.         mNewsMain = getLocalActivityManager().startActivity(  
  47.                 "TopicNews", mIntent).getDecorView();  
  48.         params = new LayoutParams(  
  49.                 LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  50.         mNewsMainLayout = (RelativeLayout) findViewById(R.id.layout_news_main);  
  51.         mNewsMainLayout.addView(mNewsMain, params);  
  52.     }  


这里所说的选中条目,就是上图中,选中的高亮部分,它其实可以理解为和下面六个是上下两层的关系。而mNetEaseTop是指的


这一块内容,在原代码中,作者并未做这一块和下面内容的同时更新,个人后来加上。设置头条新闻主题下面就是设置默认选择项:第一项(头条新闻)。

再来看一下里面用到的布局文件:

[html]  view plain copy
  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:weightSum="10" >  
  7.   
  8.     <include  
  9.         android:id="@+id/header"  
  10.         layout="@layout/header" />  
  11.   
  12.     <RelativeLayout  
  13.         android:id="@+id/layout_news_main"  
  14.         android:layout_width="fill_parent"  
  15.         android:layout_height="0dp"  
  16.         android:layout_weight="9" >  
  17.     </RelativeLayout>  
  18.   
  19.     <RelativeLayout  
  20.         android:id="@+id/layout_bottom"  
  21.         android:layout_weight="1"  
  22.         android:layout_width="fill_parent"  
  23.         android:layout_height="wrap_content" >  
  24.   
  25.         <RadioGroup  
  26.             android:id="@+id/radiogroup"  
  27.             android:layout_width="fill_parent"  
  28.             android:layout_height="0dp"  
  29.             android:background="@drawable/bottombg"  
  30.             android:gravity="center_vertical"  
  31.             android:orientation="horizontal" >  
  32.   
  33.             <RadioButton  
  34.                 android:id="@+id/radio_news"  
  35.                 android:layout_width="wrap_content"  
  36.                 android:background="@drawable/tab_selector_news"  
  37.                 android:button="@null"  
  38.                 android:checked="true" />  
  39.   
  40.             <RadioButton  
  41.                 android:id="@+id/radio_topic"  
  42.                 android:layout_width="wrap_content"  
  43.                 android:background="@drawable/tab_selector_topic"  
  44.                 android:button="@null" />  
  45.   
  46.             <RadioButton  
  47.                 android:id="@+id/radio_pic"  
  48.                 android:layout_width="wrap_content"  
  49.                 android:background="@drawable/tab_selector_pic"  
  50.                 android:button="@null" />  
  51.   
  52.             <RadioButton  
  53.                 android:id="@+id/radio_follow"  
  54.                 android:layout_width="wrap_content"  
  55.                 android:background="@drawable/tab_selector_follow"  
  56.                 android:button="@null" />  
  57.   
  58.             <RadioButton  
  59.                 android:id="@+id/radio_vote"  
  60.                 android:layout_width="wrap_content"  
  61.                 android:background="@drawable/tab_selector_vote"  
  62.                 android:button="@null" />  
  63.         </RadioGroup>  
  64.     </RelativeLayout>  
  65.   
  66. </LinearLayout>  



中间的layout_new_main就是mNewsMainLayout,起到一个占位的作用,下面的RadioGroup就是最下面的标记栏。里面用到的布局文件主要是header.xml:

[html]  view plain copy
  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.     android:orientation="vertical" >  
  6.   
  7.     <RelativeLayout  
  8.         android:id="@+id/layout_top"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="40dip"  
  11.         android:background="#990000" >  
  12.   
  13.         <TextView  
  14.             android:id="@+id/tv_netease_top"  
  15.             android:layout_width="wrap_content"  
  16.             android:layout_height="wrap_content"  
  17.             android:layout_centerVertical="true"  
  18.             android:layout_marginLeft="10dip"  
  19.             android:textSize="20sp"  
  20.             android:textColor="@android:color/white"  
  21.             android:text="@string/news_top_left_text1" />  
  22.   
  23.         <TextView  
  24.             android:layout_width="wrap_content"  
  25.             android:layout_height="wrap_content"  
  26.             android:layout_centerVertical="true"  
  27.             android:layout_toRightOf="@+id/tv_netease_top"  
  28.             android:text="@string/news_top_left_text2"  
  29.             android:textColor="@android:color/white"  
  30.             android:textSize="20sp" />  
  31.   
  32.         <ImageView  
  33.             android:layout_width="wrap_content"  
  34.             android:layout_height="wrap_content"  
  35.             android:layout_alignParentRight="true"  
  36.             android:src="@drawable/duoyun"  
  37.             android:contentDescription="@string/img_duoyun_desc" />  
  38.           
  39.     </RelativeLayout>  
  40.   
  41.     <RelativeLayout  
  42.         android:id="@+id/layout_title_bar"  
  43.         android:layout_width="fill_parent"  
  44.         android:layout_height="40dip"  
  45.         android:paddingLeft="5dip"  
  46.         android:paddingRight="5dip"  
  47.         android:background="@drawable/bg_header_top">  
  48.   
  49.         <LinearLayout  
  50.             android:id="@+id/header_item"  
  51.             android:layout_width="fill_parent"  
  52.             android:layout_height="match_parent"  
  53.             android:orientation="horizontal" >  
  54.   
  55.             <RelativeLayout  
  56.                 android:id="@+id/layout"  
  57.                 android:layout_width="match_parent"  
  58.                 android:layout_height="match_parent"  
  59.                 android:layout_weight="1" >  
  60.   
  61.                 <TextView  
  62.                     android:id="@+id/tv_title_news"  
  63.                     android:layout_width="match_parent"  
  64.                     android:layout_height="match_parent"  
  65.                     android:layout_centerInParent="true"  
  66.                     style="@style/header_title_style"  
  67.                     android:gravity="center"  
  68.                     android:text="@string/title_news_category_tops" />  
  69.                   
  70.             </RelativeLayout>  
  71.   
  72.             <RelativeLayout  
  73.                 android:layout_width="match_parent"  
  74.                 android:layout_height="match_parent"  
  75.                 android:layout_weight="1" >  
  76.   
  77.                 <TextView  
  78.                     android:id="@+id/tv_title_info"  
  79.                     android:layout_width="match_parent"  
  80.                     android:layout_height="match_parent"  
  81.                     android:layout_centerInParent="true"  
  82.                     style="@style/header_title_style"  
  83.                     android:gravity="center"  
  84.                     android:text="@string/title_news_category_info" />  
  85.                   
  86.             </RelativeLayout>  
  87.   
  88.             <RelativeLayout  
  89.                 android:layout_width="match_parent"  
  90.                 android:layout_height="match_parent"  
  91.                 android:layout_weight="1" >  
  92.   
  93.                 <TextView  
  94.                     android:id="@+id/tv_title_blog"  
  95.                     android:layout_width="match_parent"  
  96.                     android:layout_height="match_parent"  
  97.                     android:layout_centerInParent="true"  
  98.                     style="@style/header_title_style"  
  99.                     android:gravity="center"  
  100.                     android:text="@string/title_news_category_blog" />  
  101.                   
  102.             </RelativeLayout>  
  103.   
  104.             <RelativeLayout  
  105.                 android:layout_width="match_parent"  
  106.                 android:layout_height="match_parent"  
  107.                 android:layout_weight="1" >  
  108.   
  109.                 <TextView  
  110.                     android:id="@+id/tv_title_magazine"  
  111.                     android:layout_width="match_parent"  
  112.                     android:layout_height="match_parent"  
  113.                     android:layout_centerInParent="true"  
  114.                     style="@style/header_title_style"  
  115.                     android:gravity="center"  
  116.                     android:text="@string/title_news_category_magazine" />  
  117.                   
  118.             </RelativeLayout>  
  119.   
  120.             <RelativeLayout  
  121.                 android:layout_width="match_parent"  
  122.                 android:layout_height="match_parent"  
  123.                 android:layout_weight="1" >  
  124.   
  125.                 <TextView  
  126.                     android:id="@+id/tv_title_domain"  
  127.                     android:layout_width="match_parent"  
  128.                     android:layout_height="match_parent"  
  129.                     android:layout_centerInParent="true"  
  130.                     style="@style/header_title_style"  
  131.                     android:gravity="center"  
  132.                     android:text="@string/title_news_category_domain" />  
  133.                   
  134.             </RelativeLayout>  
  135.   
  136.             <RelativeLayout  
  137.                 android:layout_width="match_parent"  
  138.                 android:layout_height="match_parent"  
  139.                 android:layout_weight="1" >  
  140.   
  141.                 <TextView  
  142.                     android:id="@+id/tv_title_more"  
  143.                     android:layout_width="match_parent"  
  144.                     android:layout_height="match_parent"  
  145.                     android:layout_centerInParent="true"  
  146.                     style="@style/header_title_style"  
  147.                     android:gravity="center"  
  148.                     android:text="@string/title_news_category_more" />  
  149.             </RelativeLayout>  
  150.         </LinearLayout>  
  151.     </RelativeLayout>  
  152. </LinearLayout>  

比较简单的布局,不详述。

上面代码设置选中项宽带:

[java]  view plain copy
  1. mSelectedItem.setWidth((getScreenWidth() - DimensionUtility.dip2px(this20)) / 6);  

用到了getScreenWidth方法:

[java]  view plain copy
  1. /** 
  2.      * 获取屏幕的宽度 
  3.      * @return 
  4.      */  
  5.     private int getScreenWidth(){  
  6.         WindowManager windowManager = getWindowManager();  
  7.         Display display = windowManager.getDefaultDisplay();  
  8. //      Point point = new Point();  
  9. //      display.getSize(point);  
  10. //      int screenWidth = point.x;   
  11.         int screenWidth = display.getWidth();  
  12.         return screenWidth;  
  13.     }  

display的getWidth方法在3.0中好像也没deprecated。可以使用注释掉的代码获取屏幕宽度。

下面是最重要的部分点击切换:

[java]  view plain copy
  1. // 新闻分类事件监听  
  2.     @Override  
  3.     public void onClick(View v) {  
  4.         mItemWidth = findViewById(R.id.layout).getWidth();  
  5.           
  6.         switch (v.getId()) {  
  7.         case R.id.tv_title_news:  
  8.             //动画滑动  
  9.             ImageAnimation.SetImageSlide(mSelectedItem, startX, 000);  
  10.             //设置滑动后动画开始位置  
  11.             startX = 0;  
  12.             //设置选中项显示文字,也就是高亮部分文字  
  13.             mSelectedItem.setText(R.string.title_news_category_tops);  
  14.             //设置左上角提示文字  
  15.             mNetEaseTop.setText(R.string.title_news_category_tops);  
  16.               
  17.             // 显示头条信息  
  18.             mIntent.setClass(MainActivity.this, TopicNews.class);  
  19.             mNewsMain = getLocalActivityManager().startActivity(  
  20.                     "TopicNews", mIntent).getDecorView();  
  21.             break;  
  22.         case R.id.tv_title_info:  
  23.             ImageAnimation.SetImageSlide(mSelectedItem, startX, mItemWidth, 00);  
  24.             startX = mItemWidth;  
  25.             mSelectedItem.setText(R.string.title_news_category_info);  
  26.             mNetEaseTop.setText(R.string.title_news_category_info);  
  27.               
  28.             // 显示资讯信息  
  29.             mIntent.setClass(MainActivity.this, InfoNews.class);  
  30.             mNewsMain = getLocalActivityManager().startActivity(  
  31.                     "InfoNews", mIntent).getDecorView();  
  32.             break;  
  33.         case R.id.tv_title_blog:  
  34.             ImageAnimation.SetImageSlide(mSelectedItem, startX, mItemWidth * 200);  
  35.             startX = mItemWidth * 2;  
  36.             mSelectedItem.setText(R.string.title_news_category_blog);  
  37.             mNetEaseTop.setText(R.string.title_news_category_blog);  
  38.               
  39.             // 显示博客信息  
  40.             mIntent.setClass(MainActivity.this, BlogNews.class);  
  41.             mNewsMain = getLocalActivityManager().startActivity(  
  42.                     "BlogNews", mIntent).getDecorView();  
  43.             break;  
  44.         case R.id.tv_title_magazine:  
  45.             ImageAnimation.SetImageSlide(mSelectedItem, startX, mItemWidth * 300);  
  46.             startX = mItemWidth * 3;  
  47.             mSelectedItem.setText(R.string.title_news_category_magazine);  
  48.             mNetEaseTop.setText(R.string.title_news_category_magazine);  
  49.               
  50.             // 显示杂志信息  
  51.             mIntent.setClass(MainActivity.this, MagazineNews.class);  
  52.             mNewsMain = getLocalActivityManager().startActivity(  
  53.                     "MagazineNews", mIntent).getDecorView();  
  54.             break;  
  55.         case R.id.tv_title_domain:  
  56.             ImageAnimation.SetImageSlide(mSelectedItem, startX, mItemWidth * 400);  
  57.             startX = mItemWidth * 4;  
  58.             mSelectedItem.setText(R.string.title_news_category_domain);  
  59.             mNetEaseTop.setText(R.string.title_news_category_domain);  
  60.             // 显示业界信息  
  61.             mIntent.setClass(MainActivity.this, DomainNews.class);  
  62.             mNewsMain = getLocalActivityManager().startActivity(  
  63.                     "DomainNews", mIntent).getDecorView();  
  64.             break;  
  65.         case R.id.tv_title_more:  
  66.             ImageAnimation.SetImageSlide(mSelectedItem, startX, mItemWidth * 500);  
  67.             startX = mItemWidth * 5;  
  68.             mSelectedItem.setText(R.string.title_news_category_more);  
  69.             mNetEaseTop.setText(R.string.title_news_category_more);  
  70.               
  71.             // 显示更多信息  
  72.             mIntent.setClass(MainActivity.this, MoreNews.class);  
  73.             mNewsMain = getLocalActivityManager().startActivity(  
  74.                     "MoreNews", mIntent).getDecorView();  
  75.             break;  
  76.         default:  
  77.             break;  
  78.         }         
  79.         // 更换Layout中的新闻主体  
  80.         mNewsMainLayout.removeAllViews();  
  81.         mNewsMainLayout.addView(mNewsMain, params);  
  82.     }  

在注释中,解释的已经比较清楚了,看一下ImageAnimation:

[java]  view plain copy
  1. public class ImageAnimation {  
  2.     /** 
  3.      * 设置图像移动动画效果 
  4.      * @param v 
  5.      * @param startX 
  6.      * @param toX 
  7.      * @param startY 
  8.      * @param toY 
  9.      */  
  10.     public static void SetImageSlide(View v, int startX, int toX, int startY, int toY) {  
  11.         TranslateAnimation anim = new TranslateAnimation(startX, toX, startY, toY);  
  12.         anim.setDuration(100);  
  13.         anim.setFillAfter(true);  
  14.         v.startAnimation(anim);  
  15.     }  
  16. }  
就是一个简单的移动动画。这样就是简单的顶部标示就完成了,接下来要分析如下:



这个代码在TopicNews中,先看下使用到的全局变量:

[java]  view plain copy
  1. public class TopicNews extends Activity{  
  2.     // 滑动图片的集合  
  3.     private ArrayList<View> mImagePageViewList = null;  
  4.     private ViewGroup mMainView = null;  
  5.     private ViewPager mViewPager = null;  
  6.     // 当前ViewPager索引  
  7. //  private int pageIndex = 0;   
  8.       
  9.     // 包含圆点图片的View  
  10.     private ViewGroup mImageCircleView = null;  
  11.     private ImageView[] mImageCircleViews = null;   
  12.       
  13.     // 滑动标题  
  14.     private TextView mSlideTitle = null;  
  15.       
  16.     // 布局设置类  
  17.     private SlideImageLayout mSlideLayout = null;  
  18.     // 数据解析类  
  19.     private NewsXmlParser mParser = null;   

  里面的viewPager类是用于滑动控件,SlideImageLayout类是用于上面图片和下面标志点的布局。NewsXmlParser类提供数据。

看一下onCreate方法:

[java]  view plain copy
  1. @Override  
  2. protected void onCreate(Bundle savedInstanceState) {  
  3.     super.onCreate(savedInstanceState);  
  4.     setTheme(android.R.style.Theme_Translucent_NoTitleBar);       
  5.     // 初始化  
  6.     initeViews();  
  7. }  
  8.   
  9. /** 
  10.  * 初始化 
  11.  */  
  12. private void initeViews(){  
  13.     // 滑动图片区域  
  14.     mImagePageViewList = new ArrayList<View>();  
  15.     LayoutInflater inflater = getLayoutInflater();    
  16.     mMainView = (ViewGroup)inflater.inflate(R.layout.page_topic_news, null);  
  17.     mViewPager = (ViewPager) mMainView.findViewById(R.id.image_slide_page);    
  18.       
  19.     // 圆点图片区域  
  20.     mParser = new NewsXmlParser();  
  21.     int length = mParser.getSlideImages().length;  
  22.     mImageCircleViews = new ImageView[length];  
  23.     mImageCircleView = (ViewGroup) mMainView.findViewById(R.id.layout_circle_images);  
  24.     mSlideLayout = new SlideImageLayout(TopicNews.this);  
  25.     mSlideLayout.setCircleImageLayout(length);  
  26.       
  27.     for(int i = 0; i < length; i++){  
  28.         mImagePageViewList.add(mSlideLayout.getSlideImageLayout(mParser.getSlideImages()[i]));  
  29.         mImageCircleViews[i] = mSlideLayout.getCircleImageLayout(i);  
  30.         mImageCircleView.addView(mSlideLayout.getLinearLayout(mImageCircleViews[i], 1010));  
  31.     }  
  32.       
  33.     // 设置默认的滑动标题  
  34.     mSlideTitle = (TextView) mMainView.findViewById(R.id.tvSlideTitle);  
  35.     mSlideTitle.setText(mParser.getSlideTitles()[0]);  
  36.       
  37.     setContentView(mMainView);  
  38.       
  39.     // 设置ViewPager  
  40.        mViewPager.setAdapter(new SlideImageAdapter());    
  41.        mViewPager.setOnPageChangeListener(new ImagePageChangeListener());  
  42. }  

看一下远点图片区域:

[java]  view plain copy
  1. // 圆点图片区域  
  2.         mParser = new NewsXmlParser();  
  3.         int length = mParser.getSlideImages().length;  
  4.         mImageCircleViews = new ImageView[length];  
  5.         mImageCircleView = (ViewGroup) mMainView.findViewById(R.id.layout_circle_images);  
  6.         mSlideLayout = new SlideImageLayout(TopicNews.this);  
  7.         mSlideLayout.setCircleImageLayout(length);  
  8.           
  9.         for(int i = 0; i < length; i++){  
  10.             mImagePageViewList.add(mSlideLayout.getSlideImageLayout(mParser.getSlideImages()[i]));  
  11.             mImageCircleViews[i] = mSlideLayout.getCircleImageLayout(i);  
  12.             mImageCircleView.addView(mSlideLayout.getLinearLayout(mImageCircleViews[i], 1010));  
  13.         }  
里面主要是调用了NewsXmlParser类和SlideImageLayout的方法,那就先看下NewsXmlParser的getSlideImages方法:

[java]  view plain copy
  1. public int[] getSlideImages(){  
  2.         return slideImages;  
  3.     }  
这里的slideImage是在类中定义好的:

[java]  view plain copy
  1. // 滑动图片的集合,这里设置成了固定加载,当然也可动态加载。  
  2.     private int[] slideImages = {  
  3.             R.drawable.image01,  
  4.             R.drawable.image02,  
  5.             R.drawable.image03,  
  6.             R.drawable.image04,  
  7.             R.drawable.image05};  
那看一下用到的SlideImageLayout类的getSlideImageLayout:获取图片的布局:

[java]  view plain copy
  1. /** 
  2.      * 生成滑动图片区域布局 
  3.      * @param id 
  4.      * @return 
  5.      */  
  6.     public View getSlideImageLayout(int id){  
  7.         // 包含TextView的LinearLayout  
  8.         LinearLayout imageLinerLayout = new LinearLayout(mContext);  
  9.         LinearLayout.LayoutParams imageLinerLayoutParames = new LinearLayout.LayoutParams(  
  10.                 LinearLayout.LayoutParams.WRAP_CONTENT,   
  11.                 LinearLayout.LayoutParams.WRAP_CONTENT,  
  12.                 1);  
  13.           
  14.         ImageView iv = new ImageView(mContext);  
  15.         iv.setBackgroundResource(id);  
  16.         iv.setOnClickListener(new ImageOnClickListener());  
  17.         imageLinerLayout.addView(iv,imageLinerLayoutParames);  
  18.         mImageList.add(iv);  
  19.           
  20.         return imageLinerLayout;  
  21.     }  

创建一个layout,然后再创建一个imageView,把ImageView加入到layout中,然后返回layout。同理,我们再看下set和getCircleImageLayout:


[java]  view plain copy
  1. * 设置圆点个数  
  2.  * @param size  
  3.  */  
  4. public void setCircleImageLayout(int size){  
  5.     mImageViews = new ImageView[size];  
  6. }  
  7.   
  8. /** 
  9.  * 生成圆点图片区域布局对象 
  10.  * @param index 
  11.  * @return 
  12.  */  
  13. public ImageView getCircleImageLayout(int index){  
  14.     mImageView = new ImageView(mContext);    
  15.     mImageView.setLayoutParams(new LayoutParams(10,10));  
  16.        mImageView.setScaleType(ScaleType.FIT_XY);  
  17.          
  18.        mImageViews[index] = mImageView;  
  19.           
  20.        if (index == 0) {    
  21.            //默认选中第一张图片  
  22.            mImageViews[index].setBackgroundResource(R.drawable.dot_selected);    
  23.        } else {    
  24.            mImageViews[index].setBackgroundResource(R.drawable.dot_none);    
  25.        }    
  26.           
  27.        return mImageViews[index];  
  28. }  

获取圆点图片的Image,然后返回。

在initViews中还有设置滑动图片标题:


[java]  view plain copy
  1. // 设置默认的滑动标题  
  2.         mSlideTitle = (TextView) mMainView.findViewById(R.id.tvSlideTitle);  
  3.         mSlideTitle.setText(mParser.getSlideTitles()[0]);  
  4.           
  5.         setContentView(mMainView);  

最后是设置Viewpager的Adapter还有监听

[java]  view plain copy
  1. // 设置ViewPager  
  2.         mViewPager.setAdapter(new SlideImageAdapter());    
  3.         mViewPager.setOnPageChangeListener(new ImagePageChangeListener());  

先来看下SlideImageAdapter类:

[java]  view plain copy
  1. // 滑动图片数据适配器  
  2.     private class SlideImageAdapter extends PagerAdapter {    
  3.         @Override    
  4.         public int getCount() {   
  5.             return mImagePageViewList.size();    
  6.         }    
  7.     
  8.         @Override    
  9.         public boolean isViewFromObject(View view, Object object) {    
  10.             return view == object;    
  11.         }    
  12.     
  13.         @Override    
  14.         public int getItemPosition(Object object) {    
  15.             return super.getItemPosition(object);    
  16.         }    
  17.     
  18.         @Override    
  19.         public void destroyItem(View view, int arg1, Object arg2) {    
  20.             ((ViewPager) view).removeView(mImagePageViewList.get(arg1));    
  21.         }    
  22.     
  23.         @Override    
  24.         public Object instantiateItem(View view, int position) {    
  25.             ((ViewPager) view).addView(mImagePageViewList.get(position));  
  26.               
  27.             return mImagePageViewList.get(position);    
  28.         }    
  29.     
  30.         @Override    
  31.         public void restoreState(Parcelable arg0, ClassLoader arg1) {    
  32.     
  33.         }    
  34.     
  35.         @Override    
  36.         public Parcelable saveState() {    
  37.             return null;    
  38.         }    
  39.     
  40.         @Override    
  41.         public void startUpdate(View arg0) {    
  42.         }    
  43.     
  44.         @Override    
  45.         public void finishUpdate(View arg0) {    
  46.         }    
  47.     }  

一个典型的适配器类,主要看下面两个方法:

[java]  view plain copy
  1. @Override    
  2.         public void destroyItem(View view, int arg1, Object arg2) {    
  3.             ((ViewPager) view).removeView(mImagePageViewList.get(arg1));    
  4.         }    
  5.     
  6.         @Override    
  7.         public Object instantiateItem(View view, int position) {    
  8.             ((ViewPager) view).addView(mImagePageViewList.get(position));  
  9.               
  10.             return mImagePageViewList.get(position);    
  11.         }    
实例化Item和销毁Item。我们在initViews方法里面为mImagePageViewList里面加载了很多view,在这里取出,加入到ViewPager中去。

其实他的滑动监听事件特别简单,就是改变下选中图片、标识圆点和标题文字:

[java]  view plain copy
  1. // 滑动页面更改事件监听器  
  2.     private class ImagePageChangeListener implements OnPageChangeListener {  
  3.         @Override    
  4.         public void onPageScrollStateChanged(int arg0) {    
  5.         }    
  6.     
  7.         @Override    
  8.         public void onPageScrolled(int arg0, float arg1, int arg2) {    
  9.         }    
  10.     
  11.         @Override    
  12.         public void onPageSelected(int index) {    
  13. //          pageIndex = index;  
  14.             mSlideLayout.setPageIndex(index);  
  15.             mSlideTitle.setText(mParser.getSlideTitles()[index]);  
  16.               
  17.             for (int i = 0; i < mImageCircleViews.length; i++) {    
  18.                 mImageCircleViews[index].setBackgroundResource(R.drawable.dot_selected);  
  19.                   
  20.                 if (index != i) {    
  21.                     mImageCircleViews[i].setBackgroundResource(R.drawable.dot_none);    
  22.                 }    
  23.             }  
  24.         }    
  25.     }  


还有,在网易新闻里,有个底部标记栏:


这个功能是如何实现的呢?


[html]  view plain copy
  1. <RelativeLayout  
  2.         android:id="@+id/layout_bottom"  
  3.         android:layout_weight="1"  
  4.         android:layout_width="fill_parent"  
  5.         android:layout_height="wrap_content" >  
  6.   
  7.         <RadioGroup  
  8.             android:id="@+id/radiogroup"  
  9.             android:layout_width="fill_parent"  
  10.             android:layout_height="0dp"  
  11.             android:background="@drawable/bottombg"  
  12.             android:gravity="center_vertical"  
  13.             android:orientation="horizontal" >  
  14.   
  15.             <RadioButton  
  16.                 android:id="@+id/radio_news"  
  17.                 android:layout_width="wrap_content"  
  18.                 android:background="@drawable/tab_selector_news"  
  19.                 android:button="@null"  
  20.                 android:checked="true" />  
  21.   
  22.             <RadioButton  
  23.                 android:id="@+id/radio_topic"  
  24.                 android:layout_width="wrap_content"  
  25.                 android:background="@drawable/tab_selector_topic"  
  26.                 android:button="@null" />  
  27.   
  28.             <RadioButton  
  29.                 android:id="@+id/radio_pic"  
  30.                 android:layout_width="wrap_content"  
  31.                 android:background="@drawable/tab_selector_pic"  
  32.                 android:button="@null" />  
  33.   
  34.             <RadioButton  
  35.                 android:id="@+id/radio_follow"  
  36.                 android:layout_width="wrap_content"  
  37.                 android:background="@drawable/tab_selector_follow"  
  38.                 android:button="@null" />  
  39.   
  40.             <RadioButton  
  41.                 android:id="@+id/radio_vote"  
  42.                 android:layout_width="wrap_content"  
  43.                 android:background="@drawable/tab_selector_vote"  
  44.                 android:button="@null" />  
  45.         </RadioGroup>  
  46.     </RelativeLayout>  


其中background图片:

[html]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <selector xmlns:android="http://schemas.android.com/apk/res/android">  
  3.   
  4.     <item android:drawable="@drawable/current_topic_tab" android:state_checked="true"/>  
  5.     <item android:drawable="@drawable/back_topic_tab" android:state_checked="false"/>  
  6.   
  7. </selector>  

切换代码:

[java]  view plain copy
  1. @Override  
  2.     public void onCheckedChanged(RadioGroup group, int checkedId) {  
  3.   
  4.         switch (checkedId) {  
  5.         case R.id.radio_news:  
  6.             ImageAnimation.SetImageSlide(mImageView, startLeft, 000);  
  7.             startLeft = 0;  
  8.             break;  
  9.         case R.id.radio_topic:  
  10.             ImageAnimation.SetImageSlide(mImageView, startLeft, mImageView.getWidth(), 00);  
  11.             startLeft = mImageView.getWidth();  
  12.           
  13.             break;  
  14.         case R.id.radio_pic:  
  15.             ImageAnimation.SetImageSlide(mImageView, startLeft, mImageView.getWidth() * 200);  
  16.             startLeft = mImageView.getWidth() * 2;  
  17.             break;  
  18.         case R.id.radio_follow:  
  19.             ImageAnimation.SetImageSlide(mImageView, startLeft, mImageView.getWidth() * 300);  
  20.             startLeft = mImageView.getWidth() * 3;  
  21.             break;  
  22.         case R.id.radio_vote:  
  23.             ImageAnimation.SetImageSlide(mImageView, startLeft, mImageView.getWidth() * 400);  
  24.             startLeft = mImageView.getWidth() * 4;  
  25.             break;  
  26.   
  27.         default:  
  28.             break;  
  29.         }  
  30.       

最后代码下载地址:

http://download.csdn.net/detail/aomandeshangxiao/4751356


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值