学习ViewPage实现无限左右滑动

xtdhwl 2012-12-13 03:46:23
在项目中有需求展示图片,可以左右滑动
一开始使用Gallery实现
public class ZMGallery extends Gallery {

public ZMGallery(Context context) {
super(context);
// TODO Auto-generated constructor stub
}

public ZMGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
}

public ZMGallery(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
}

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// TODO Auto-generated method stub
return false;
}


}

在xml中设置属性
 <net.shenru.common.view.ZMGallery
android:id="@+id/gal_album"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:fadingEdgeLength="0dp"
android:spacing="10dp" >
</net.shenru.ui.common.view.ZMGallery>

但这样是有弊端的体验不好,在滑动时必须滑动超过一半才能翻页
一开始想重写Gallery方法经过一番周折我认输了。
不要紧我们使用ViewPager实现
public class MainActivity extends Activity {

public static final String TAG = MainActivity.class.getSimpleName();
ViewPager pager = null;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//学习ViewPage
//ViewPage可以实现滑动 使用PageAdatper
pager = (ViewPager) this.findViewById(R.id.pager);
pager.setAdapter(new MyPagerAdatper(this));
pager.setCurrentItem(Integer.MAX_VALUE /2);
}

private class MyPagerAdatper extends PagerAdapter {

private List<Drawable> lists = null;
private Context mContext;

public MyPagerAdatper(Context context) {
super();
mContext = context;
lists = new ArrayList<Drawable>();
lists.add(mContext.getResources().getDrawable(R.drawable.ic_launcher));
lists.add(mContext.getResources().getDrawable(R.drawable.ic_launcher));
lists.add(mContext.getResources().getDrawable(R.drawable.ic_launcher));
lists.add(mContext.getResources().getDrawable(R.drawable.ic_launcher));
}

//得到adapter的个数
@Override
public int getCount() {
Log.i(TAG, "getCount");
return Integer.MAX_VALUE;
}
//是否把对象作为view
@Override
public boolean isViewFromObject(View view, Object obj) {
Log.i(TAG, "isViewFromObject");
return view == (View) obj;
}

@Override
public void startUpdate(ViewGroup container) {
// TODO Auto-generated method stub
Log.i(TAG, "startUpdate");
super.startUpdate(container);
}
//初始化一个item
@Override
public Object instantiateItem(ViewGroup container, int position) {
Log.i(TAG, "instantiateItem");
View view = View.inflate(mContext, R.layout.img, null);
ImageView iv = (ImageView) view.findViewById(R.id.img);

int size = lists.size();
int location = Integer.MAX_VALUE % size;
iv.setImageDrawable(lists.get(location));
((ViewPager) container).addView(view);
return view;
}

//pageAdatper与BaseAdapter有很大区别,现在我理解为ViewPager释放有adapter处理
@Override
public void destroyItem(View container, int position, Object object) {
// TODO Auto-generated method stub
Log.i(TAG, "destroyItem");
((ViewPager) container).removeView((View) object);
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
Log.i(TAG, "destroyItem");
super.destroyItem(container, position, object);
}

@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
Log.i(TAG, "setPrimaryItem");
super.setPrimaryItem(container, position, object);
}

@Override
public void finishUpdate(ViewGroup container) {
// TODO Auto-generated method stub
Log.i(TAG, "finishUpdate");
super.finishUpdate(container);
}

@Override
public void startUpdate(View container) {
// TODO Auto-generated method stub
Log.i(TAG, "startUpdate");
super.startUpdate(container);
}

@Override
public Object instantiateItem(View container, int position) {
// TODO Auto-generated method stub
Log.i(TAG, "instantiateItem position:" + position);
return super.instantiateItem(container, position);
}

@Override
public void setPrimaryItem(View container, int position, Object object) {
// TODO Auto-generated method stub
Log.i(TAG, "setPrimaryItem position:" + position);
super.setPrimaryItem(container, position, object);
}

@Override
public void finishUpdate(View container) {
// TODO Auto-generated method stub
Log.i(TAG, "finishUpdate");
super.finishUpdate(container);
}

@Override
public Parcelable saveState() {
// TODO Auto-generated method stub
Log.i(TAG, "saveState");
return super.saveState();
}

@Override
public void restoreState(Parcelable state, ClassLoader loader) {
// TODO Auto-generated method stub
Log.i(TAG, "restoreState");
super.restoreState(state, loader);
}

@Override
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
Log.i(TAG, "getItemPosition");
return super.getItemPosition(object);
}

@Override
public void notifyDataSetChanged() {
// TODO Auto-generated method stub
Log.i(TAG, "notifyDataSetChanged");
super.notifyDataSetChanged();
}

