您的位置:首页 > 移动开发 > Android开发

android学习之-ViewPager

2013-08-02 16:35 399 查看
使用viewpager来做菜单和页面导航等。

第一种效果:带圆点的滚动效果:



源码:

// 3.图片展示转换
private void initViewPager2() {
imageViewPager = (ViewPager) this.findViewById(R.id.image_vPager);
views = new ArrayList<View>();
inflater = getLayoutInflater();

view1 = inflater.inflate(R.layout.book_layout3, null);
view2 = inflater.inflate(R.layout.book_layout3, null);
view3 = inflater.inflate(R.layout.book_layout3, null);

views.add(view1);
views.add(view2);
views.add(view3);

view1.setOnClickListener(new ViewOnClickListener(BookActivity.this, 0));
view2.setOnClickListener(new ViewOnClickListener(BookActivity.this, 1));
view3.setOnClickListener(new ViewOnClickListener(BookActivity.this, 2));

initData(view1, view2, view3);

imageViews = new ImageView[views.size()];

imageViews[0] = (ImageView) this.findViewById(R.id.group_image1);
imageViews[1] = (ImageView) this.findViewById(R.id.group_image2);
imageViews[2] = (ImageView) this.findViewById(R.id.group_image3);

imageViewPager.setAdapter(new MyViewPageAdapter(views));

imageViewPager.setCurrentItem(0);
imageViewPager.setOnPageChangeListener(new GuidePageChangeListener(
BookActivity.this, imageViews));
}


// 装换中的图片
private void initData(View view1, View view2, View view3) {
ImageView imageView11 = (ImageView) view1
.findViewById(R.id.book_comic_image);
ImageView imageView22 = (ImageView) view2
.findViewById(R.id.book_comic_image);
ImageView imageView33 = (ImageView) view3
.findViewById(R.id.book_comic_image);

if (ComicData.zhanshiComicList.size() > 0) {
imageView11.setImageBitmap(CacheManager
.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(0)
.getImageUrl()));
imageView22.setImageBitmap(CacheManager
.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(1)
.getImageUrl()));
imageView33.setImageBitmap(CacheManager
.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(2)
.getImageUrl()));
}
}

[/code]

对应的layout资源:

<android.support.v4.view.ViewPager
android:id="@+id/vPager"
android:layout_width="wrap_content"
android:layout_height="800dp" />


<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"
android:background="#FFFFFF" >

<ImageView
android:id="@+id/book_comic_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@drawable/book_comic"
android:scaleType="fitXY" />

</RelativeLayout>


对应的viewpager的adapter

package com.enterise.comic.manyu.listener;

import java.util.List;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
/**
* ViewPager的适配器
*
* 主要是用于显示个数和指针
* @author Always
*
*/
public class MyViewPageAdapter extends PagerAdapter{
private List<View> mListViews;

public MyViewPageAdapter(List<View> mListViews) {
this.mListViews = mListViews;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) 	{
container.removeView(mListViews.get(position));
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mListViews.get(position), 0);
return mListViews.get(position);
}

@Override
public int getCount() {
return  mListViews.size();
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0==arg1;
}
}


页面滑动时的监听器

package com.enterise.comic.manyu.listener;

import android.content.Context;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.widget.ImageView;

import com.enterise.comic.manyu.activity.R;

/**
* 页面滑动监听器
*
* @author Always
*
*/
public class GuidePageChangeListener implements OnPageChangeListener {

private ImageView[] imageViews;
private Context context;

public GuidePageChangeListener(Context context, ImageView[] imageViews) {
this.context = context;
this.imageViews = imageViews;
}
@Override
public void onPageScrollStateChanged(int arg0) {
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}

@Override
public void onPageSelected(int arg0) {

for (int i = 0; i < imageViews.length; i++) {
imageViews[arg0].setBackgroundResource(R.drawable.point_white);
if (arg0 != i) {
imageViews[i].setBackgroundResource(R.drawable.point_gray);
}
}
/*//跳转
if (isMainActivity || arg0 == 2) {
try {
System.out.println("GuidePageChangeListener.onPageSelected()");
new Thread().sleep(2000);
Intent intent = new Intent(context, GroupActivity.class);
context.startActivity(intent);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}*/

}

}


2.第二种是头部的图标导航效果:

效果图:



一些代码如下:

layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<com.enterise.comic.manyu.view.ScrollView1
android:layout_height="wrap_content"
android:layout_width="wrap_content"
>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >

<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="150.0dip" >

<android.support.v4.view.ViewPager
android:id="@+id/image_vPager"
android:layout_width="fill_parent"
android:layout_height="200.0dip" />

