Android Viewpager广告轮播,带滑动小圆点,继承自PagerAdapter,原生代码,有助于你对广告轮播的理解

版权声明:未经本人允许,转载需要注明出处 https://blog.csdn.net/nazicsdn/article/details/83544936

广告轮播,其实就是继承自适配器,我用的一个线程来工作图片不停的进行播放,用Boolean布尔值判断手指按下的时候,对于图片播放的控制,用适配器里面的destroyItem删除和增加instantiateItem来对图片进行调整,防止出现空白页

MainActivity类,逻辑都在里面写了,没用mvp模式,毕竟这样的一个小代码,用mvc实现很便捷的

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

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
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;

public class MainActivity extends Activity {
	private ViewPager mVp;
	private int [] arr={R.drawable.introduce_01,R.drawable.introduce_02,R.drawable.introduce_03,R.drawable.introduce_04};
	private ImageView mImg1,mImg2,mImg3,mImg4,img;
	private List<View> list=new ArrayList<View>();//存放图片的数据源

	private boolean TouchFlag=false;//触摸锁
	private boolean isFlag=true;//关闭广告轮播的标志
	private int index=0;//当前页面索引值

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initlist();
		initView();
		startTime();//开启定时器
	}
	//找ID的方法
	private void initView() {
		mVp=(ViewPager) findViewById(R.id.mVp);
		mImg1=(ImageView) findViewById(R.id.mImg1);
		mImg2=(ImageView) findViewById(R.id.mImg2);
		mImg3=(ImageView) findViewById(R.id.mImg3);
		mImg4=(ImageView) findViewById(R.id.mImg4);
		//viewpager的滑动监听  页面变化监听
		mVp.setOnPageChangeListener(new OnPageChangeListener() {
			// 正在显示的方法
			//arg0:正在显示的页面的索引
			@Override
			public void onPageSelected(int arg0) {
				// TODO Auto-generated method stub
				index=arg0;
				Log.e("", "当前显示的图片索引:"+arg0);
				clearBottmo();
				switch (arg0) {
				case 0:
					mImg1.setImageResource(R.drawable.vote_n_can_y);
					break;

				case 1:
					mImg2.setImageResource(R.drawable.vote_n_can_y);
					break;
				case 2:
					mImg3.setImageResource(R.drawable.vote_n_can_y);
					break;
				case 3:
					mImg4.setImageResource(R.drawable.vote_n_can_y);
					break;
				}

			}
			//viewpager的滑动的监听的方法  从左到右
			//1。arg0:当前的view的索引
			//2.arg1:偏移量(偏移百分比):0-0.9999999
			//3.arg2: 偏移像素
			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {
				Log.e("", "当前索引:"+arg0);
				Log.e("", "当前偏移量:"+arg1);
				Log.e("", "当前偏移像素:"+arg2);
			}
			// 监听状态改变的方法   arg0:状态值 1:滑动   2:沉降   0:停止
			@Override
			public void onPageScrollStateChanged(int arg0) {
				//滑动
				Log.e("", "11111111"+ViewPager.SCROLL_STATE_DRAGGING);
				//停止
				Log.e("", "000000000"+ViewPager.SCROLL_STATE_IDLE);
				//沉降
				Log.e("", "22222222"+ViewPager.SCROLL_STATE_SETTLING);
				if(arg0==ViewPager.SCROLL_STATE_IDLE){
					TouchFlag=false;
				}else{
					TouchFlag=true;
				}
			}

		});
		ViewPagerScroller scroller=new ViewPagerScroller(this);
		scroller.initViewPagerScroll(mVp);
		mVp.setAdapter(new MyAdapter());
	}
	private Handler hand=new Handler(){
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			if(msg.what==0){
				//人为滑动的时候轮播停止
				if(TouchFlag)
					return;
				if(!isFlag)
					return;
				index++;
				if(index>=list.size())
					index=0;
				mVp.setCurrentItem(index);
			}
		}
	};
	//初始化数据源的方法
	private void initlist(){
		for(int i=0;i<arr.length;i++){
			//ImageView img=new ImageView(this);
			View v=View.inflate(this, R.layout.view_main, null);
			img=(ImageView) v.findViewById(R.id.img);
			img.setImageResource(arr[i]);
			list.add(v);
		}
	}
	//内部类  适配器  PagerAdapter:ViewPager的专用适配器
	private class MyAdapter extends PagerAdapter{

		@Override
		public int getCount() {
			return list.size();
		}
		//   arg0:正在显示的view    arg1:是否在缓存中
		//判断正在显示的View是否在缓存中
		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {
			// TODO Auto-generated method stub
			return arg0==arg1;
		}

		//销毁view的方法
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			// TODO Auto-generated method stub
			//将于正在显示的View无关的索引移除
			container.removeView(list.get(position));
		}
		//container:viewpager的缓存  position:view的下标
		//添加View的方法
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			//将下标对应的View添加到缓存中
			container.addView(list.get(position));
			//将要显示的View返回出去
			return list.get(position);
		}
	}
	//清空底部图片的方法
	private void clearBottmo(){
		mImg1.setImageResource(R.drawable.vote_n_can_n);
		mImg2.setImageResource(R.drawable.vote_n_can_n);
		mImg3.setImageResource(R.drawable.vote_n_can_n);
		mImg4.setImageResource(R.drawable.vote_n_can_n);
	}
	//创建子线程
	private class TimeThread extends Thread{
		@Override
		public void run() {
			//线程休眠
			while(isFlag){
				try {
					Thread.sleep(3000);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				//发送一条空消息
				hand.sendEmptyMessage(0);
			}
		}
	}
	//开启定时器的方法
	private void startTime(){
		new TimeThread().start();
	}
	//关闭定时器的方法
	private void closeTime(){
		isFlag=false;
	}
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		closeTime();
	}
}

