-----------------------------------------------案例效果-------------------------------------
activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="200dip" /> <LinearLayout android:gravity="center_horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_alignBottom="@id/viewPager" android:background="#44000000" android:orientation="vertical" > <TextView android:singleLine="true" android:id="@+id/tv_msg" android:textColor="#ffffff" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:text="武媚娘传奇" android:textSize="18sp" /> <LinearLayout android:id="@+id/ll_point_group" android:padding="5dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal" > </LinearLayout> </LinearLayout> </RelativeLayout>
drawable目录下有三个xml文件
point_bg.xml
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="false" android:drawable="@drawable/normal_point"></item> <item android:state_enabled="true" android:drawable="@drawable/focused_point"></item> </selector>
normal_point.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <size android:width="10dip" android:height="10dip"/> <solid android:color="#55000000"/> </shape>
focused_point.xml
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval" > <!-- 椭圆 --> <size android:width="10dip" android:height="10dip"/> <solid android:color="#66ffffff"/> </shape>
MainActivity.java
package com.atguigu.myviewpager; import java.util.ArrayList; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.support.v4.view.PagerAdapter; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.LinearLayout.LayoutParams; import android.widget.TextView; public class MainActivity extends Activity { // viewPager继承viewGroup private ViewPager viewPager; private TextView tv_msg; // 显示当前页的圆点标志布局视图 private LinearLayout ll_point_group; /** * 图片的int数组集合 图片标题集合 图片集合 */ private int[] ids = { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e }; private final String[] imageDescriptions = { "巩俐不低俗,我就不能低俗", "朴树又回来啦!再唱经典老歌引万人大合唱", "揭秘北京电影如何升级", "乐视网TV版大派送", "热血屌丝的反杀" }; private ArrayList<ImageView> imageViews; // 上一次被高亮显示的位置 private int lastIndex = 0; // 是否已经执行了Activity中的onDestroy true:执行 false:没有执行 private boolean isDestroy = false;; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 获取viewPager viewPager = (ViewPager) findViewById(R.id.viewPager); // 获取图片说明 tv_msg = (TextView) findViewById(R.id.tv_msg); // 获取圆点线性布局 ll_point_group = (LinearLayout) findViewById(R.id.ll_point_group); /** * 准备需要的数据 1、初始化圆点集合数据 2、获取图片集合数据 */ imageViews = new ArrayList<ImageView>(); for (int i = 0; i < ids.length; i++) { // 1、实例化图片,并且设置背景 ImageView imageView = new ImageView(this); imageView.setBackgroundResource(ids[i]); // 把图片添加到集合中 imageViews.add(imageView); // 2、设置圆点图片背景 ImageView iv_point = new ImageView(this); iv_point.setBackgroundResource(R.drawable.point_bg); // 导入的包应该是父类的参数 LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); iv_point.setLayoutParams(params); // 圆点之间有距离 params.leftMargin = 10; // 默认第一个圆点是高亮显示(第一个图片被选中) if (i == 0) { iv_point.setEnabled(true); } else { iv_point.setEnabled(false); } ll_point_group.addView(iv_point); } /** * 创建并且设置适配器 */ MyPagerAdapter adapter = new MyPagerAdapter(); viewPager.setAdapter(adapter); // ???? int item = Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % imageViews.size(); // 22->11 Log.e("TAG",item+"-----" ); // 设置为中间???? viewPager.setCurrentItem(item); // 设置默认文本信息 String msg = imageDescriptions[0]; tv_msg.setText(msg); // 监听页面改变 viewPager.setOnPageChangeListener(new OnPageChangeListener() { /** * 当选择某个页面的时候回调 position:把选择的位置传过来 */ @Override public void onPageSelected(int position) { int myposition = position % imageViews.size(); // 根据位置取出对应的文本 String msg = imageDescriptions[myposition]; tv_msg.setText(msg); ll_point_group.getChildAt(lastIndex).setEnabled(false); ll_point_group.getChildAt(myposition).setEnabled(true); lastIndex = myposition; } /** * 当页面滑动了或者滚动了的时候,回调这个方法 position:页面的下标 positionOffset:滑动的页面比 * positionOffsetPixels:滑动了多少的像素 */ @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /** * 当页面滑动状态发送变化的时候回调这个方法 */ @Override public void onPageScrollStateChanged(int state) { } }); // 发消息开始自动切换图片 isDestroy = false; // 一加载页面,就先发一个3秒延迟消息 handler.sendEmptyMessageDelayed(0, 3000); } /* * handler */ private Handler handler = new Handler() { public void handleMessage(android.os.Message msg) { // 切换到下一个页面 viewPager.setCurrentItem(viewPager.getCurrentItem() + 1); // 循环显示图片-不断切换 if (true) { // 每隔4秒图片切换一下-自己本身处理消息 handler.sendEmptyMessageDelayed(0, 4000); } }; }; /** * 退出应用 */ @Override protected void onDestroy() { super.onDestroy(); isDestroy = true; } /** * 适配器类 */ class MyPagerAdapter extends PagerAdapter { // 得到数据的总条数 @Override public int getCount() { return Integer.MAX_VALUE; } // 相当于:getView(); container:就是一个容器,就是ViewPager // position:位置下标 @Override public Object instantiateItem(ViewGroup container, int position) { // 根据位置得到具体的页面 Log.e("TAG",position+"" ); Log.e("TAG",position % imageViews.size()+"" ); ImageView imageView = imageViews.get(position % imageViews.size()); // 把图片添加到ViewPager里面 container.addView(imageView); return imageView; } /** * 比较view是否是由instantiateItem所实例化的 view 当前页面 object:instantiateItem方法返回的值 */ @Override public boolean isViewFromObject(View view, Object object) { return view == object; } /** * 根据位置移除对应的被销毁的控件 */ @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } } }
时间: 2024-10-15 21:45:40