开源项目:滑动广告栏

  最近在开发一款android APP,项目中采用了推送广告的方案,即在手机屏幕上方空出一块区域,加载来自服务器的广告图片,形成banner广告的效果。

  开发过程中,百度出了好多种解决方案,其中以ViewPager的方案和重写Gallery的方案居多,学生党的我比较倾向于后者。在编写定制Gallery的过程中参考了ZAKER 5.0.4源代码中的ScrollGallery类(反编译得到的),优化了Gallery向两边滑动到头自动跳转的问题,详细的代码如下:  

 1 package org.warnier.zhang.support.v1.widget;
 2
 3 import java.util.Timer;
 4
 5 import android.content.Context;
 6 import android.util.AttributeSet;
 7 import android.view.MotionEvent;
 8 import android.widget.Gallery;
 9
10 public class AdsGallery extends Gallery {
11
12     public Context context;
13
14     public AdsGallery(Context context) {
15         super(context);
16         this.context = context;
17     }
18
19     public AdsGallery(Context context, AttributeSet attrs) {
20         super(context, attrs);
21         this.context = context;
22     }
23
24     public AdsGallery(Context context, AttributeSet attrs, int defStyleAttr) {
25         super(context, attrs, defStyleAttr);
26         this.context = context;
27     }
28
29     public AdsGallery(Context context, AttributeSet attrs, int defStyleAttr,
30             int defStyleRes) {
31         super(context, attrs, defStyleAttr, defStyleRes);
32         this.context = context;
33     }
34
35     @Override
36     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
37             float velocityY) {
38         if (isScrollingLeft(e1, e2)) {
39             playPrevious();
40         }
41         for (;;) {
42             playNext();
43             return true;
44         }
45     }
46
47     private boolean isScrollingLeft(MotionEvent paramMotionEvent1,
48             MotionEvent paramMotionEvent2) {
49         return paramMotionEvent2.getX() > paramMotionEvent1.getX();
50     }
51
52     public boolean playNext() {
53         int i = getSelectedItemPosition();
54         int j = computeHorizontalScrollRange();
55         if ((j > 0) && (i < j - 1)) {
56             onKeyDown(22, null);
57             return true;
58         }
59         return false;
60     }
61
62     public boolean playPrevious() {
63         int i = getSelectedItemPosition();
64         if ((computeHorizontalScrollRange() > 0) && (i > 0)) {
65             onKeyDown(21, null);
66             return true;
67         }
68         return false;
69     }
70 }

  滑动广告栏核心类有AdsGallery 和 AdsAdapter,核心类只是优化了滑动体验效果。在org.warnier.zhang.sample包的Demo中,AdsAdapter直接加载了本地的图片,在实际的APP中需要打开新的网络线程从服务器上读取图片资源。滑动广告栏具体功能的实现在org.warnier.zhang.sample包的MainActivity中。在MainActivity的onCreate()方法中初始化AdsGallery ,显示当前广告获得焦点的布局,和计时器;利用Timer和Handler之间进行线程间通信,在Handler中更新AdsGallery当前项。详细的代码如下:

 1 package org.warnier.zhang.sample;
 2
 3 import java.util.Timer;
 4 import java.util.TimerTask;
 5
 6 import org.warnier.zhang.support.v1.widget.AdsAdapter;
 7 import org.warnier.zhang.support.v1.widget.AdsGallery;
 8
 9 import android.util.Log;
