利用ViewPager实现轮播图
来源:互联网 发布:索尼z3v电信4g网络 编辑:程序博客网 时间:2024/05/29 02:56
轮播图的实现网上有很多资源,写这篇文章只是回顾所学的知识。对ViewPager的一些处理,比如适配器各个方法的作用等。
布局:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/activity_main" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="so.wih.android.lunbotu.MainActivity"> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="200dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="50dp" android:layout_alignBottom="@id/view_pager" android:background="#aa000000" android:gravity="center" android:orientation="vertical"> <TextView android:id="@+id/tv_desc" android:layout_width="wrap_content" android:layout_height="wrap_content" android:maxLines="1" android:textColor="#FFFFFF" android:textSize="16sp" android:text="图片下的描述文字"/> <LinearLayout android:id="@+id/ll_point" android:paddingTop="10dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <!--这是指示点的位置--> </LinearLayout> </LinearLayout></RelativeLayout>
选择器:selector_point.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="true" android:drawable="@drawable/point_select"></item> <item android:drawable="@drawable/point_nomal"></item></selector>
point_nomal.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:height="5dp" android:width="5dp"></size> <solid android:color="#ccc"></solid></shape>
point_select.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <size android:width="5dp" android:height="5dp" ></size> <solid android:color="#F00"></solid></shape>
代码(包含详细注释):
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.v7.app.AppCompatActivity;import android.view.View;import android.view.ViewGroup;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity { /** * 图片资源id */ private final int[] imageIds = {R.mipmap.a,R.mipmap.b,R.mipmap.c,R.mipmap.d,R.mipmap.e}; /** * 图片下的描述 */ private final String[] desc = {"巩俐不低俗,我就不能低俗","扑树又回来啦!再唱经典老歌引万人大合唱" ,"揭秘北京电影如何升级","乐视网TV版大派送","热血屌丝的反杀"}; public List<ImageView> imageList = new ArrayList<>(); private ViewPager viewPager; private TextView tv_desc; private android.content.Context mContext; private LinearLayout ll_point; private ImageView iv_test; /** * 是否在运行程序 */ private boolean isRunning = false; //利用handler实现轮播 private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { super.handleMessage(msg); //检查消息队列并移除未发送的消息,这主要是避免在复杂环境下消息出现重复等问题。 if (handler.hasMessages(101)){ handler.removeMessages(101); } if(isRunning){ viewPager.setCurrentItem(viewPager.getCurrentItem()+1); //形成循环2s发送消息,轮播 sendEmptyMessageDelayed(101,2000); } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mContext=this ; setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.view_pager); tv_desc = (TextView) findViewById(R.id.tv_desc); ll_point = (LinearLayout) findViewById(R.id.ll_point); //数据 for (int i=0;i<imageIds.length;i++){ //设置图片 ImageView iv_pic = new ImageView(mContext); iv_pic.setBackgroundResource(imageIds[i]); imageList.add(iv_pic); //动态生成指示点 ImageView iv_point = new ImageView(mContext); iv_point.setBackgroundResource(R.drawable.selector_point); //生成布局参数 LinearLayout.LayoutParams param = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT ); //设置布局参数的margin值 param.leftMargin = 5 ; //添加view时,传入布局参数 ll_point.addView(iv_point , param); //处理初始时指示点的问题 if(i==0){ iv_point.setEnabled(true); }else{ iv_point.setEnabled(false); } } viewPager.setAdapter(new MyPagerAdapter()); /* Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % imageList.size()这个式子的结果是imageList.size() 的整数倍,即总是定位到下标为0的图片 */ viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % imageList.size()); //初始时处理图片下的描述文字问题 tv_desc.setText(desc[0]); isRunning = true ; handler.sendEmptyMessageDelayed(101,2000); //2s后发送消息 initListener(); } private class MyPagerAdapter extends PagerAdapter { /** * 获取所有Pager的总数 * @return */ @Override public int getCount() { return Integer.MAX_VALUE; } /** * 判断view是否和object一致 * @param view * @param object * @return */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } //还有两个方法,必须重写 /** * 初始化页面 * @param container 容器 * @param position 范围0-2的32次方 * @return 返回值是一个View */ @Override public Object instantiateItem(ViewGroup container, int position) { //修改position的范围为0-(imageList.size()-1) int _position = position % imageList.size(); ImageView iv_po = imageList.get(_position); container.addView(iv_po); return iv_po; } /** * 销毁页面 * @param container * @param position * @param object */ @Override public void destroyItem(ViewGroup container, int position, Object object) { //super.destroyItem(container, position, object);必须删掉此句,他在源码中直接抛出异常 container.removeView((View) object); } } private void initListener() { //添加页面改变监听 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { int lastPosition = 0 ; //当pager滑动的时候调用 @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } //当页面被选中的时候调用 @Override public void onPageSelected(int position) { int _position = position % imageList.size(); tv_desc.setText(desc[_position]); //设置上一个点不可用 ll_point.getChildAt(lastPosition).setEnabled(false); //下一个点可用 ll_point.getChildAt(_position).setEnabled(true); lastPosition = _position ; } //当pager滑动改变的时候调用 @Override public void onPageScrollStateChanged(int state) { } }); } //在退出时终止handler @Override protected void onDestroy() { super.onDestroy(); isRunning = false ; }}
0 0
- 利用ViewPager实现轮播图
- 利用viewpager实现引导页
- Android利用ViewPager实现Tab
- 利用viewPager实现导航界面
- 利用Viewpager实现引导界面
- Android中利用ViewPager实现视图切换
- Android中利用ViewPager实现视图切换
- 利用ViewPager实现用户引导界面
- Android利用ViewPager实现滑动广告板
- 利用ViewPager实现用户引导界面
- Android利用ViewPager实现滑动广告板
- 利用ViewPager实现图片循环滚动
- 利用ViewPager实现用户引导界面
- android利用ViewPager实现左右滑动功能
- 利用ViewPager实现欢迎引导页面
- 利用ViewPager实现图片循环滚动
- Android利用ViewPager实现滑动广告板
- 利用viewpager简单实现的引导页面
- iOS “[App] if we're in the real pre-commit handler we can't actually add any new fences due
- static 关键字和final关键字
- 杨氏矩阵
- 文件上传
- ffmpeg使用二:录屏数据直接264编码
- 利用ViewPager实现轮播图
- OpenCV Tutorial: 像素巡訪(at、ptr)
- android studio 集成JPush遇到的坑
- CNN网络结构 - Refining Architectures of Deep Convolutional Neural Networks
- android achartengine使用
- JavaWeb -- 文件上传下载示例
- AndroidStudio报错 Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
- 第26课:Scala的核心力量和黄金定律
- KVC/KVO 进阶(三)KVC的验证和异常处理