`
ch_kexin
  • 浏览: 898805 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
社区版块
存档分类
最新评论

Android-使用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()]);
        }
    };
}

 push_left_in.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="300"
        android:fromXDelta="100.0%p"
        android:toXDelta="0.0" />

    <alpha
        android:duration="300"
        android:fromAlpha="0.0"
        android:toAlpha="1.0" />

</set>

 push_left_out.xml

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="300"
        android:fromXDelta="0.0"
        android:toXDelta="-100.0%p" />

    <alpha
        android:duration="300"
        android:fromAlpha="1.0"
        android:toAlpha="0.0" />

</set>

radio_adpoint.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@mipmap/icon_view_s" android:state_enabled="true"></item>
    <item android:drawable="@mipmap/icon_view_n" android:state_enabled="false"></item>
</selector>

  

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

完毕

分享到:
评论

相关推荐

    Android源码-使用ViewFlipper+GestureDetector实现划动翻页

    `ViewFlipper`是Android SDK提供的一种布局容器,它允许你在多个视图之间进行动态切换。你可以将一系列的视图(如ImageView、TextView等)添加到`ViewFlipper`中,然后通过动画效果来展示视图的切换,实现类似翻页的...

    Android使用ViewFlipper实现Switch动画特效。

    在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间切换,并且可以添加各种动画效果,使用户界面更加生动和互动。本篇将深入探讨如何利用ViewFlipper实现Switch动画特效,...

    Android ActivtiyGroup和ViewFlipper实现Activity滑屏切换

    总结来说,要实现Activity滑屏切换,现代Android开发推荐使用`Fragment`和`ViewPager`组合,而非过时的`ActivityGroup`。`ViewFlipper`适合于在同一Activity内部切换相似的视图,而不是不同Activity。同时,提供的...

    ViewFlipper实现左右切换

    结合源代码文件`Test_05 使用ViewFlipper实现左右滚动切换`,你可以更深入地理解和实践这一功能,从而提升你的Android UI设计能力。记得在实际项目中灵活运用这些知识点,为用户提供更丰富的交互体验。

    android 利用ViewFlipper来实现滑动切换

    在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地实现在多个视图之间进行滑动切换的效果。这种效果常见于各种应用程序,如轮播图、页面导航等。下面我们将深入探讨如何利用ViewFlipper...

    android中使用ViewFlipper实现滑动翻页示例

    在Android开发中,ViewFlipper是一个非常有用的布局控件,它允许我们轻松地实现滑动翻页的效果。这个示例将向我们展示如何在应用程序中使用ViewFlipper来创建一个动态翻页界面,使得用户可以通过手势或编程方式切换...

    Android使用ViewFlipper做页面切换,与手势滑动切换的使用

    Android系统自带有一个多页面管理的控件:ViewFlipper. 它可以简单实现子页面的切换,,, 它只需使用addView方法添加几个View,每个View对应的是一个页面,即可完成对于多页面的管理,,, 在android上实现手势...

    Android ViewFlipper实现页面的滑动切换

    下面将详细探讨如何在Android应用中使用ViewFlipper来实现页面的滑动切换。 首先,我们需要了解ViewFlipper的基本结构。一个ViewFlipper可以包含多个子视图,如ImageView、TextView或自定义布局。在初始化时,...

    Android--开发--ActivityGroup + GridView + ViewFlipper 实现选项卡.rar

    这个压缩包文件"Android--开发--ActivityGroup + GridView + ViewFlipper 实现选项卡.rar"提供了使用ActivityGroup、GridView和ViewFlipper这三种组件来实现这一功能的方法。下面将详细解释这三个组件及其在选项卡...

    AndroidGridView-ViewFlipper布局界面,模仿“机锋市场.zip

    在Android开发中,GridView和ViewFlipper是两个非常重要的组件,它们可以被用来构建丰富的用户界面。本项目“AndroidGridView-ViewFlipper布局界面,模仿“机锋市场”旨在通过这两种组件来创建一个类似“机锋市场”...

    ViewFlipper实现滑屏切换View

    ViewFlipper是Android SDK提供的一种布局管理器,主要用于在多个视图之间进行平滑的切换,常用于实现滑动翻页效果,如相册、广告轮播等场景。本篇文章将详细探讨如何利用ViewFlipper来实现滑屏切换View的功能。 ...

    Android中利用viewflipper动画切换屏幕效果

    在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间进行切换,通常用于创建动态、交互式的用户界面。在本项目中,开发者利用ViewFlipper来实现屏幕间的动画切换效果,使得...

    android 利用ViewFlipper来实现滑动切换Activity

    利用viwflipper来将多个activity封装在一个view中,通过实现OnGestureListener接口的onTouchEvent()方法和onFling() 方法,即可通过手持滑动切换activity。

    Android ViewFlipper 的使用

    在Android开发中,ViewFlipper是一个非常实用的控件,它允许我们轻松地在多个视图之间进行切换,常用于实现动画效果,如轮播图、广告栏等。本篇文章将深入探讨`ViewFlipper`的使用方法及其背后的实现原理。 `...

    最简单的ViewFlipper实现图片跟随手势滑动

    在Android开发中,ViewFlipper是一个非常有用的控件,它允许开发者轻松地在多个视图之间切换,通常用于实现类似轮播图或者卡片翻页的效果。在这个“最简单的ViewFlipper实现图片跟随手势滑动”的教程中,我们将深入...

    Android-ViewFlipper基于android的上下轮播显示消息的控件

    从`ViewFlipper-master`这个文件名来看,这是一个开源项目,包含了对原生ViewFlipper的改进源码。开发者可能在项目中提供了详细的实现细节和使用方法。如果要深入学习和应用这个控件,建议查看源码,研究其内部的...

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

    在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间切换,通常用于实现翻页、轮播图或者动画效果。在这个场景中,我们将探讨如何利用ViewFlipper来实现左右滑动的效果。 ...

    Android使用ViewFlipper实现图片切换功能

    "Android 使用 ViewFlipper 实现图片切换功能" Android 使用 ViewFlipper 实现图片切换功能是 Android 应用程序开发中的一种常见需求。ViewFlipper 是 Android 中的一个控件,能够实现图片的滑动切换功能。下面将...

Global site tag (gtag.js) - Google Analytics