<LinearLayout
android:id="@+id/book_viewGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
android:layout_marginBottom="10dp"
android:orientation="horizontal" >

<ImageView
android:id="@+id/group_image1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/point_white" />

<ImageView
android:id="@+id/group_image2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/point_gray" />

<ImageView
android:id="@+id/group_image3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginRight="10dp"
android:background="@drawable/point_gray" />
</LinearLayout>
</RelativeLayout>

<LinearLayout
android:id="@+id/linearLayout2"
android:layout_width="fill_parent"
android:layout_height="40.0dip"
android:background="#FFFFFF" >

<TextView
android:id="@+id/text1"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="推荐"
android:textColor="#8d8d8d"
android:textSize="20.0dip" />

<TextView
android:id="@+id/text2"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="排行"
android:textColor="#8d8d8d"
android:textSize="20.0dip" />

<TextView
android:id="@+id/text3"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_weight="1.0"
android:gravity="center"
android:text="最新"
android:textColor="#8d8d8d"
android:textSize="20.0dip" />
</LinearLayout>

<LinearLayout
android:layout_width="fill_parent"
android:layout_height="1dp"
android:background="#858585" >
<ImageView
android:id="@+id/cursor"
android:layout_width="fill_parent"
android:layout_height="1dp"
android:scaleType="matrix"
android:src="@drawable/guide_line" />
</LinearLayout>

<android.support.v4.view.ViewPager
android:id="@+id/vPager"
android:layout_width="wrap_content"
android:layout_height="800dp" />

</LinearLayout>
</com.enterise.comic.manyu.view.ScrollView1>
</LinearLayout>


activity:

package com.enterise.comic.manyu.activity;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.Matrix;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.enterise.comic.manyu.adapter.BookCommonAdapter;
import com.enterise.comic.manyu.adapter.BookTuiJianAdapter;
import com.enterise.comic.manyu.data.CacheManager;
import com.enterise.comic.manyu.data.ComicData;
import com.enterise.comic.manyu.data.IContentListener;
import com.enterise.comic.manyu.data.ResponseData;
import com.enterise.comic.manyu.domain.ComicDetail;
import com.enterise.comic.manyu.http.task.Task;
import com.enterise.comic.manyu.listener.GuidePageChangeListener;
import com.enterise.comic.manyu.listener.MyOnPageChangeListener;
import com.enterise.comic.manyu.listener.MyViewPageAdapter;
import com.enterise.comic.manyu.utils.TextUtil;
import com.enterise.comic.manyu.utils.ViewUtil;

/**
* 书城
*
* @author Always
*
*/
@SuppressLint("HandlerLeak")
public class BookActivity extends Activity {

private static final int REFLUSH_IMAGE = 10002;

private ViewPager imageViewPager;// 图片内容(上面)
private ViewPager viewPager;// 漫画内容内容(下面)

private ImageView imageView;// 动画图片
private TextView textView1, textView2, textView3;
private List<View> views;// Tab页面列表
private int offset = 0;// 动画图片偏移量
private int currIndex = 0;// 当前页卡编号
private int bmpW;// 动画图片宽度
private View view1, view2, view3;// 各个页卡

private ImageView[] imageViews;
private List<TextView> textList;

private LayoutInflater inflater;

GridView tuijianView;
ListView paihangView;
ListView zuixinView;

BookTuiJianAdapter tuijianAdapter;
BookCommonAdapter paihangAdapter;
BookCommonAdapter zuixinAdapter;

List<ComicDetail> tuijianComicList = new ArrayList<ComicDetail>();
List<ComicDetail> paihangComicList = new ArrayList<ComicDetail>();
List<ComicDetail> zuixinComicList = new ArrayList<ComicDetail>();
List<ComicDetail> zhanshiComicList = new ArrayList<ComicDetail>();

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_book);

// 1.计算页卡滑动的数据
initImageData();

// 2.初始化头标
initTextView();

// 3.加载viewpage
initViewPager2();
initViewPager();
}

/**
* 1.初始化动画,这个就是页卡滑动时,下面的横线也滑动的效果,在这里需要计算一些数据
*/
private void initImageData() {
imageView = (ImageView) findViewById(R.id.cursor);
bmpW = BitmapFactory.decodeResource(getResources(), R.drawable.a)
.getWidth();// 获取图片宽度
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
int screenW = dm.widthPixels;// 获取分辨率宽度
offset = (screenW / 3 - bmpW) / 2;// 计算偏移量
Matrix matrix = new Matrix();
matrix.postTranslate(offset, 0);
imageView.setImageMatrix(matrix);// 设置动画初始位置
}

