Viewpager(上)--广告自动轮播

本例子是通过ViewPager来实现广告自动轮播,并且实现小圆点的显示和点击监听等功能,算是比较实用的功能了.

此例子可自动播放、滑动和位置的随意调整,比较灵活,原项目中是添加了三级缓存的,不过想之后单写一个缓存的就先拿图片做了个DEMO.

如有什么好的建议,请大家提出来,共同进步..

效果图:

代码结构:主要就是3个文件,主类、viewpager适配器、页面的xml布局

原理网上有很多,所以直接在代码上写比较详细的注释,就不多说了- -

主类

<span style="font-size:14px;">package com.example.viewpagerimage;

import java.util.ArrayList;
import java.util.Timer;
import java.util.TimerTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.annotation.SuppressLint;
import android.app.Activity;

public class MainActivity extends Activity {

	/*存储轮播图片*/
	public int[] myBanner = {R.drawable.banner3,R.drawable.banner2,R.drawable.banner1};
	/*轮播容器viewpager*/
	public ViewPager mViewPager;
	/*viewpager的适配器*/
	public ViewPagerAdapter mViewPagerAdapter;
	/*存放图片资源*/
	public ArrayList<ImageView> mImageList;
	/*存储广告轮播小圆点*/
	public ImageView IVdicator[];
	/*轮播小圆点对象*/
	public View Vdicator;
	/*布小圆点的布局参数*/
	public LinearLayout.LayoutParams mLayoutParams;
	/*定时器*/
	public Timer mTimer;
	public TimerTask mTimerTask;
	public int mTimerNum = 0;

	public final int PICTURE = 0x1;

	@SuppressLint("HandlerLeak")
	Handler mHandler = new Handler() {
		@Override
		public void handleMessage(Message msg) {

			switch(msg.what){
			case PICTURE:
					setmyPagerIndex();
				break;
			}
			super.handleMessage(msg);
		}
	};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    	// 获取屏幕高的5分之2
		@SuppressWarnings("deprecation")
		int screenHeight = this.getWindowManager().getDefaultDisplay().getHeight()/5*2; 

		//设置viewpager的位置
		RelativeLayout layout = (RelativeLayout)this.findViewById(R.id.id_main_layout0);
		RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) layout.getLayoutParams();
		params.height = screenHeight;
		layout.setLayoutParams(params);

        init();
    }

    /**
     * 初始化组建
     * */
    public void init(){

    	mImageList = new ArrayList<ImageView>();
    	IVdicator = new ImageView[myBanner.length];

    	mLayoutParams = new LinearLayout.LayoutParams(10, 10);

		//设置小圆点边框距离
		mLayoutParams.setMargins(7, 10, 7, 10);

		//小圆点对象
    	Vdicator = this.findViewById(R.id.viewpager_indicator);

    	//设置有多少个轮播图和小圆点
    	for(int i = 0; i < myBanner.length; i++){

    		ImageView nowImageView = new ImageView(this);

    		nowImageView.setImageResource(myBanner[i]);

    		mImageList.add(nowImageView);

    		nowImageView = new ImageView(this);

    		nowImageView.setLayoutParams(mLayoutParams);

    		nowImageView.setBackgroundResource(R.drawable.indicator);

    		IVdicator[i] = nowImageView;

    		//一个一个添加小圆点
    		((ViewGroup) Vdicator).addView(IVdicator[i]);
    	}

    	mViewPager = (ViewPager)this.findViewById(R.id.viewpager);

    	mViewPagerAdapter = new ViewPagerAdapter(mImageList,this);

    	//给viewpager添加适配器
    	mViewPager.setAdapter(mViewPagerAdapter);

    	//给viewpager添加滑动监听
    	mViewPager.setOnPageChangeListener(new OnPageChangeListener(){
			@Override
			public void onPageScrollStateChanged(int arg0) {}

			@Override
			public void onPageScrolled(int arg0, float arg1, int arg2) {}

			@Override
			public void onPageSelected(int arg0) {
				setDicator(arg0);
			}
    	});

    	//默认第一个小圆点亮
    	setDicator(0);

    	startTimer();
    }

    /**
     * 开启广告自动轮播
     * */
    public void startTimer(){

    	mTimer = new Timer();
    	mTimerTask = new TimerTask(){
			@Override
			public void run() {

				mTimerNum++;
				//需异步调用
				mHandler.sendEmptyMessage(PICTURE);
			}
    	};

    	//设置4秒轮播一次
    	mTimer.schedule(mTimerTask, 4 * 1000, 4 * 1000);
    }

	/**
	 * 切换广告动画
	 * */
	public void setmyPagerIndex() {

		try{
			if (mTimerNum >= myBanner.length) {
				mTimerNum = 0;
			}
			mViewPager.setCurrentItem(mTimerNum, true);
		}catch(Exception e){
			e.printStackTrace();
		}
	}

    /**
     * 设置小圆点的背景
     * */
    public void setDicator(int j){

    	//设置有多少个轮播图和小圆点
    	for(int i = 0; i < myBanner.length; i++){

    		if(i == j){

				IVdicator[i].setBackgroundResource(R.drawable.indicator_focused);
			}else{

				IVdicator[i].setBackgroundResource(R.drawable.indicator);
			}
    	}
    }

	/**
	 * 停止定时任务
	 * */
	public void stopTask(){
		try{
			mTimer.cancel();
		}catch(Exception e){
			e.printStackTrace();
		}
	}

}
</span>

