自定义类似优酷首页的BannerView幻灯片展示

尼玛,最近自定义view玩hight了根本停不下来,今天想封装一个类似优酷首页title的banner栏,我会在这个基础上加一个title的展示,优酷的banner如下图:

首先是布局文件,自然是ViewPager主打,配上底层的dot indicator和title栏:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/rl_main_advertisement"
    android:layout_width="match_parent"
    android:layout_height="150dip" >

    <android.support.v4.view.ViewPager
        android:id="@+id/vp_banner"
        android:layout_width="match_parent"
        android:layout_height="150dip" />

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="25dip"
        android:layout_alignParentBottom="true"
        android:background="@color/bkg_dot_area_of_banner" >

        <LinearLayout
            android:id="@+id/ll_banner_dot_area"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_centerVertical="true"
            android:layout_marginRight="10dip"
            android:orientation="horizontal" >

        </LinearLayout>

        <TextView
            android:id="@+id/tv_banner_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginLeft="20dip"
            android:layout_marginRight="10dip"
            android:layout_toLeftOf="@id/ll_banner_dot_area"
            android:singleLine="true"
            android:text="title1"
            android:textColor="@color/white"
            android:textSize="15sp" />
    </RelativeLayout>

</RelativeLayout>

中间的线性布局是为了动态添加dot indecator,很简单,下面是代码:

package com.amuro.banner_view;

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

import com.amuro.bannerviewtest.R;

import android.annotation.SuppressLint;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;

public class BannerView extends FrameLayout
{
	private ViewPager viewPager;
	private List<ImageView> imageViews;
	private List<ImageView> imageViewDots;
	private LinearLayout linearLayoutDotArea;
	private TextView textViewBanner;

	private ScheduledExecutorService scheduledExecutorService;
	private int currentItem = 0;

	@SuppressLint("HandlerLeak")
	private Handler handler = new Handler()
	{
		public void handleMessage(Message msg)
		{
			viewPager.setCurrentItem(currentItem);
		}
	};

	public BannerView(Context context, AttributeSet attrs)
	{
		super(context, attrs);
		LayoutInflater.from(context).inflate(R.layout.banner_view_layout, this);
		initView();
	}

	private void initView()
	{
		viewPager = (ViewPager)findViewById(R.id.vp_banner);
		textViewBanner = (TextView)findViewById(R.id.tv_banner_title);
		linearLayoutDotArea = (LinearLayout)findViewById(R.id.ll_banner_dot_area);
	}

	public void setView(final int[] imageIds, final String[] titles, int count)
	{
		initImageViews(imageIds, count);
		initImageViewDots(count);

		viewPager.setAdapter(new BannerViewPagerAdapter(imageViews));
		viewPager.setOnPageChangeListener(new OnPageChangeListener()
		{
			private int oldPosition = 0;

			@Override
			public void onPageSelected(int position)
			{
				imageViewDots.get(position).setImageResource(R.drawable.icon_dot_selected);
				imageViewDots.get(oldPosition).setImageResource(R.drawable.icon_dot_unselected);

				oldPosition = position;
				currentItem = position;

				textViewBanner.setText(titles[position]);
			}

			@Override
			public void onPageScrolled(int position, float positionOffset,
					int positionOffsetPixels)
			{

			}

			@Override
			public void onPageScrollStateChanged(int state)
			{

			}
		});
	}

	private void initImageViews(int[] imageIds, int count)
	{
		imageViews = new ArrayList<ImageView>();
		for(int i = 0;i < count;i++)
		{
			ImageView imageView = new ImageView(getContext());
			imageView.setImageResource(imageIds[i]);
			imageView.setScaleType(ScaleType.FIT_XY);
			imageViews.add(imageView);
		}
	}

