所谓的轮番切换广告栏,指的是下面这个东西,笔主不知道该怎么确切描述这货...

笔主没有百度研究过其他大牛是怎么实现这个功能的,在这里笔主充分发挥DIY精神,利用ViewFlipper闭门土制了一个,下面尽笔主所能,将整个仿造过程所需的全部技能一次性放送出来,先上效果图!

(不保证以上广告真实性...)

素材:请自行百度图片,美女尤佳

圆点:1:  2:

ViewFlipper

android自带的ViewFlipper类提供了定时自动轮放内置View对象的功能,基本上这个博文所需要的大部分功能其实都已经现成实现了。。

但是有一个缺陷,原生的ViewFlipper并不提供自动播放时切换回调的监听器,就是说,图片广告切换的时候,你并不知道什么时候切换的,也不知道切换到了哪一张图,笔主通过研究源代码,继承派生了一个新的 NotifiableViewFlipper ,目的就是为了提供上述回调所需的监听器,代码如下

 import android.content.Context;
import android.util.AttributeSet;
import android.widget.ViewFlipper; /**
*
* @author wavky.wand
*
*/
public class NotifiableViewFlipper extends ViewFlipper { private OnFlipListener onFlipListener; public static interface OnFlipListener {
public void onShowPrevious(NotifiableViewFlipper flipper); public void onShowNext(NotifiableViewFlipper flipper);
} public void setOnFlipListener(
OnFlipListener onFlipListener) {
this.onFlipListener = onFlipListener;
} public NotifiableViewFlipper(Context context) {
super(context);
} public NotifiableViewFlipper(Context context, AttributeSet attrs) {
super(context, attrs);
} @Override
public void showPrevious() {
super.showPrevious();
if(hasFlipListener()){
onFlipListener.onShowPrevious(this);
}
} @Override
public void showNext() {
super.showNext();
if(hasFlipListener()){
onFlipListener.onShowNext(this);
}
} private boolean hasFlipListener() {
return onFlipListener != null;
}
}

布局文件:

笔主使用 RadioButton组 作为标记显示播放进度的那排小圆点,关于 RadioButton 的布局参数,如果遇到问题,请先参考博文 Android中使用RadioButton代替ImageButton

 <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="#333"
android:orientation="vertical" > <wavky.wand.NotifiableViewFlipper
android:id="@+id/viewFlipper_AD"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:animateFirstView="true"
android:autoStart="true"
android:flipInterval="2000"
android:inAnimation="@anim/left_in"
android:minHeight="100dp"
android:outAnimation="@anim/left_out" /> <RadioGroup
android:id="@+id/radioGroup_flipperPoints"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/viewFlipper_AD"
android:layout_centerHorizontal="true"
android:layout_marginBottom="10dp"
android:orientation="horizontal" > <RadioButton
android:id="@+id/radioButton_flipperPoint0"
style="@style/radioStyle_ADPoint"
android:checked="true" /> <RadioButton
android:id="@+id/radioButton_flipperPoint1"
style="@style/radioStyle_ADPoint" /> <RadioButton
android:id="@+id/radioButton_flipperPoint2"
style="@style/radioStyle_ADPoint" /> <RadioButton
android:id="@+id/radioButton_flipperPoint3"
style="@style/radioStyle_ADPoint" /> <RadioButton
android:id="@+id/radioButton_flipperPoint4"
style="@style/radioStyle_ADPoint" /> <RadioButton
android:id="@+id/radioButton_flipperPoint5"
style="@style/radioStyle_ADPoint" />
</RadioGroup> </RelativeLayout>

RadioButton的style脚本(截取):

     <style name="radioStyle_ADPoint">
<item name="android:gravity">center</item>
<item name="android:layout_width">wrap_content</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:layout_gravity">center</item>
<item name="android:button">@null</item>
<item name="android:background">@null</item>
<item name="android:clickable">false</item>
<item name="android:drawableLeft">@drawable/radio_adpoint</item>
<item name="android:layout_marginLeft">8dp</item>
</style>

Activity实现类:

 package wavky.wand.activity;

 import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.Toast; import wavky.wand.R;