/**
* 2. 初始化头标
*/
private void initTextView() {
textView1 = (TextView) findViewById(R.id.text1);
textView2 = (TextView) findViewById(R.id.text2);
textView3 = (TextView) findViewById(R.id.text3);

textView1.setTextColor(Color.parseColor("#ff9000"));

textList = new ArrayList<TextView>();
textList.add(textView1);
textList.add(textView2);
textList.add(textView3);

textView1.setOnClickListener(new MyOnClickListener(0));
textView2.setOnClickListener(new MyOnClickListener(1));
textView3.setOnClickListener(new MyOnClickListener(2));
}

// 3.图片展示转换 private void initViewPager2() { imageViewPager = (ViewPager) this.findViewById(R.id.image_vPager); views = new ArrayList<View>(); inflater = getLayoutInflater(); view1 = inflater.inflate(R.layout.book_layout3, null); view2 = inflater.inflate(R.layout.book_layout3, null); view3 = inflater.inflate(R.layout.book_layout3, null); views.add(view1); views.add(view2); views.add(view3); view1.setOnClickListener(new ViewOnClickListener(BookActivity.this, 0)); view2.setOnClickListener(new ViewOnClickListener(BookActivity.this, 1)); view3.setOnClickListener(new ViewOnClickListener(BookActivity.this, 2)); initData(view1, view2, view3); imageViews = new ImageView[views.size()]; imageViews[0] = (ImageView) this.findViewById(R.id.group_image1); imageViews[1] = (ImageView) this.findViewById(R.id.group_image2); imageViews[2] = (ImageView) this.findViewById(R.id.group_image3); imageViewPager.setAdapter(new MyViewPageAdapter(views)); imageViewPager.setCurrentItem(0); imageViewPager.setOnPageChangeListener(new GuidePageChangeListener( BookActivity.this, imageViews)); }

/**
* 初始化,viewpager数据(底部)
*/
private void initViewPager() {
viewPager = (ViewPager) findViewById(R.id.vPager);
views = new ArrayList<View>();
LayoutInflater inflater = getLayoutInflater();
view1 = inflater.inflate(R.layout.book_layout1, null);
view2 = inflater.inflate(R.layout.book_layout2, null);
view3 = inflater.inflate(R.layout.book_layout2, null);
views.add(view1);
views.add(view2);
views.add(view3);
viewPager.setAdapter(new MyViewPageAdapter(views));
viewPager.setCurrentItem(0);
viewPager.setOnPageChangeListener(new MyOnPageChangeListener(offset,
bmpW, currIndex, imageView, textList));

initData2Views(view1, view2, view3);
}

// 装换中的图片
private void initData(View view1, View view2, View view3) {
ImageView imageView11 = (ImageView) view1
.findViewById(R.id.book_comic_image);
ImageView imageView22 = (ImageView) view2
.findViewById(R.id.book_comic_image);
ImageView imageView33 = (ImageView) view3
.findViewById(R.id.book_comic_image);

if(ComicData.zhanshiComicList.size() > 0){
imageView11.setImageBitmap(CacheManager.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(0).getImageUrl()));
imageView22.setImageBitmap(CacheManager.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(1).getImageUrl()));
imageView33.setImageBitmap(CacheManager.loadCacheBitmapByUrl(ComicData.zhanshiComicList.get(2).getImageUrl()));
}
}

/**
* 初始化 三个页面的数据
*
* @param view1
* @param view2
* @param view3
*/
private void initData2Views(View view1, View view2, View view3) {
tuijianView = (GridView) view1.findViewById(R.id.gridview);
paihangView = (ListView) view2.findViewById(R.id.me_layout2_listview);
zuixinView = (ListView) view3.findViewById(R.id.me_layout2_listview);

tuijianAdapter = new BookTuiJianAdapter(BookActivity.this, ComicData.tuijianComicList);
paihangAdapter = new BookCommonAdapter(BookActivity.this, ComicData.paihangComicList);
zuixinAdapter = new BookCommonAdapter(BookActivity.this, ComicData.zuixinComicList);

tuijianView.setAdapter(tuijianAdapter);
paihangView.setAdapter(paihangAdapter);
zuixinView.setAdapter(zuixinAdapter);

tuijianView.setOnItemClickListener(new MyGridViewOnItemClickListener(BookActivity.this));
paihangView.setOnItemClickListener(new ListViewOnItemClickListener(BookActivity.this, ComicData.paihangComicList));
zuixinView.setOnItemClickListener(new ListViewOnItemClickListener(BookActivity.this, ComicData.zuixinComicList));

}