	private void initImageViewDots(int count)
	{
		imageViewDots = new ArrayList<ImageView>();

		for(int i = 0; i < count; i++)
		{
			ImageView imageView = new ImageView(getContext());
			if(i == 0)
			{
				imageView.setImageResource(R.drawable.icon_dot_selected);
			}
			else
			{
				android.widget.LinearLayout.LayoutParams params =
						new android.widget.LinearLayout.LayoutParams(
								LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
				params.setMargins(DisplayUtils.dip2px(getContext(), 5), 0, 0, 0);

				imageView.setImageResource(R.drawable.icon_dot_unselected);
				imageView.setLayoutParams(params);

			}
			linearLayoutDotArea.addView(imageView);
			imageViewDots.add(imageView);
		}

	}

	public void startPlay()
	{
		scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutorService.scheduleAtFixedRate(new ViewPagerAutoScrollTask(), 3, 3, TimeUnit.SECONDS);
	}

	public void stopPlay()
	{
		scheduledExecutorService.shutdown();
	}

	private class ViewPagerAutoScrollTask implements Runnable
	{  

        public void run()
        {
            synchronized (viewPager)
            {
                currentItem = (currentItem + 1) % imageViews.size();
                handler.obtainMessage().sendToTarget();
            }
        }  

    }
}

这个BannerView可由调用者自行设置数量,动态添加view,在setView的时候把资源文件传入就可以了。

好了,今天不装逼了,上一下最终效果图:

啊啊啊啊啊啊啊,炮姐好帅啊……

时间: 2024-10-31 15:14:14

自定义类似优酷首页的BannerView幻灯片展示的相关文章

android之官方导航栏ActionBar(三)之高仿优酷首页

一.问题概述 通过上两篇文章,我们对如何使用ActionBar大致都已经有了认识.在实际应用中,我们更多的是定制ActionBar,那么就需要我们重写或者定义一些样式来修饰ActionBar,来满足具体的需要.我们就以优酷首页为例,一起学习下ActionBar的综合应用. 二.Android系统ActionBar样式的定义 首先,我们先认识一下android系统中是如何定义ActionBar样式的,这里我们以Theme.Holo.Light主题为例,通过源码我们可以看到在该主题中关于Action

自定义View(一)-ViewGroup实现优酷菜单

自定义View的第一个学习案例 ViewGroup是自动以View中比较常用也比较简单的一种方式,通过组合现有的UI控件,绘制出一个全新的View 效果如下: 主类实现如下: package com.demo.youku; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.Toolbar; import android.view.K

Android优酷菜单组件自定义

主要做的就是模仿优酷手机客户端的底部菜单控件的实现.先来几张图片,点击中间的home,显示二级菜单,点击二级菜单的menu,显示三级菜单. 这是实现起来最简单的一个布局,但是从中学会了自定义动画和一些布局的基本知识,从中还是收获很大的. 首先是定义布局文件,三个菜单条其实就是三个relativelayout,level1,level2,level3,然后每个菜单条中的小标题就加到对应的相对布局中. <RelativeLayout xmlns:android="http://schemas.

Jquery Mobile实例--利用优酷JSON接口读取视频数据

本文将介绍,如何利用JqueryMobile调用优酷API JSON接口显示视频数据. (1)注册用户接口. 首页,到 http://open.youku.com 注册一个账户,并通过验证.然后找到API接口 (http://open.youku.com/docs/tech_doc.html) 可以看到优酷提供不少API,本文将演示“通过视频关键词”接口. 点击进去后,会发现client_id和keyword是必填的,因此,未来构造的URL应该类似 https://openapi.youku.c

优酷、YouTube、Twitter及JustinTV视频网站架构设计

优酷视频网站架构 一.网站基本数据概览 据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最高的厂商.     硬件方面,优酷网引进的戴尔服务器主要以 PowerEdge 1950与PowerEdge 860为主,存储阵列以戴尔MD1000为主,2007的数据表明,优酷网已有1000多台服务器遍布在全国各大省市,现在应该更多了吧. 二.网站前端框架 从一开始,优酷网就自建了一套CMS来解决前

爱奇艺、优酷、腾讯视频竞品分析报告2016(二)

接上一篇<爱奇艺.优酷.腾讯视频竞品分析报告2016(一)> http://milkyqueen520.blog.51cto.com/11233158/1760192 2.4 产品设计与交互 2.4.1  视觉风格 APP设计风格从视觉效果上至少给用户传达了两个信息:一是APP的整体基调.二是APP的目标人群. 在设计风格表现上,颜色占据了80%以上的视觉体验.因此要做好设计风格,主要做好界面的颜色搭配和分布.另外颜色是有情感的,不同的色彩能给于用户不同的印象和感受,而且不同的人群对颜色偏好也

优酷、YouTube、Twitter及JustinTV几个视频网站的架构

  优酷视频网站架构 一.网站基本数据概览据2010年统计,优酷网日均独立访问人数(uv)达到了8900万,日均访问量(pv)更是达到了17亿,优酷凭借这一数据成为google榜单中国内视频网站排名最高的厂商.硬件方面,优酷网引进的戴尔服务器主要以 PowerEdge 1950与PowerEdge 860为主,存储阵列以戴尔MD1000为主,2007的数据表明,优酷网已有1000多台服务器遍布在全国各大省市,现在应该更多了吧.二.网站前端框架从一开始,优酷网就自建了一套CMS来解决前端的页面显示

放优酷系统

目录 一.项目总结三步骤 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.数据库设计 六.项目中各个功能模块分析 七.项目中遇到的问题及怎么解决的 八.客户端代码框架 一.项目总结三步走 二.项目需求分析 三.搭建框架 四.ORM框架分析 五.功能分析 六.项目开发--放优酷 服务端client start.py ---- 启动文件 conf --setting.py-------项目配置 core --- src.py --- 首页视图 core --- admin.py --- 管理

怎么用硕鼠下载优酷专辑

大家都有在优酷或者土豆上下载视频教程的经历吧?想自学或者补习某一科目的人很多,可是优酷上的专辑和土豆上的豆单这样的一大堆视频还是很不容易下载到手的.今天就给大家介绍一个比较有效率的办法,至少不用一个地址一个地址地获取然后右键另存为了. 方法/步骤 1 以在优酷上下载电子科大47集的<电路分析基础>为例.其专辑页面地址为http://www.youku.com/playlist_show/id_2312805.html(注意:一定是专辑首页地址,别弄第一集的播放地址)   复制下来之后前往FLV