import wavky.wand.activity.base.NotifiableViewFlipper;
import wavky.wand.activity.base.NotifiableViewFlipper.OnFlipListener; /**
*
* @author wavky.wand
*
*/
public class HomeActivity extends Activity{ // 轮番广告Flipper
private NotifiableViewFlipper adViewFlipper; // Flipper内的ImageView数组,保留引用,目前没什么用
private ImageView[] adFlipperImageViews; // 这里放六个具体广告图片的id
private int[] adIds = { R.drawable.home_ad_banner,
R.drawable.home_ad_banner, R.drawable.home_ad_banner,
R.drawable.home_ad_banner, R.drawable.home_ad_banner,
R.drawable.home_ad_banner }; // 轮番广告进度锚点(小圆点)
private RadioGroup adPointRadioGroup; // 六个小圆点的id
private static final int[] AD_POINT_IDS = { R.id.radioButton_flipperPoint0,
R.id.radioButton_flipperPoint1, R.id.radioButton_flipperPoint2,
R.id.radioButton_flipperPoint3, R.id.radioButton_flipperPoint4,
R.id.radioButton_flipperPoint5 }; // 广告数量
private static final int AD_FLIPPER_COUNT = AD_POINT_IDS.length; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
adViewFlipper = (NotifiableViewFlipper) findViewById(R.id.viewFlipper_AD);
adPointRadioGroup = (RadioGroup) findViewById(R.id.radioGroup_flipperPoints);
adViewFlipper.setOnFlipListener(adFlipListener);
addAdFlipperImageViews();
} /**
* 初始化插入轮番广告
*/
private void addAdFlipperImageViews() {
adFlipperImageViews = new ImageView[AD_FLIPPER_COUNT];
for (int i = 0; i < AD_FLIPPER_COUNT; i++) {
ImageView imageView = makeAdFlipperImageView();
imageView.setImageResource(adIds[i]);
imageView.setOnClickListener(adFlipperImageViewListener);
adFlipperImageViews[i] = imageView;
adViewFlipper.addView(imageView);
}
} /**
* 工厂生产轮番广告容器ImageView对象
* @return
*/
private ImageView makeAdFlipperImageView() {
ImageView i = new ImageView(this);
i.setBackgroundColor(0xFF000000);
i.setScaleType(ImageView.ScaleType.FIT_CENTER);
i.setLayoutParams(new NotifiableViewFlipper.LayoutParams(
NotifiableViewFlipper.LayoutParams.MATCH_PARENT,
NotifiableViewFlipper.LayoutParams.MATCH_PARENT));
return i;
} /**
* 每个广告的点击事件监听器
*/
private OnClickListener adFlipperImageViewListener = new OnClickListener() { @Override
public void onClick(View v) {
Toast.makeText(HomeActivity.this, "广告 " + adViewFlipper.getDisplayedChild(), Toast.LENGTH_SHORT).show();
}
}; /**
* 轮番广告切换监听器,更新进度标记锚点的显示
*/
private OnFlipListener adFlipListener = new OnFlipListener() { @Override
public void onShowPrevious(NotifiableViewFlipper flipper) {
adPointRadioGroup.check(AD_POINT_IDS[flipper.getDisplayedChild()]);
} @Override
public void onShowNext(NotifiableViewFlipper flipper) {
adPointRadioGroup.check(AD_POINT_IDS[flipper.getDisplayedChild()]);
}
};
}

上述代码或存在引用包缺少、错误,缺少package指向,style文件头不完整等小问题,包括监听器具体功能的实现,请各位批判性自行调整修改。

完毕。

