Android-使用ViewFlipper实现轮番切换广告栏

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

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

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

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

圆点:1:  2:

ViewFlipper

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

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

 1 import android.content.Context;
 2 import android.util.AttributeSet;
 3 import android.widget.ViewFlipper;
 4
 5 /**
 6  *
 7  * @author wavky.wand
 8  *
 9  */
10 public class NotifiableViewFlipper extends ViewFlipper {
11
12     private OnFlipListener onFlipListener;
13
14     public static interface OnFlipListener {
15         public void onShowPrevious(NotifiableViewFlipper flipper);
16
17         public void onShowNext(NotifiableViewFlipper flipper);
18     }
19
20     public void setOnFlipListener(
21             OnFlipListener onFlipListener) {
22         this.onFlipListener = onFlipListener;
23     }
24
25     public NotifiableViewFlipper(Context context) {
26         super(context);
27     }
28
29     public NotifiableViewFlipper(Context context, AttributeSet attrs) {
30         super(context, attrs);
31     }
32
33     @Override
34     public void showPrevious() {
35         super.showPrevious();
36         if(hasFlipListener()){
37             onFlipListener.onShowPrevious(this);
38         }
39     }
40
41     @Override
42     public void showNext() {
43         super.showNext();
44         if(hasFlipListener()){
45             onFlipListener.onShowNext(this);
46         }
47     }
48
49     private boolean hasFlipListener() {
50         return onFlipListener != null;
51     }
52 }

布局文件:

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

 1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
 2     xmlns:tools="http://schemas.android.com/tools"
 3     android:layout_width="match_parent"
 4     android:layout_height="match_parent"
 5     android:background="#333"
 6     android:orientation="vertical" >
 7
 8     <wavky.wand.NotifiableViewFlipper
 9         android:id="@+id/viewFlipper_AD"
10         android:layout_width="match_parent"
11         android:layout_height="wrap_content"
12         android:layout_alignParentLeft="true"
13         android:layout_alignParentTop="true"
14         android:animateFirstView="true"
15         android:autoStart="true"
16         android:flipInterval="2000"
17         android:inAnimation="@anim/left_in"
18         android:minHeight="100dp"
19         android:outAnimation="@anim/left_out" />
20
21     <RadioGroup
22         android:id="@+id/radioGroup_flipperPoints"
23         android:layout_width="wrap_content"
24         android:layout_height="wrap_content"
25         android:layout_alignBottom="@+id/viewFlipper_AD"
26         android:layout_centerHorizontal="true"
27         android:layout_marginBottom="10dp"
28         android:orientation="horizontal" >
29
30         <RadioButton
31             android:id="@+id/radioButton_flipperPoint0"
32             style="@style/radioStyle_ADPoint"
33             android:checked="true" />
34
35         <RadioButton
36             android:id="@+id/radioButton_flipperPoint1"
37             style="@style/radioStyle_ADPoint" />
38
39         <RadioButton
40             android:id="@+id/radioButton_flipperPoint2"
41             style="@style/radioStyle_ADPoint" />
42
43         <RadioButton
44             android:id="@+id/radioButton_flipperPoint3"
45             style="@style/radioStyle_ADPoint" />
46
47         <RadioButton
48             android:id="@+id/radioButton_flipperPoint4"
49             style="@style/radioStyle_ADPoint" />
50
51         <RadioButton
52             android:id="@+id/radioButton_flipperPoint5"
53             style="@style/radioStyle_ADPoint" />
54     </RadioGroup>
55
56 </RelativeLayout>

RadioButton的style脚本(截取):

 1     <style name="radioStyle_ADPoint">
 2         <item name="android:gravity">center</item>
 3         <item name="android:layout_width">wrap_content</item>
 4         <item name="android:layout_height">wrap_content</item>
 5         <item name="android:layout_gravity">center</item>
 6         <item name="android:button">@null</item>
 7         <item name="android:background">@null</item>
 8         <item name="android:clickable">false</item>
 9         <item name="android:drawableLeft">@drawable/radio_adpoint</item>
10         <item name="android:layout_marginLeft">8dp</item>
11     </style>