@Override
public CharSequence getPageTitle(int position) {
// TODO Auto-generated method stub
Log.i(TAG, "getPageTitle position:" + position);
return super.getPageTitle(position);
}
//这个是一个很有用的方法默认返回1.0f,权重比例
@Override
public float getPageWidth(int position) {
// TODO Auto-generated method stub
Log.i(TAG, "getPageWidth position:" + position);
return super.getPageWidth(position);
}

}
}

xml如下
<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.support.v4.view.ViewPager
android:id="@+id/pager"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</android.support.v4.view.ViewPager>

</RelativeLayout>

一样可以实现左右无限滑动,体验还贲好
...全文
3102 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuzhi_cdsn 2015-07-07
  • 打赏
  • 举报
回复
int size = lists.size(); int location = Integer.MAX_VALUE % size; iv.setImageDrawable(lists.get(location)); 要改成 int location = postion % size;
xtdhwl 2013-05-10
  • 打赏
  • 举报
回复
引用 7 楼 hcy303563038 的回复:
如果滑到最后一页就让它跳到一个新的Activity去,请问怎么实现好?
ViewPage有监听接口 mViewPager.setOnPageChangeListener(new OnPageChangeListener())
引用 11 楼 b87936260 的回复:
这个内存会不会有问题?
我认为ViewPage需要PageAdapter去释放资源,Gallery内部来释放资源 现在感觉项目中使用ViewPage要比Gallery要多 git上有一个开源的CirclePageIndicator ,配合ViewPage很不错
b87936260 2013-01-22
  • 打赏
  • 举报
回复
这个内存会不会有问题?
叫我三三 2013-01-22
  • 打赏
  • 举报
回复
这个区还真冷
wlcw16 2013-01-21
  • 打赏
  • 举报
回复
mark 回家学习以下
kenny2471 2013-01-21
  • 打赏
  • 举报
回复
Viewpager 的效果是挺好的
kaicheng21_ 2013-01-21
  • 打赏
  • 举报
回复
如果滑到最后一页就让它跳到一个新的Activity去,请问怎么实现好?
jiaxin1029 2012-12-31
  • 打赏
  • 举报
回复
好好研究一下
passself 2012-12-17
  • 打赏
  • 举报
回复
如果是真是的图片会是怎样
xtdhwl 2012-12-17
  • 打赏
  • 举报
回复
动态加载吗? 不太理解什么意思
gavinkaihuang 2012-12-13
  • 打赏
  • 举报
回复
动态加载吗?
xtdhwl 2012-12-13
  • 打赏
  • 举报
回复
下面是log,可以看出viewPage还是很轻量级的 调用instantiateItem3次
12-13 15:52:01.469: I/MainActivity(12066): getCount
12-13 15:52:01.469: I/MainActivity(12066): getCount
12-13 15:52:01.479: I/MainActivity(12066): startUpdate
12-13 15:52:01.479: I/MainActivity(12066): startUpdate
12-13 15:52:01.479: I/MainActivity(12066): getCount
12-13 15:52:01.479: I/MainActivity(12066): instantiateItem
12-13 15:52:01.479: I/MainActivity(12066): getPageWidth position:1073741823
12-13 15:52:01.479: I/MainActivity(12066): instantiateItem
12-13 15:52:01.479: I/MainActivity(12066): getPageWidth position:1073741822
12-13 15:52:01.479: I/MainActivity(12066): instantiateItem
12-13 15:52:01.479: I/MainActivity(12066): getPageWidth position:1073741824
12-13 15:52:01.479: I/MainActivity(12066): getCount
12-13 15:52:01.479: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.479: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.479: I/MainActivity(12066): finishUpdate
12-13 15:52:01.479: I/MainActivity(12066): finishUpdate
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.479: I/MainActivity(12066): startUpdate
12-13 15:52:01.479: I/MainActivity(12066): startUpdate
12-13 15:52:01.479: I/MainActivity(12066): getCount
12-13 15:52:01.479: I/MainActivity(12066): getCount
12-13 15:52:01.479: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.479: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.479: I/MainActivity(12066): finishUpdate
12-13 15:52:01.479: I/MainActivity(12066): finishUpdate
12-13 15:52:01.489: I/MainActivity(12066): startUpdate
12-13 15:52:01.489: I/MainActivity(12066): startUpdate
12-13 15:52:01.489: I/MainActivity(12066): getCount
12-13 15:52:01.489: I/MainActivity(12066): getCount
12-13 15:52:01.489: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.499: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.499: I/MainActivity(12066): finishUpdate
12-13 15:52:01.499: I/MainActivity(12066): finishUpdate
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.499: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): startUpdate
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): getCount
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem
12-13 15:52:01.509: I/MainActivity(12066): setPrimaryItem position:1073741823
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): finishUpdate
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.509: I/MainActivity(12066): isViewFromObject
12-13 15:52:01.539: I/MainActivity(12066): getCount

80,350

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