10 import android.view.View;
11 import android.widget.ImageView;
12 import android.widget.LinearLayout;
13 import android.app.Activity;
14 import android.graphics.Color;
15 import android.os.Bundle;
16 import android.os.Handler;
17 import android.os.Message;
18
19 public class MainActivity extends Activity {
20
21     private AdsGallery adsGallery;
22     private LinearLayout linearLayout;
23     private int delay = 2500;
24     private int period = 2500;
25
26     @Override
27     protected void onCreate(Bundle savedInstanceState) {
28         super.onCreate(savedInstanceState);
29         setContentView(R.layout.activity_main);
30         // 初始化广告栏控件;
31         adsGallery = (AdsGallery) this.findViewById(R.id.myAdsGallery);
32         adsGallery.setAdapter(new AdsAdapter(this));
33
34         // 初始化广告焦点指示器;
35         linearLayout = (LinearLayout) this.findViewById(R.id.myAdsIndicator);
36         linearLayout.setBackgroundColor(Color.argb(200, 135, 135, 152));
37         for (int i = 0; i < 4; i++) {
38             ImageView imageView = new ImageView(this);
39             if (i == 0) {
40                 imageView.setBackgroundResource(R.drawable.feature_point_cur);
41             } else
42                 imageView.setBackgroundResource(R.drawable.feature_point);
43             linearLayout.addView(imageView);
44         }
45
46         // 初始化计时器和计时器任务;
47         new Timer().schedule(new TimerTask() {
48
49             @Override
50             public void run() {
51                 int position = adsGallery.getSelectedItemPosition() + 1;
52
53                 // 存放广告栏的当前项;
54                 Bundle bundle = new Bundle();
55                 bundle.putInt("position", position);
56                 Message msg = new Message();
57
58                 // 设置当前的消息标识符;
59                 msg.what = 1;
60                 msg.setData(bundle);
61                 handler.sendMessage(msg);
62             }
63         }, delay, period);
64     }
65
66     // 初始化Handler,供UI主线程与计时器线程交换数据;
67     private Handler handler = new Handler() {
68         @Override
69         public void handleMessage(android.os.Message msg) {
70             super.handleMessage(msg);
71             switch (msg.what) {
72             case 1:
73                 Bundle bundle = msg.getData();
74                 int position = bundle.getInt("position");
75                 Log.i("指示器", "" + position);
76                 adsGallery.setSelection(position);
77                 refreshIndicator(position);
78                 break;
79
80             default:
81                 Log.i("msg.what", "消息标识符错误!");
82                 break;
83             }
84         };
85     };
86
87     // 刷新广告栏焦点
88     public void refreshIndicator(int position) {
89         LinearLayout layout = (LinearLayout) findViewById(R.id.myAdsIndicator);
90         View v = layout.getChildAt(position % 4);
91         View p = layout.getChildAt((position - 1) % 4);
92         ((ImageView) p).setImageResource(R.drawable.feature_point);
93         ((ImageView) v).setImageResource(R.drawable.feature_point_cur);
94     }
95 }

  当然项目中还存在如下问题,欢迎读者交流指正!

  (1)广告焦点指示器的第一个圆形图标出现一圈红色背景;

  (2)当手动滑动广告栏的过程中,计时器继续运行,广告焦点指示器不止一个出现红色;

  (3)能否定制一个能够自动运行的AdsGallery,而不是在Activity中控制运行;

  上述问题已经在开发的过程中得到解决,但还是期待读者能够拿出新颖的方案,交流一下!展示和分享的代码是早期的原型Demo,不是项目的实际代码,大家如果采用的话需要根据自己的实际情况加以更改。完整的Eclipse工程下载访问链接:http://pan.baidu.com/s/1dDH7nSd密码: ah8p。

  参考文献:

    [1] Android开发权威指南,李宁著,2013-09,北京,人民邮电出版社。  

  本文历史:

  • 2015-01-30  初稿完成。
时间: 2024-07-29 10:07:49

开源项目:滑动广告栏的相关文章

SlidingMenu开源项目滑动界面的实现总结

先上图 需要准备的是先得在GitHub上下载ActionBarSherlock-master.zip,和SlidingMenu-master.zip这两个开源文件,然后解压这两个包,SlidingMenu里面的library文件导入到Eclipse的一个工程里面(在这里不强调利Import一个android工程),还有ActionBarSherlock里面的actionbarsherlock文件导入到Eclipse当中. 导入之后就需要把library设置为一个library方便以后再其他工程里

【Android UI设计与开发】9:滑动菜单栏(一)开源项目SlidingMenu的使用和示例

一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了这种界面方案,像facebook.人人网.everynote.Google+等等.如下图所示: 因为效果确实比较新颖,所以在很多的应用开发中去实现此效果,解决的办法也是不尽相同.诸多比较以后发 现,还是GitHub上的开源项目SlidingMenu提供了最佳的实现:定制灵活.各种阴影和渐变以及动画的

滑动菜单栏(二)开源项目SlidingMenu的示例

这篇文章会给大家带来7个不同效果的示例,每个示例都包含了最基本的使用方法,从易到难,循序渐进.能够 让初学者可以快速的掌握SlidingMenu的使用方法.下一篇文章会给大家带来三种不同的动画效果来实现滑动菜单栏 的滑动. 关于这些示例,都是SlidingMenu开源项目中自带的一些示例,但是对于初学者来说,要想运行这些示例查看效 果,就必须要导入很多的库,使用起来也是非常的麻烦.博主这里为了能够方便大家更好的学习,就把每个示例都单 独拿了出来,并且添加了一些非常详细的注释,让初学者能够一看就懂

Android仿qq下拉刷新及向左滑动列表----PullToRefresh, SwipeMenuListView开源项目整合

Github链接:https://github.com/licaomeng/Android-PullToRefresh-SwipeMenuListView-Sample PullToRefresh是一个非常完美的下拉刷新的开源项目,SwipeMenuListView是一个向左滑动ListView中item实现可以删除功能的开源项目.笔者在此将两套开源项目整合形成一套,类似于手机qq那样同时支持下拉刷新和向左滑动的列表.效果如下: 版权声明:本文为博主原创文章,未经博主允许不得转载.

滑动菜单栏(一)开源项目SlidingMenu的使用

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9255829   第一次使用开源框架SlidingMenu 一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了这种界面方案,像facebook.人人网.everynote.Google+等等.如下图所示: Google+界面效果

【Android UI设计与开发】第17期:滑动菜单栏(二)开源项目SlidingMenu的示例

通过上一篇文章的讲解,相信大家对于开源项目SlidingMenu都有了一个比较初步的了解(不了解的可以参考上 一篇文章),那么从这一章开始,博主将会以SlidingMenu为重心,给大家带来非常丰富的示例演示,让大家对 SlidingMenu有一个更加深入的了解以及如何去实现一些比较炫的滑动效果. 这篇文章会给大家带来7个不同效果的示例,每个示例都包含了最基本的使用方法,从易到难,循序渐进.能够 让初学者可以快速的掌握SlidingMenu的使用方法.下一篇文章会给大家带来三种不同的动画效果来实

【Android UI设计与开发】第16期:滑动菜单栏(一)开源项目SlidingMenu的使用

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9255829   由于最近的工作确实比较忙的原因,所以这个系列的教程有一段时间没有更新了,也请各位读者见谅.这期博主要给大家带来的是关于滑动菜单栏的实现效果. 一.SlidingMenu简介 相信大家对SlidingMenu都不陌生了,它是一种比较新的设置界面或配置界面的效果,在主界面左滑或者右滑出现设置界面效果,能方便的进行各种操作.很多优秀的应用都采用了这种界面方案,像f

Android 开源项目分类汇总

目前包括: Android 开源项目第一篇--个性化控件(View)篇  包括ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style.其他Android 开源项目第二篇--工具库篇  包括依赖注入.图片缓存.网络请求.数据库 ORM 工具包.Andro

Android常用酷炫控件(开源项目)github地址汇总

转载一个很牛逼的控件收集贴... 第一部分 个性化控件(View) 主要介绍那些不错个性化的 View,包括 ListView.ActionBar.Menu.ViewPager.Gallery.GridView.ImageView.ProgressBar.TextView.ScrollView.TimeView.TipView.FlipView.ColorPickView.GraphView.UI Style 等等. 一.ListView android-pulltorefresh一个强大的拉动