Activity实现类:

  1 package wavky.wand.activity;
  2
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.view.View;
  6 import android.view.View.OnClickListener;
  7 import android.widget.ImageView;
  8 import android.widget.RadioGroup;
  9 import android.widget.Toast;
 10
 11 import wavky.wand.R;
 12 import wavky.wand.activity.base.NotifiableViewFlipper;
 13 import wavky.wand.activity.base.NotifiableViewFlipper.OnFlipListener;
 14
 15 /**
 16  *
 17  * @author wavky.wand
 18  *
 19  */
 20 public class HomeActivity extends Activity{
 21
 22     // 轮番广告Flipper
 23     private NotifiableViewFlipper adViewFlipper;
 24
 25     // Flipper内的ImageView数组,保留引用,目前没什么用
 26     private ImageView[] adFlipperImageViews;
 27
 28     // 这里放六个具体广告图片的id
 29     private int[] adIds = { R.drawable.home_ad_banner,
 30             R.drawable.home_ad_banner, R.drawable.home_ad_banner,
 31             R.drawable.home_ad_banner, R.drawable.home_ad_banner,
 32             R.drawable.home_ad_banner };
 33
 34     // 轮番广告进度锚点(小圆点)
 35     private RadioGroup adPointRadioGroup;
 36
 37     // 六个小圆点的id
 38     private static final int[] AD_POINT_IDS = { R.id.radioButton_flipperPoint0,
 39             R.id.radioButton_flipperPoint1, R.id.radioButton_flipperPoint2,
 40             R.id.radioButton_flipperPoint3, R.id.radioButton_flipperPoint4,
 41             R.id.radioButton_flipperPoint5 };
 42
 43     // 广告数量
 44     private static final int AD_FLIPPER_COUNT = AD_POINT_IDS.length;
 45
 46     @Override
 47     protected void onCreate(Bundle savedInstanceState) {
 48         super.onCreate(savedInstanceState);
 49         setContentView(R.layout.activity_home);
 50         adViewFlipper = (NotifiableViewFlipper) findViewById(R.id.viewFlipper_AD);
 51         adPointRadioGroup = (RadioGroup) findViewById(R.id.radioGroup_flipperPoints);
 52         adViewFlipper.setOnFlipListener(adFlipListener);
 53         addAdFlipperImageViews();
 54     }
 55
 56     /**
 57      * 初始化插入轮番广告
 58      */
 59     private void addAdFlipperImageViews() {
 60         adFlipperImageViews = new ImageView[AD_FLIPPER_COUNT];
 61         for (int i = 0; i < AD_FLIPPER_COUNT; i++) {
 62             ImageView imageView = makeAdFlipperImageView();
 63             imageView.setImageResource(adIds[i]);
 64             imageView.setOnClickListener(adFlipperImageViewListener);
 65             adFlipperImageViews[i] = imageView;
 66             adViewFlipper.addView(imageView);
 67         }
 68     }
 69
 70     /**
 71      * 工厂生产轮番广告容器ImageView对象
 72      * @return
 73      */
 74     private ImageView makeAdFlipperImageView() {
 75         ImageView i = new ImageView(this);
 76         i.setBackgroundColor(0xFF000000);
 77         i.setScaleType(ImageView.ScaleType.FIT_CENTER);
 78         i.setLayoutParams(new NotifiableViewFlipper.LayoutParams(
 79                 NotifiableViewFlipper.LayoutParams.MATCH_PARENT,
 80                 NotifiableViewFlipper.LayoutParams.MATCH_PARENT));
 81         return i;
 82     }
 83
 84     /**
 85      * 每个广告的点击事件监听器
 86      */
 87     private OnClickListener adFlipperImageViewListener = new OnClickListener() {
 88
 89         @Override
 90         public void onClick(View v) {
 91             Toast.makeText(HomeActivity.this, "广告 " + adViewFlipper.getDisplayedChild(), Toast.LENGTH_SHORT).show();
 92         }
 93     };
 94
 95     /**
 96      * 轮番广告切换监听器,更新进度标记锚点的显示
 97      */
 98     private OnFlipListener adFlipListener = new OnFlipListener() {
 99
100         @Override
101         public void onShowPrevious(NotifiableViewFlipper flipper) {
102             adPointRadioGroup.check(AD_POINT_IDS[flipper.getDisplayedChild()]);
103         }
104
105         @Override
106         public void onShowNext(NotifiableViewFlipper flipper) {
107             adPointRadioGroup.check(AD_POINT_IDS[flipper.getDisplayedChild()]);
108         }
109     };
110 }

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

