使用ViewPager实现左右循环滑动图片
2015-11-06 15:16
218 查看
•android-support-v4.jar,这是谷歌官方 给我们提供的一个兼容低版本Android设备的软件包,里面包囊了只有在Android3.0以上可以使用的api。而ViewPager就是其中之
一,利用它我们可以做很多事情,从最简单的导航,到页面切换菜单等等。
•ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。
下面是大概样图:
这个是非常常见的应用
下面给出实现的代码:
源代码:
布局文件:
?
一,利用它我们可以做很多事情,从最简单的导航,到页面切换菜单等等。
•ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。
下面是大概样图:
这个是非常常见的应用
下面给出实现的代码:
源代码:
<pre name="code" class="java">package com.example.demo; import android.annotation.TargetApi; import android.graphics.Color; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.support.v7.app.ActionBarActivity; import android.view.View; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; @TargetApi(Build.VERSION_CODES.HONEYCOMB) public class MainActivity extends ActionBarActivity { private ViewPager pager; private ImageView[] images; private ImageView[] dots; private ImageView imageView; private boolean isLoop = true; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); pager.setCurrentItem(pager.getCurrentItem() + 1); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //载入图片资源ID pager = (ViewPager) findViewById(R.id.adv_pager); ViewGroup group = (ViewGroup) findViewById(R.id.viewGroup); //这里存放的是四张广告背景 images = new ImageView[4]; for (int i = 0; i < 4; i++) { ImageView img = new ImageView(this); switch (i) { case 0: img.setBackgroundColor(Color.GREEN); break; case 1: img.setBackgroundColor(Color.RED); break; case 2: img.setBackgroundColor(Color.YELLOW); break; case 3: img.setBackgroundColor(Color.CYAN); break; default: break; } images[i]=img; } //对dots进行填充 dots = new ImageView[images.length]; //小图标 for (int i = 0; i < images.length; i++) { imageView = new ImageView(this); //LinearLayout.LayoutParams.WRAP_CONTENT LinearLayout.LayoutParams layout = new LinearLayout.LayoutParams(20,20); layout.setMargins(5, 5, 5, 5); imageView.setLayoutParams(layout); dots[i] = imageView; if (i == 0) { dots[i].setBackgroundResource(R.drawable.aaa); } else { dots[i].setBackgroundResource(R.drawable.bbb); } group.addView(dots[i]);//将点点加入到ViewGroup中 } //设置Adapter pager.setAdapter(new AdvAdapter(images)); //设置监听,主要是设置点点的背景 pager.setOnPageChangeListener(new GuidePageChangeListener()); /** * 2147483647 / 2 = 1073741820 - 1 * 设置ViewPager的当前项为一个比较大的数,以便一开始就可以左右循环滑动 */ int n = Integer.MAX_VALUE / 2 % dots.length; int itemPosition = Integer.MAX_VALUE / 2 - n; pager.setCurrentItem(itemPosition); // 自动切换页面功能 new Thread(new Runnable() { @Override public void run() { while (true) { try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } //sendEmptyMessageDelayed中就是构建了一个Message, //然后把这个Message的what设置成sendEmptyMessage方法中的What参数即可。 handler.sendEmptyMessage(0); } } }).start(); } private final class GuidePageChangeListener implements OnPageChangeListener { @Override public void onPageScrollStateChanged(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageSelected(int arg0) { int a = arg0 % dots.length; for (int i = 0; i < dots.length; i++) { if(a==i){ dots[i].setBackgroundResource(R.drawable.aaa); }else { dots[i].setBackgroundResource(R.drawable.bbb); } } } } private final class AdvAdapter extends PagerAdapter { private ImageView[] views = null; public AdvAdapter(ImageView[] advPics) { this.views = advPics; } /** * 销毁预加载以外的view对象, 会把需要销毁的对象的索引位置传进来,就是position, * 因为imageViews只有四条数据,而position将会取到很大的值, * 所以使用取余数的方法来获取每一条数据项。 */ @Override public void destroyItem(View arg0, int arg1, Object arg2) { ((ViewPager) arg0).removeView(views[arg1%dots.length]); } /** * 该方法将返回所包含的 Item总个数。为了实现一种循环滚动的效果,返回了基本整型的最大值,这样就会创建很多的Item, * 其实这并非是真正的无限循环。 */ @Override public int getCount() { return Integer.MAX_VALUE; } /** * 载入图片进去 */ @Override public Object instantiateItem(View arg0, int arg1) { ((ViewPager) arg0).addView(views[arg1%dots.length], 0); return views[arg1%dots.length]; } /** * 判断出去的view是否等于进来的view 如果为true直接复用 */ @Override public boolean isViewFromObject(View arg0, Object arg1) { return arg0 == arg1; } } }
布局文件:
<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" tools:context="com.example.demo.MainActivity" > <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" > <!-- ViewPager是一个控件 --> <android.support.v4.view.ViewPager android:id="@+id/adv_pager" android:layout_width="match_parent" android:layout_height="160dp" > </android.support.v4.view.ViewPager> <LinearLayout android:id="@+id/viewGroup" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/adv_pager" android:layout_alignParentLeft="true" android:gravity="right" android:orientation="horizontal" > </LinearLayout> </RelativeLayout> </RelativeLayout>
?
相关文章推荐
- 黑马程序员--String类
- gSOAP的学习
- java 入门 第二季2
- iOS 开发小记 (五)
- CSS3 平分
- jQuery Mobile样式加载问题
- Centos设置服务开机启动的两种方法
- iOS 隐藏顶部状态栏
- AsyncSocket实现TCP连接
- 引用和指针的区别
- Euclid开源源码解析
- 学习笔记之Shell脚本学习指南 & sed与awk & 正则表达式
- Java基础语言之Eclipse介绍
- 仿58同城拍照,可连拍多张照片,预览界面中显示所拍的缩略图
- NGUI 简单控制窗口打开和关闭
- NGUI 简单控制窗口打开和关闭
- C++, Java和C#的编译过程解析
- tail命令
- ThinkPHP中SQL调试方法
- [leetcode] 95. Unique Binary Search Trees II 解题报告