1.我们来设计flash_slide.xml 布局,这个xml主要做成模块化,方便其它的activity可以动态去调用。

flash_slide.xml内容如下:

<?xml version="1.0" encoding="utf-8"?>

<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/flash_content"
android:layout_width="match_parent"
android:layout_height="match_parent" />

<LinearLayout

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:gravity="center"

android:background="#000000"

>

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/dot_focus"

/>

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:src="@drawable/dot_blur"

android:layout_marginLeft="6dp"

/>

  </LinearLayout>

</RelativeLayout>

效果如图:

现在,我们开始建立对应的代码,新建一个com.yushengbo.widget包,在此包下,建立一个继承自FrameLayout的自定义的View类。

package com.yushengbo.widget;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import android.content.Context;
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.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.yushengbo.flashdemo.R;

public class FlashSlide extends FrameLayout {

	private List<ImageView> circleDotList; //原點
	private List<ImageView> imgagesList; //圖片
	private int[] resouceIds = {
			R.drawable.flash1,
			R.drawable.flash2,
			R.drawable.flash3,
			R.drawable.flash4,
			R.drawable.flash5 };

	private int curItemIndex=0; //當前選中的圖片

    //定时任务
    private ScheduledExecutorService scheduledExecutorService;

	private ViewPager viewPager;
	private Context context;

	public FlashSlide(Context context) {

		this(context,null);

	}

	public FlashSlide(Context context, AttributeSet attrs) {
		this(context, attrs,0);
	}

	public FlashSlide(Context context, AttributeSet attrs, int defStyleAttr) {
		super(context, attrs, defStyleAttr);

		this.context = context;

		InitUi();
		startPlay();
	}

	void InitUi()
	{          //加载布局
		LayoutInflater.from(context).inflate(R.layout.flash_slide, this,true);

		LinearLayout dotLayout = (LinearLayout)findViewById(R.id.dotLayout);
		dotLayout.removeAllViews();

		imgagesList = new ArrayList<ImageView>();
		circleDotList = new ArrayList<ImageView>();
		//装载图片和圆点
		for(int i=0;i<resouceIds.length;i++)
		{
			ImageView iv = new ImageView(context);
			iv.setImageResource(resouceIds[i]);

			ImageView ic= new ImageView(context);
			ic.setTag(i);
			if(i==0)
			{
				ic.setImageResource(R.drawable.dot_focus);
			}
			else
			{
				ic.setImageResource(R.drawable.dot_blur);
			}

			imgagesList.add(iv);
		   //设置圆点间距
		    LinearLayout.LayoutParams params = new LinearLayout.LayoutParams
				   (LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

			params.leftMargin = 5;

			dotLayout.addView(ic,params);

			circleDotList.add(ic);
		}

		//初始化ViewPager
		viewPager = (ViewPager)findViewById(R.id.flash_content);
		viewPager.setCurrentItem(curItemIndex);         //设定适配器
		viewPager.setAdapter(new FlashPageAdapter());           //设定监听器
		viewPager.setOnPageChangeListener(new MyPageChangeListener());

	}

	  /**
     * 开始轮播图切换
     */
    private void startPlay(){
        scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new MyThread(), 1, 4, TimeUnit.SECONDS);
    }

	class FlashPageAdapter extends PagerAdapter
	{

		@Override
		public int getCount() {

			return imgagesList.size();
		}

		@Override
		public boolean isViewFromObject(View arg0, Object arg1) {

			return arg0 == arg1;
		}

		@Override
		public void destroyItem(View container, int position, Object object) {
			((ViewPager)container).removeView(imgagesList.get(position));
		}

		@Override
		public Object instantiateItem(View container, int position) {

			((ViewPager)container).addView(imgagesList.get(position),LayoutParams.MATCH_PARENT
					, LayoutParams.MATCH_PARENT);

			return ((ViewPager)container).getChildAt(position);
		}

	}

	class MyPageChangeListener implements OnPageChangeListener
	{

		@Override
		public void onPageScrollStateChanged(int arg0) {

		}

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

		}

		@Override
		public void onPageSelected(int arg0) {
			curItemIndex = arg0;
			viewPager.setCurrentItem(arg0);
			LinearLayout dotLayout = (LinearLayout)findViewById(R.id.dotLayout);

			for(int i=0;i<circleDotList.size();i++)
			{
				ImageView iv = (ImageView) dotLayout.findViewWithTag(i);
				if(i==arg0)
				{
					iv.setImageResource(R.drawable.dot_focus);
				}
				else
				{
					iv.setImageResource(R.drawable.dot_blur);
				}
			}

		}

	}

	Handler handler = new Handler(){

		@Override
		public void handleMessage(Message msg) {
			viewPager.setCurrentItem(msg.what);
		}
	};

	class MyThread implements Runnable
	{
		@Override
		public void run() {
			Message msg = handler.obtainMessage();
			curItemIndex = (curItemIndex+1)%imgagesList.size();
			msg.what = curItemIndex;
			handler.sendMessage(msg);
		}

	}

}