ViewPager适配器

<span style="font-size:14px;">package com.example.viewpagerimage;

import java.util.ArrayList;
import android.app.Activity;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ImageView;

public class ViewPagerAdapter extends PagerAdapter{

	public ArrayList<ImageView> mImageView;
	public Activity mActivity;

	public ViewPagerAdapter(ArrayList<ImageView> mImageView ,Activity mActivity){

		this.mImageView = mImageView;
		this.mActivity = mActivity;
	}

	@Override
	public int getCount() {
		return mImageView.size();
	}

	/**
	 * 判断两张图片是否一致
	 */
	@Override
	public boolean isViewFromObject(View arg0, Object arg1) {
		return arg0 == arg1;
	}

	/**
	 * 向适配器返回要显示的图片
	 * */
	@Override
	public Object instantiateItem(ViewGroup container, int position) {

		container.addView(mImageView.get(position));

		//广告轮播图点击动作的监听
		View mView = mImageView.get(position);
		mView.setOnClickListener(new OnClickListener(){
			@Override
			public void onClick(View arg0) {
				;
			}
		});
		return mImageView.get(position);
	}

	/**
	 * 从ViewGroup中移除当前view
	 * */
	@Override
	public void destroyItem(ViewGroup container, int position, Object object) {

		container.removeView(mImageView.get(position));
	}

}
</span>

例子唯一一个xml文件

<span style="font-size:14px;"><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:background="#000"
    tools:context=".MainActivity" >

    <RelativeLayout
        android:id="@+id/id_main_layout0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dip"
        android:layout_marginRight="4dip" >

        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <LinearLayout
            android:id="@+id/viewpager_indicator"
            android:layout_width="100dip"
            android:layout_height="20dip"
            android:layout_alignBottom="@id/viewpager"
            android:layout_alignParentRight="true"
            android:layout_marginBottom="12dip"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>

</RelativeLayout></span>

Viewpager(上)--广告自动轮播

时间: 2024-10-15 12:31:26

Viewpager(上)--广告自动轮播的相关文章

ViewPager实现广告自动轮播核心代码(Handler+Thread)

ViewPager数据源是4个线性布局,每个布局里面充满一张高度固定.宽度充满父布局的图片.有4个小圆点跟随ViewPager滑动.轮播原本我是用Timer+TimerTask的,但是问题颇多,很是郁闷.于是看了一下别人的一个仿网易新闻的例子,然后找到了相关代码阅读.原来可以使用while循环+线程休眠来实现重复执行一段代码. 1 private int currentAdsIndex=0; 2 private int viewsCount=4;//轮播广告图片数量 3 4 handler =

广告自动轮播(完美解决人为滑动后按顺序自动轮播)