完毕。

Android-使用ViewFlipper实现轮番切换广告栏

时间: 2024-11-05 13:28:37

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

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

为了实现广告轮播功能,在网上找了很多方法,有的效果很好,但是代码太麻烦,并且大多是用的viewpager,总之不是很满意. 于是看了一下sdk有个控件是ViewFlipper,使用比较方便,于是尝试了一下,最终实现了所需效果.在这里与大家分享. 首先看一下效果(主要是布局方面的效果,毕竟手势识别和滑动不太好显示,懒得弄成gif了): 1.布局文件.xml <LinearLayout android:layout_width="fill_parent" android:layout

Android中使用ViewFlipper实现屏幕切换

屏幕切换指的是在同一个Activity内屏幕间的切换,ViewFlipper继承了Framelayout类,ViewAnimator类的作用是为FrameLayout里面的View切换提供动画效果.如下动图: 该类有如下几个和动画相关的函数: setInAnimation:设置View进入屏幕时候使用的动画,该函数有两个版本,一个接受单个参数,类型为android.view.animation.Animation:一个接受两个参数,类型为Context和int,分别为Context对象和定义An

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

首先新建一个Android项目,命名为ViewFlipperTest 如图:项目机构,本项目主要操作图中红色箭头标注的文件 1.HgroupAdapter.java文件代码↓主要实现listview数据适配器的定义 1 package com.hll.ViewFlipperTest; 2 3 import java.util.List; 4 5 import android.content.Context; 6 import android.view.LayoutInflater; 7 impo

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

首先我们还是看一些示例:(网易,新浪,百度)      下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下. 第一种:ViewFlipper+GestureDetector 主布局就是一个listview,这里就不介绍了,我介绍下切换图片布局head_iamge.xml 1 <span style="font-size:12px;&

android 使用viewflipper实现左右滑动的效果

public class MainActivity extends Activity implements OnGestureListener { private static final String TAG = "MainActivity"; private ViewFlipper viewFlipper; private GestureDetector detector; //手势检测 Animation leftInAnimation; Animation leftOutAni

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

首先我们还是看一些示例:(网易,新浪,百度) 显示效果都不错,可是手感就不一样了,百度最棒,网易还行,新浪就操作很不好,这里我说的是滑动切换图片.自己可以测试一下.不得不说牛叉的公司确实有哦牛叉的道理. 下面我简单的介绍下实现方法:其实就是listview addHeaderView.只不过这个view是一个可以切换图片的view,至于这个view怎么做,就要根据自己的喜爱了,实现有多种方法,下面我简单介绍一下. 第一种:ViewFlipper+GestureDetector 主布局就是一个li

Android 应用内多语言切换

p.p1 { margin: 0.0px 0.0px 12.0px 0.0px; line-height: 18.0px; font: 12.0px ".PingFang SC"; color: #000000 } p.p3 { margin: 0.0px 0.0px 13.9px 0.0px; line-height: 18.0px; font: 16.8px "PT Sans"; color: #000000 } p.p4 { margin: 0.0px 0.0

【转】Android 模拟器横屏竖屏切换设置

http://blog.csdn.net/zanfeng/article/details/18355305# Android 模拟器横屏竖屏切换设置时间:2012-07-04   来源:设计与开发   作者:Daniel   点击:5571 摘要:  Android 模拟器旋转,横屏.竖屏切换设置,android 横屏布局,android 横屏模式,android 模拟器,android 模拟器横屏,android 模拟...       Android 模拟器旋转,横屏.竖屏切换设置,andr

android的ViewFlipper

activity_main.xml <LinearLayout 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_pa