• 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文件头不完整等小问题,包括监听器具体功能的实现,请各位批判性自行调整修改。

    完毕。

  • 相关阅读:
    括号配对问题 (栈的应用)
    poj 1363 火车进站 (栈的应用)
    算法训练题
    进制-Adding Two Negabinary Numbers
    翻转-Flip Columns For Maximum Number of Equal Rows
    图论-完全二叉树判定-Check Completeness of a Binary Tree
    动态规划-Maximum Subarray-Maximum Sum Circular Subarray
    贪心-最大相容区间-Maximum Number of Events That Can Be Attended
    动态规划-LCS-Uncrossed Lines
    数学-绝对值-Reverse Subarray To Maximize Array Value
  • 原文地址:https://www.cnblogs.com/wavky/p/3790547.html
Copyright © 2020-2023  润新知