在手机客户端上,广告的循环播放很是常见,在网上也看过一些Demo,好多写的不是太完整,人为不干预的情况下确实是按照顺序轮播,但是人为去滑动后,接下来的自动轮播不是按滑动后的currentposition播放的,而是按照手动滑动前position的位置跳跃播放的.闲暇之余,把这个问题简单的解决了一下,为后来者提供一些思路. ========================================================================================

Android 实现带指示器的自动轮播式ViewPager

前言 最近在做项目的时候,有个需求就是实现自动轮播式的ViewPager,最直观的例子就是知乎日报顶部的ViewPager,它内部有着好几个子view,每个一段时间便自动滑动到下一个item view,而底部的指示器也随之跟着改变.使用这种ViewPager的好处是在有限的空间内可以展示出多样化的信息.轮播式ViewPager广泛应用于各种应用内部,用于展示广告等.抱着学习和分享的目的,笔者把轮播式ViewPager写成了一个独立的控件,以方便以后的使用. 效果展示 话不多说,我们先来看看实现的

Viewpager图片自动轮播,网络图片加载,图片自动刷新

package com.teffy.viewpager; import java.util.ArrayList; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; import android.annotation.SuppressLint; import android.app.Act

使用ViewPager实现自动轮播

很多APP中都实现了类似引导页的自动轮播,不由得想到昨天的引导页上修改一下代码实现轮播. 其实大体上只需要添加一个线程循环执行就可以了. 同样的先上图 直接上代码,注释都全的,我想这样更有利于理解. 先改了Adapter package com.example.nanchen.taketurnplaydemo; import android.support.v4.view.PagerAdapter; import android.view.View; import android.view.Vi

ViewPager + Handler 实现的图片自动轮播

首先上图看效果 我也是在网上看各种大牛们做的效果,很多都是自定义重写了一些控件来实现这个效果的.我把其中的一位大牛写的ViewPager的效果加上了Handler实现了自动轮播效果,在此做个笔记来以后温习使用! 自动轮播的核心代码如下: private final int AUTO_MSG = 1; private final int HANDLE_MSG = AUTO_MSG + 1; private static final int PHOTO_CHANGE_TIME = 1000;//定时

天猫京东app中常见的上下滚动轮播效果如何实现?

前段时间,公司安排我们团队制作一个上下滚动轮播效果,类似于我们在天猫京东app中常见的这样: 哇kao!那么高大上,完全不会呀??? 幸好,前几天一个朋友在朋友圈分享了一篇推文.瞬间引领我们走出了迷茫,这个教程特别实用! 做法: 创建母版,拖入文字组件,输入文字,将文字组件调整到合适的位置和大小:添加全局手势.复制页面1,将其分别命名为页面2.页面3,并修改文字组件的内容. 通过全局手势,页面1链接到页面2,页面2链接到页面3,页面3链接到页面1:其中在链接页面时,将定时器设置为1秒:动效时长设

手把手教你用ViewPager自定义实现Banner轮播

手把手教你用ViewPager自定义实现Banner轮播 欢迎大家关注Android开源网络框架NoHttp:https://github.com/Y0LANDA/NoHttp 我们在实际开发中,很多App都会在做一个广告轮播器(可能是图片,可能是其他View),很多同学都是使用别人封装好的或者直接使用ViewPager自己来改,但是有人可能并不理解里面的原理,或者有人遇到了手势滑动冲突.我们今天就用150行代码实现一自定义的广告轮播器并不干扰原来View滑动事件. 本例代码源码及Demo传送门

jQuery图片插件自动轮播原理解析

经常看到项目要用到图片轮播效果,一般的操作流程都是先到网上找一个好看的JQuery图片轮播插件,然后看下demo,再配下参数.好了,关机下班回家 其余的就交给插件吧. 是不是感觉有了jQuery,世界变得那么美好呢. 本人最近用的一个插件是 jquery.carousel.js,官方网站是:http://richardscarrott.co.uk/posts/view/jquery-carousel-plugin 下面,我们来讨论一下图片轮播原理. 首先来个简单的demo 效果图如下: 这是个导