class MyOnClickListener implements OnClickListener {
private int index = 0;

public MyOnClickListener(int i) {
index = i;
}

public void onClick(View v) {
viewPager.setCurrentItem(index);
TextUtil.changeTextColor(index, textList);
}
}

//girdview的监听器
class MyGridViewOnItemClickListener implements OnItemClickListener{

private Context context;

public MyGridViewOnItemClickListener(Context context){
this.context = context;
}

@Override
public void onItemClick(AdapterView<?> adapter, View view, int position,
long arg3) {

ComicDetail comicDetail = ComicData.tuijianComicList.get(position);
Intent intent = new Intent(context,ComicDetailActivity.class);
intent.putExtra("contentCode", comicDetail.getContentCode());
context.startActivity(intent);
}

}
//listView的监听器
class ListViewOnItemClickListener implements OnItemClickListener{

private Context context;
private List<ComicDetail> comicList;

public ListViewOnItemClickListener(Context context,List<ComicDetail>comicList){
this.context = context;
this.comicList = comicList;
}

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position,
long arg3) {
ComicDetail comicDetail = comicList.get(position);
Intent intent = new Intent(context,ComicDetailActivity.class);
intent.putExtra("contentCode", comicDetail.getContentCode());
context.startActivity(intent);
}

}

//View的点击事件
class ViewOnClickListener implements OnClickListener {

private int index;
private Context context;

public ViewOnClickListener(Context context,int index){
this.index = index;
this.context = context;
}

@Override
public void onClick(View v) {
ComicDetail comicDetail = ComicData.zhanshiComicList.get(index);
Intent intent = new Intent(context,ComicDetailActivity.class);
intent.putExtra("contentCode", comicDetail.getContentCode());
context.startActivity(intent);
}

}

}


viewpager的页面切换监听:

package com.enterise.comic.manyu.listener;

import java.util.List;

import com.enterise.comic.manyu.utils.TextUtil;

import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.ImageView;
import android.widget.TextView;
/**
* 监听标题导航转换
* @author Always
*
*/
public class MyOnPageChangeListener implements OnPageChangeListener{

private int offset;
private int bmpW;
private int currIndex;
private int one;
private int two;
private ImageView imageView;
private List<TextView> textList;

public MyOnPageChangeListener(int offset,int bmpW,int currIndex,ImageView imageView,List<TextView> textList){
this.offset = offset;
this.bmpW = bmpW;
this.currIndex = currIndex;
this.imageView = imageView;
this.textList = textList;

one = offset * 2 + bmpW;// 页卡1 -> 页卡2 偏移量
two = one * 2;// 页卡1 -> 页卡3 偏移量
}

public MyOnPageChangeListener(int offset,int bmpW,int currIndex,ImageView imageView,boolean isMeActivity,List<TextView> textList){
this.offset = offset;
this.bmpW = bmpW;
this.currIndex = currIndex;
this.imageView = imageView;
this.textList = textList;

one = offset;// 页卡1 -> 页卡2 偏移量
two = one * 2;// 页卡1 -> 页卡3 偏移量
}

public void onPageScrollStateChanged(int arg0) {

}

public void onPageScrolled(int arg0, float arg1, int arg2) {

}

public void onPageSelected(int arg0) {
/*两种方法,这个是一种,下面还有一种,显然这个比较麻烦
Animation animation = null;
switch (arg0) {
case 0:
if (currIndex == 1) {
animation = new TranslateAnimation(one, 0, 0, 0);
} else if (currIndex == 2) {
animation = new TranslateAnimation(two, 0, 0, 0);
}
break;
case 1:
if (currIndex == 0) {
animation = new TranslateAnimation(offset, one, 0, 0);
} else if (currIndex == 2) {
animation = new TranslateAnimation(two, one, 0, 0);
}
break;
case 2:
if (currIndex == 0) {
animation = new TranslateAnimation(offset, two, 0, 0);
} else if (currIndex == 1) {
animation = new TranslateAnimation(one, two, 0, 0);
}
break;

}
*/

//字体颜色的变化
if(textList != null){
TextUtil.changeTextColor(arg0, textList);
}
Animation animation = new TranslateAnimation(one*currIndex, one*arg0, 0, 0);//显然这个比较简洁,只有一行代码。
currIndex = arg0;
animation.setFillAfter(true);// True:图片停在动画结束位置
animation.setDuration(300);
imageView.startAnimation(animation);
}

}


出现的问题是:

scrollview和listview、gridview冲突
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: