所谓的轮番切换广告栏,指的是下面这个东西,笔主不知道该怎么确切描述这货...
素材:请自行百度图片,美女尤佳
圆点: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文件头不完整等小问题,包括监听器具体功能的实现,请各位批判性自行调整修改。
完毕
相关推荐
`ViewFlipper`是Android SDK提供的一种布局容器,它允许你在多个视图之间进行动态切换。你可以将一系列的视图(如ImageView、TextView等)添加到`ViewFlipper`中,然后通过动画效果来展示视图的切换,实现类似翻页的...
在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间切换,并且可以添加各种动画效果,使用户界面更加生动和互动。本篇将深入探讨如何利用ViewFlipper实现Switch动画特效,...
总结来说,要实现Activity滑屏切换,现代Android开发推荐使用`Fragment`和`ViewPager`组合,而非过时的`ActivityGroup`。`ViewFlipper`适合于在同一Activity内部切换相似的视图,而不是不同Activity。同时,提供的...
结合源代码文件`Test_05 使用ViewFlipper实现左右滚动切换`,你可以更深入地理解和实践这一功能,从而提升你的Android UI设计能力。记得在实际项目中灵活运用这些知识点,为用户提供更丰富的交互体验。
在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地实现在多个视图之间进行滑动切换的效果。这种效果常见于各种应用程序,如轮播图、页面导航等。下面我们将深入探讨如何利用ViewFlipper...
在Android开发中,ViewFlipper是一个非常有用的布局控件,它允许我们轻松地实现滑动翻页的效果。这个示例将向我们展示如何在应用程序中使用ViewFlipper来创建一个动态翻页界面,使得用户可以通过手势或编程方式切换...
Android系统自带有一个多页面管理的控件:ViewFlipper. 它可以简单实现子页面的切换,,, 它只需使用addView方法添加几个View,每个View对应的是一个页面,即可完成对于多页面的管理,,, 在android上实现手势...
下面将详细探讨如何在Android应用中使用ViewFlipper来实现页面的滑动切换。 首先,我们需要了解ViewFlipper的基本结构。一个ViewFlipper可以包含多个子视图,如ImageView、TextView或自定义布局。在初始化时,...
这个压缩包文件"Android--开发--ActivityGroup + GridView + ViewFlipper 实现选项卡.rar"提供了使用ActivityGroup、GridView和ViewFlipper这三种组件来实现这一功能的方法。下面将详细解释这三个组件及其在选项卡...
在Android开发中,GridView和ViewFlipper是两个非常重要的组件,它们可以被用来构建丰富的用户界面。本项目“AndroidGridView-ViewFlipper布局界面,模仿“机锋市场”旨在通过这两种组件来创建一个类似“机锋市场”...
ViewFlipper是Android SDK提供的一种布局管理器,主要用于在多个视图之间进行平滑的切换,常用于实现滑动翻页效果,如相册、广告轮播等场景。本篇文章将详细探讨如何利用ViewFlipper来实现滑屏切换View的功能。 ...
在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间进行切换,通常用于创建动态、交互式的用户界面。在本项目中,开发者利用ViewFlipper来实现屏幕间的动画切换效果,使得...
利用viwflipper来将多个activity封装在一个view中,通过实现OnGestureListener接口的onTouchEvent()方法和onFling() 方法,即可通过手持滑动切换activity。
在Android开发中,ViewFlipper是一个非常实用的控件,它允许我们轻松地在多个视图之间进行切换,常用于实现动画效果,如轮播图、广告栏等。本篇文章将深入探讨`ViewFlipper`的使用方法及其背后的实现原理。 `...
在Android开发中,ViewFlipper是一个非常有用的控件,它允许开发者轻松地在多个视图之间切换,通常用于实现类似轮播图或者卡片翻页的效果。在这个“最简单的ViewFlipper实现图片跟随手势滑动”的教程中,我们将深入...
从`ViewFlipper-master`这个文件名来看,这是一个开源项目,包含了对原生ViewFlipper的改进源码。开发者可能在项目中提供了详细的实现细节和使用方法。如果要深入学习和应用这个控件,建议查看源码,研究其内部的...
在Android开发中,ViewFlipper是一个非常有用的布局组件,它允许开发者轻松地在多个视图之间切换,通常用于实现翻页、轮播图或者动画效果。在这个场景中,我们将探讨如何利用ViewFlipper来实现左右滑动的效果。 ...
"Android 使用 ViewFlipper 实现图片切换功能" Android 使用 ViewFlipper 实现图片切换功能是 Android 应用程序开发中的一种常见需求。ViewFlipper 是 Android 中的一个控件,能够实现图片的滑动切换功能。下面将...