最终效果图:


  转载请注明http://www.cnblogs.com/yushengbo,否则将追究版权责任! 

淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播特效制作 (二)的更多相关文章

  1. 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)

    android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比  转载请注明http://w ...

  2. 淘宝(阿里百川)手机客户端开发日记第九篇 Looper详解

    public final class Looper: 官方的API: Class used to run a message loop for a thread. Threads by default ...

  3. 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)

    解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...

  4. 淘宝(阿里百川)手机客户端开发日记第十二篇 mysql的认识

    我这里用的是wamp,大家可以到网上去下载对应的包,自行安装,对于程序员来讲,安装软件大部分都应该不是问题的,所以我不去将具体安装的方法. wamp安装好后,在我们屏幕的右下角, 这样的图标,我们右键 ...

  5. 淘宝(阿里百川)手机客户端开发日记第十一篇 JSP+Servlet

    由于本人从事.net开发已有多年经验,今天由于工作需要,我只能学习下JSP+Servlet,至于java web提供了更好的开发框架MVC,现在由于时间关系,我只好用JSP+Servlet来搭建服务器 ...

  6. 淘宝(阿里百川)手机客户端开发日记第十四篇 jsp提交含有上传控件表单乱码问题

    今天我来总结昨天开发的一个简单的jsp web 应用程序时,在做一个调教表单,从servlet端获取数据,这个表单里含有上传文件控件.如果我们在测试的时候,获取数据的是乱码,这时,大家可以先去掉上传控 ...

  7. 淘宝(阿里百川)手机客户端开发日记第五篇 SharedPreferences使用详解

    我们知道,Android中数据存储技术由于如下几种 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 ...

  8. 淘宝(阿里百川)手机客户端开发日记第十篇 阿里百川服务器环境介绍之API文档的快速链接(四)

    个人感觉比较重要的快速链接: http://open.taobao.com/doc/detail.htm?id=102513 http://open.taobao.com/doc/detail.htm ...

  9. 淘宝(阿里百川)手机客户端开发日记第十三篇 mysql的连接

    首先,我建立了一个包,里面存放了三个类文件,这三个文件是我从网络中找的,经过自己的整理.(我刚才查找想把这三个文件传上去,可能是自己对cnblogs的博客不太熟悉吧,没有找到,我只好粘贴代码了) 三个 ...

随机推荐

  1. BASE64Decoder 编码(sun.jar)

    Base64 是网络上最常见的用于传输8Bit 字节代码的编码方式之一,大家可以查看RFC2045 -RFC2049 ,上面有MIME 的详细规范.  Base64 要求把每三个8Bit 的字节转换为

  2. powerdesigner 绘制表关系和导出sql

    1.生成图(A图,B图) 2.创建关系(palette工具栏里有个线条,主表子表关系连接即可,拖动是由顺序的,一对多即从A表往B表连接) 3.这里小说一下   一开始是CDM模式,可以在软件最顶层看到 ...

  3. C# HttpWebRequest提交数据方式浅析

    C# HttpWebRequest提交数据方式学习之前我们先来看看什么是HttpWebRequest,它是 .net 基类库中的一个类,在命名空间 System.Net 下面,用来使用户通过HTTP协 ...

  4. js监听键盘回车

    //监听回车 $(document).keydown(function(e) { ) { $("#btnLogin").click(); } }) //input绑定回车 $('# ...

  5. ThinkPHP中的跨控制器调用与框架执行流程

    一.跨控制器调用 UserController.class.php <?php namespace Home/Controller use Think/Controller class User ...

  6. gradle构建android项目

    工具: Android Studio2.0 gradle-2.10 一.Android常识 在做Android开发的时候我们首先必须要有一个SDK.一般SDK的主要作用就是将硬件和软件进行分离,做软件 ...

  7. 每天一个linux命令(14):which命令

    我们经常在linux要查找某个文件,但不知道放在哪里了,可以使用下面的一些命令来搜索:        which  查看可执行文件的位置.       whereis 查看文件的位置.         ...

  8. 读JS高级(兼容&&BOM&&私有变量&&面向对象)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. Java-set

    set public interface Set<E> extends Collection<E> 使用集合汇总 package 集合类.Set类; /** * Set不允许重 ...

  10. python_元组

    元组 元组是用圆括号括起来的,其中的元素之间用逗号隔开.(都是英文半角) >>># 变量引用 str >>> s = "abc" >> ...