Android-使用ViewFlipper实现轮番切换广告栏的更多相关文章

  1. UI特效--Android利用ViewFlipper实现屏幕切换动画效果

    .屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面.2.介绍ViewFilpper类ViewFl ...

  2. Android利用ViewFlipper实现屏幕切换动画效果

    1.屏幕切换指的是在同一个Activity内屏幕见的切换,最长见的情况就是在一个FrameLayout内有多个页面,比如一个系统设置页面:一个个性化设置页面. 2.介绍ViewFilpper类 Vie ...

  3. Android 通过ViewFlipper实现广告轮播功能并可以通过手势滑动进行广告切换

    为了实现广告轮播功能,在网上找了很多方法,有的效果很好,但是代码太麻烦,并且大多是用的viewpager,总之不是很满意. 于是看了一下sdk有个控件是ViewFlipper,使用比较方便,于是尝试了 ...

  4. Android 中利用ViewFlipper 滑动屏幕切换页面,ListView展示数据

    首先新建一个Android项目,命名为ViewFlipperTest 如图:项目机构,本项目主要操作图中红色箭头标注的文件 1.HgroupAdapter.java文件代码↓主要实现listview数 ...

  5. Android使用ViewFlipper实现左右滑动效果面

    在我的博客中,上次是使用ViewPager实现左右滑动的效果的,请看文章:Android使用ViewPager实现左右滑动效果. 这次我来使用ViewFlipper实现这种效果,好了,先看看效果吧: ...

  6. android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

    首先我们还是看一些示例:(网易,新浪,百度) 显示效果都不错,可是手感就不一样了,百度最棒,网易还行,新浪就操作很不好,这里我说的是滑动切换图片.自己可以测试一下.不得不说牛叉的公司确实有哦牛叉的道理 ...

  7. 【转】Android android listview的HeadView左右切换图片(仿新浪,网易,百度等切换图片)

    首先我们还是看一些示例:(网易,新浪,百度)      下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个vie ...

  8. 【转】android ViewPager,ViewFlipper,ViewFlow实现左右滑动

    转自:http://blog.csdn.net/zhouyuanjing/article/details/8290454 开篇 首页只是作为ViewPager,ViewFlipper,ViewFlow ...

  9. android之ViewFlipper

    xml文件 activity-main.xml <ViewFlipper xmlns:android="http://schemas.android.com/apk/res/andro ...

随机推荐

  1. SpringBoot学习(1)

    springboot的自动配置功能,主要流程如下: 1 启动的时候加载我们的主配置类,也就是我们的入口类:从而开启我们的自动配置配置功能,这个是通过@EnableAutoConfiguration注解 ...

  2. Leecode刷题之旅-C语言/python-118杨辉三角

    /* * @lc app=leetcode.cn id=118 lang=c * * [118] 杨辉三角 * * https://leetcode-cn.com/problems/pascals-t ...

  3. GDOI DAY1游记

    今天,是本蒟蒻的第一次参加GDOI,真激动! 今天,是GDOI第一天,昨天熬夜打代码,今天早上状态十分不好,于是... 进入了考场,叫我们自由打一会代码,于是...打了一坨AC机,重要的是错了(额.. ...

  4. R语言学习笔记(六): 列表及数据框的访问

    List R语言中各组件的名称叫做标签(tags),访问列表有3种方法: j$salary 通过标签名字访问,只要不引起歧义,可以只写出前几个字母. j[['sal']] 夹在两个中括号时引号里的标签 ...

  5. Linux(centos)搭建SVN服务器完美方案及遇到的问题--费元星站长

    QQ:971751392 (欢迎交流) linux搭建SVN服务器 安装步骤如下: 1.yum install subversion   2.输入rpm -ql subversion查看安装位置,如下 ...

  6. CDateTimeUI类源码分析

    CDateTimeUI是duilib里选择日期的控件,继承于CLabelUI控件,用于记录已经选择的日期,选择控件则是调用win32的日期选择控件. CDateTimeUI包含两个类,一个是CDate ...

  7. Java Set集合(HashSet、TreeSet)

    什么是HashSet?操作过程是怎么样的? 1.HashSet底层实际上是一个HashMap,HashMap底层采用了哈希表数据结构 2.哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素 ...

  8. jmeter接口测试--响应结果Unicode转码成中文

    jmeter接口测试-响应结果Unicode转码成中文 一般情况下,接口返回数据都会经过加密,所以有时相应结果会显示为Unicode,因此,需添加BeanShell PostProcessor,加入代 ...

  9. 【java并发编程实战】第八章:线程池的使用

    1.线程饥饿锁 定义:在线程池中,如果任务的执行依赖其他任务,那么可能会产生线程饥饿锁.尤其是单线程线程池. 示例: public class ThreadDeadStarveTest { publi ...

  10. day-12 python实现简单线性回归和多元线性回归算法

    1.问题引入  在统计学中,线性回归是利用称为线性回归方程的最小二乘函数对一个或多个自变量和因变量之间关系进行建模的一种回归分析.这种函数是一个或多个称为回归系数的模型参数的线性组合.一个带有一个自变 ...