下面的一个工具类可有可无,是一个时间控制的工具类,我也分享给大家
ViewPagerScroller

import java.lang.reflect.Field;

import android.annotation.SuppressLint;
import android.content.Context;
import android.support.v4.view.ViewPager;
import android.view.animation.Interpolator;
import android.widget.Scroller;

public  class ViewPagerScroller extends Scroller{
	
	 private int mScrollDuration = 0;             // 滑动速度
	  
	    /**
	     * 设置速度速度
	     * @param duration
	     */
	    public void setScrollDuration(int duration){
	        this.mScrollDuration = duration;
	    }
	      
	    public ViewPagerScroller(Context context) {
	        super(context);
	    }
	  
	    public ViewPagerScroller(Context context, Interpolator interpolator) {
	        super(context, interpolator);
	    }
	  
	    @SuppressLint("NewApi")
		public ViewPagerScroller(Context context, Interpolator interpolator, boolean flywheel) {
	        super(context, interpolator, flywheel);
	    }
	  
	    @Override
	    public void startScroll(int startX, int startY, int dx, int dy, int duration) {
	        super.startScroll(startX, startY, dx, dy, mScrollDuration);
	    }
	  
	    @Override
	    public void startScroll(int startX, int startY, int dx, int dy) {
	        super.startScroll(startX, startY, dx, dy, mScrollDuration);
	    }
	  
	      
	      
	    public void initViewPagerScroll(ViewPager viewPager) {
	        try {
	            Field mScroller = ViewPager.class.getDeclaredField("mScroller");
	            mScroller.setAccessible(true);
	            mScroller.set(viewPager, this);
	        } catch(Exception e) {
	            e.printStackTrace();
	        }
	    }
}

下面是两个布局,用到图片的时候,用开发工具自带的图片就行

<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=".MainActivity" >
	<android.support.v4.view.ViewPager
	    android:id="@+id/mVp"
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    />
	<LinearLayout 
	    android:layout_width="wrap_content"
	    android:layout_height="wrap_content"
	    android:layout_alignParentBottom="true"
	    android:orientation="horizontal"
	    android:layout_marginBottom="30dp"
	    android:layout_centerHorizontal="true"
	    >
	    <ImageView 
	        android:id="@+id/mImg1"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:src="@drawable/vote_n_can_y"
	        />
	     <ImageView 
	        android:id="@+id/mImg2"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:src="@drawable/vote_n_can_n"
	        />
	      <ImageView 
	        android:id="@+id/mImg3"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:src="@drawable/vote_n_can_n"
	        />
	       <ImageView 
	        android:id="@+id/mImg4"
	        android:layout_width="wrap_content"
	        android:layout_height="wrap_content"
	        android:src="@drawable/vote_n_can_n"
	        />
	       
	</LinearLayout>
</RelativeLayout>

下面的布局是存放广播图片的,上面的布局是存放滑动小圆点的

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <ImageView 
        android:id="@+id/img"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:scaleType="fitXY"
        android:src="@drawable/introduce_01"
        />

</LinearLayout>

下面是小圆点文件,一个选中,一个未选中
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/nazicsdn/article/details/83544936