淘宝(阿里百川)手机客户端开发日记第二篇 android首页之顶部轮播特效制作 (二)
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首页之顶部轮播特效制作 (二)的更多相关文章
- 淘宝(阿里百川)手机客户端开发日记第一篇 android 主框架搭建(一)
android 主框架搭建(一) 1.开发环境:Android Studio 相继点击下一步,直接项目建立完毕(如下图) 图片看的效果如果很小,请放大您的浏览器显示百分比 转载请注明http://w ...
- 淘宝(阿里百川)手机客户端开发日记第九篇 Looper详解
public final class Looper: 官方的API: Class used to run a message loop for a thread. Threads by default ...
- 淘宝(阿里百川)手机客户端开发日记第十五篇 JSON解析(四)
解析一个从淘宝传递的JSON (大家如有兴趣可以测试下):{ "tae_item_detail_get_response": { "data": { " ...
- 淘宝(阿里百川)手机客户端开发日记第十二篇 mysql的认识
我这里用的是wamp,大家可以到网上去下载对应的包,自行安装,对于程序员来讲,安装软件大部分都应该不是问题的,所以我不去将具体安装的方法. wamp安装好后,在我们屏幕的右下角, 这样的图标,我们右键 ...
- 淘宝(阿里百川)手机客户端开发日记第十一篇 JSP+Servlet
由于本人从事.net开发已有多年经验,今天由于工作需要,我只能学习下JSP+Servlet,至于java web提供了更好的开发框架MVC,现在由于时间关系,我只好用JSP+Servlet来搭建服务器 ...
- 淘宝(阿里百川)手机客户端开发日记第十四篇 jsp提交含有上传控件表单乱码问题
今天我来总结昨天开发的一个简单的jsp web 应用程序时,在做一个调教表单,从servlet端获取数据,这个表单里含有上传文件控件.如果我们在测试的时候,获取数据的是乱码,这时,大家可以先去掉上传控 ...
- 淘宝(阿里百川)手机客户端开发日记第五篇 SharedPreferences使用详解
我们知道,Android中数据存储技术由于如下几种 1 使用SharedPreferences存储数据 2 文件存储数据 3 SQLite数据库存储数据 4 使用ContentProvider存储数据 ...
- 淘宝(阿里百川)手机客户端开发日记第十篇 阿里百川服务器环境介绍之API文档的快速链接(四)
个人感觉比较重要的快速链接: http://open.taobao.com/doc/detail.htm?id=102513 http://open.taobao.com/doc/detail.htm ...
- 淘宝(阿里百川)手机客户端开发日记第十三篇 mysql的连接
首先,我建立了一个包,里面存放了三个类文件,这三个文件是我从网络中找的,经过自己的整理.(我刚才查找想把这三个文件传上去,可能是自己对cnblogs的博客不太熟悉吧,没有找到,我只好粘贴代码了) 三个 ...
随机推荐
- 【JS笔记】私有变量
1.任何函数中定义的变量都可以认为是私有变量.函数内部可以访问,外部不能访问. 可以通过闭包创建特权方法访问私有变量. function Foo(){ var n=10; this.returnN=f ...
- 常用js正则
selectedName = selectedName.replace(/,$/, '');//去除尾部字符串 selectedCode = selectedCode.replace(/,$/, '' ...
- javascript与服务器3
一, 带参数的XMLHTTP请求 1, 进行get请求 get请求最常见的是在浏览器地址栏中输入URL并打开页面时,这就是向服务器发送一个get请求. 它的限制是URL最大长度不能超过2048字符(2 ...
- PowerDesigner-制作Word导出模版
定制导出模版 当然这不是我们想要的word,下面看如何做一个自定义模版 1. 在工具栏中选择[Report -->Reports],如下图 点击第二个图标创建一个Template,如下图 2. ...
- shell将输入的参数逆序
#! /usr/bin/ksh count=$# //总共输入参数 cmd="echo" while [[ $count -gt 0 ]] do cmd="$cmd \ ...
- CSS中font-style的斜体属性Italic oblique的区别
要搞清楚这个问题,首先要明白字体是怎么回事.一种字体有粗体.斜体.下划线.删除线等诸多属性.但是并不是所有字体都做了这些,一些不常用的字体,或许就只有个正常体,如果你用Italic,就没有效果了~这时 ...
- JSP基本原理
JSP的基本原理: jsp的本质是servlet.jsp通过在标准的HTML页面中嵌入java代码,其静态的部分无需Java程序控制,只有那些需要从数据库读取或需要 动态生成的的页面内容,才使用Jav ...
- TCP/IP详解 学习六
从ip层看路由表 选路策略 选路策略:决定把哪些路由放到路由表的规则. Ip执行选路机制,而路由守护程序则提供选路策略. Netstat –rn 打印路由表,如果没有-n命令会搜索配置文件,将网络地 ...
- JAVA 中SQL字符动态拼接
select SYR,SFZMHM,CJRZH,XSZBH,HPHM,CLSBDH,FDJH,CLLX,ZDYZT,to_char(CCDJRQ,'YYYY-MM-DD') CCDJRQ from V ...
- 简短的几句js实现css压缩和反压缩功能
写在前面 最近一直在整理css,但因为现在Visual Studio 2013太智能了,它每每在我按ctrl+E+D进行格式化代码的时候,就会将css进行层次格式化(如下图所示),而这个格式让我老大实 ...