前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用ViewFlipper来实现一个,在此将代码贴出来,与大家共享。

转载请说明出处:http://blog.csdn.net/dawanganban

import java.util.ArrayList;
import java.util.List;
import java.util.Timer;
import java.util.TimerTask; import com.guozha.buy.R;
import com.guozha.buy.util.DimenUtil; import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.ViewFlipper; /**
* 自定播放图片View
* @author lixiaoqiang
*
* CSDN博客:http://blog.csdn.net/dawanganban
*
*/
public class AutoViewFlipper extends FrameLayout{
private static final int SLOP_DELAY_TIME = 3000; //滑动等待时间,单位ms
private ViewFlipper mViewFlipper; //滑动的视图
private View mPointBar; //指示点显示条
private int mItemCount; //条目数
private int mCurrentItem; //当前的条目
private int mTouchSlop; //有效最短滑动距离
private Context context;
private List<ImageView> points = new ArrayList<ImageView>(); private TimerTask mTimerTask; private static final int HANDLER_SLOP_LEFT = 0x0001;
private Handler hander = new Handler(){
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case HANDLER_SLOP_LEFT:
slopToLeft();
break;
}
};
}; public AutoViewFlipper(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context; mTouchSlop = ViewConfiguration.getTouchSlop(); addChild(context); startAutoPlay();
} /**
* 停止自动播放
*/
public void stopAutoPlay(){
if(mTimerTask == null) return;
mTimerTask.cancel();
mTimerTask = null;
} /**
* 开始自动播放
*/
public void startAutoPlay(){
if(mTimerTask != null) return;
mTimerTask = new TimerTask() {
@Override
public void run() {
hander.sendEmptyMessage(HANDLER_SLOP_LEFT);
}
};
new Timer().scheduleAtFixedRate(mTimerTask, SLOP_DELAY_TIME, SLOP_DELAY_TIME);
} /**
* 添加子视图
* @param context
*/
private void addChild(Context context){ mViewFlipper = getViewFlipper(context);
this.addView(mViewFlipper); mPointBar = getPointBar(context);
this.addView(mPointBar);
} /**
* 获取ViewFlipper
* @param context
* @return
*/
private ViewFlipper getViewFlipper(Context context){
ViewFlipper viewFlipper = new ViewFlipper(context);
addImageViews(context, viewFlipper);
return viewFlipper;
} /**
* 获取指示点显示条
* @param context
* @return
*/
private View getPointBar(Context context){
LinearLayout.LayoutParams pointBarParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT);
pointBarParams.gravity = Gravity.RIGHT | Gravity.BOTTOM;
LinearLayout pointBar = new LinearLayout(context); pointBar.setOrientation(LinearLayout.HORIZONTAL);
pointBar.setLayoutParams(pointBarParams);
pointBar.setGravity(Gravity.RIGHT | Gravity.BOTTOM); addPoints(context, pointBar);
return pointBar;
} /**
* 添加小圆点
* @param context
* @param pointBar
*/
private void addPoints(Context context, LinearLayout pointBar){
LinearLayout.LayoutParams pointViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
pointViewParams.setMargins(DimenUtil.dp2px(context, 8), 0,
DimenUtil.dp2px(context, 8), DimenUtil.dp2px(context, 8)); ImageView pointView;
for(int i = 0; i < mItemCount; i++){
pointView = new ImageView(context);
pointView.setScaleType(ScaleType.CENTER_INSIDE);
pointView.setLayoutParams(pointViewParams);
points.add(pointView);
pointBar.addView(pointView);
}
setPointColorByCurrentItem();
} /**
* 根据当前选中项来设置圆点
*/
private void setPointColorByCurrentItem(){
mCurrentItem = (Integer)mViewFlipper.getCurrentView().getTag();
Bitmap grayPointBitmap = getGrayPointBitmap(context);
Bitmap lightPointBitmap = getLightPointBitmap(context);
ImageView imageView;
for(int i = 0; i < points.size(); i++){
imageView = points.get(i);
if(mCurrentItem == i){
imageView.setImageBitmap(lightPointBitmap);
}else{
imageView.setImageBitmap(grayPointBitmap);
} }
} /**
* 添加图片资源
* @param context
* @param viewFlipper
*/
private void addImageViews(Context context, ViewFlipper viewFlipper){
if(viewFlipper == null) return;
List<Bitmap> bitmaps = getBitmaps(); if(bitmaps == null) return;
LinearLayout.LayoutParams imageViewParams = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.MATCH_PARENT); ImageView imageView;
mItemCount = bitmaps.size();
for(int i = 0; i < mItemCount; i++){
imageView = new ImageView(context);
imageView.setImageBitmap(bitmaps.get(i));
imageView.setScaleType(ScaleType.CENTER_CROP);
imageView.setLayoutParams(imageViewParams);
imageView.setTag(i);
viewFlipper.addView(imageView);
}
} /**
* 获取图片资源
* @return
*/
private List<Bitmap> getBitmaps(){
//TODO 从网络获取图片
List<Bitmap> bitmaps = new ArrayList<Bitmap>(); bitmaps.add(BitmapFactory.decodeResource(
getResources(), R.drawable.main_page_scroll_image1));
bitmaps.add(BitmapFactory.decodeResource(
getResources(), R.drawable.main_page_scroll_image2));
bitmaps.add(BitmapFactory.decodeResource(
getResources(), R.drawable.main_page_scroll_image3)); return bitmaps;
} /**
* 获取选择圆点图片
* @param context
* @return
*/
private Bitmap getLightPointBitmap(Context context){
return BitmapFactory.decodeResource(
getResources(), R.drawable.main_page_scorll_point_selected);
} /**
* 获取灰色圆点图片
* @param context
* @return
*/
private Bitmap getGrayPointBitmap(Context context){
return BitmapFactory.decodeResource(
getResources(), R.drawable.main_page_scroll_point_unselected);
} private float mDownX;
@Override
public boolean onTouchEvent(MotionEvent event) {
float eventX = event.getX(); switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
mDownX = eventX;
break;
case MotionEvent.ACTION_UP: float gap = eventX - mDownX;
if(Math.abs(gap) > mTouchSlop){
if(gap > 0){
//向右滑动
slopToRight();
}else{
//向左滑动
slopToLeft();
}
}
break;
} return true;
} /**
* 向右滑动
*/
private void slopToRight(){
mViewFlipper.setInAnimation(context, R.anim.slide_in_left);
mViewFlipper.setOutAnimation(context, R.anim.slide_out_right);
mViewFlipper.showPrevious();
setPointColorByCurrentItem();
} /**
* 向左滑动
*/
private void slopToLeft(){
mViewFlipper.setInAnimation(context, R.anim.slide_in_right);
mViewFlipper.setOutAnimation(context, R.anim.slide_out_left);
mViewFlipper.showNext();
setPointColorByCurrentItem();
} private OnSlopTouchListener mOnSlopTouchListener; /**
* 监听滑动等事件
* @author Administrator
*
*/
interface OnSlopTouchListener{ /**
* touch事件响应
*/
public void onTouchedView();
} /**
* 设置滑动等事件的监听
* @param onSlopTouchListener
*/
public void setOnSlopTouchListener(OnSlopTouchListener onSlopTouchListener){
this.mOnSlopTouchListener = onSlopTouchListener;
}
}

Android自定义组件系列【16】——最帅气的自动滚动广告条的更多相关文章

  1. Android自定义组件系列【7】——进阶实践(4)

    上一篇<Android自定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpan ...

  2. Android自定义组件系列【6】——进阶实践(3)

    上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...

  3. Android自定义组件系列【5】——进阶实践(2)

    上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一 ...

  4. Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动

    在上一篇文章<Android自定义组件系列[3]--自定义ViewGroup实现侧滑>中实现了仿Facebook和人人网的侧滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布局示 ...

  5. Android自定义组件系列【3】——自定义ViewGroup实现侧滑

    有关自定义ViewGroup的文章已经很多了,我为什么写这篇文章,对于初学者或者对自定义组件比较生疏的朋友虽然可以拿来主义的用了,但是要一步一步的实现和了解其中的过程和原理才能真真脱离别人的代码,举一 ...

  6. Android自定义组件系列【12】——非UI线程绘图SurfaceView

    一.SurfaceView的介绍 在前面我们已经会自定义View,使用canvas绘图,但是View的绘图机制存在一些缺陷. 1.View缺乏双缓冲机制. 2.程序必须重绘整个View上显示的图片,比 ...

  7. Android自定义组件系列【1】——自定义View及ViewGroup

    View类是ViewGroup的父类,ViewGroup具有View的所有特性,ViewGroup主要用来充当View的容器,将其中的View作为自己孩子,并对其进行管理,当然孩子也可以是ViewGr ...

  8. Android自定义组件系列【17】——教你如何高仿微信录音Toast

    一.Toast介绍 平时我们在Android开发中会经常用到一个叫Toast的东西,官方解释如下 A toast is a view containing a quick little message ...

  9. Android自定义组件系列【15】——四个方向滑动的菜单实现

    今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...

随机推荐

  1. docker 下修改 mysql sql_mode和配置文件

    原文:docker 下修改 mysql sql_mode和配置文件 打开PowerShell 首先创建mysql容器,这里我们指定使用mysql5.7的版本 docker run -d -p 3306 ...

  2. 经典C语言编程注意点

    C/C++程序员应聘试题剖析 分中的2分.读者可从本文看到strcpy函数从2分到10分解答的例子,看看自己属于什么样的层次.此外,还有一些面试题考查面试者敏捷的思维能力. 分析这些面试题,本身包含很 ...

  3. wget 升级

    漏洞描述: Wget是GNU计划开发的一套用于在网络上进行下载的自由软件,是Unix/Linux系统最常用的下载工具,支持通过HTTP.HTTPS以及FTP这三个最常见的TCP/IP协议下载. Wge ...

  4. Android源代码解析之(十三)--&gt;apk安装流程

    转载请标明出处:一片枫叶的专栏 上一篇文章中给大家分析了一下android系统启动之后调用PackageManagerService服务并解析系统特定文件夹.解析apk文件并安装的过程,这个安装过程实 ...

  5. HDU 5607 graph(矩阵优化+概率DP)

    该题非常easy想到求概率的转移方程:用d[i][j]表示第i步,走到j点的概率. 可是该题的k高达1e9.所以依照套路.要用矩阵相乘来优化. 第一次写矩阵相乘. 大概的意思就是利用矩阵实现递推. 而 ...

  6. 【cocos2d-x 3.7 飞机大战】 决战南海I (二) 我方飞机的实现

    在上一篇中.我们实现了游戏的開始界面,接下来要实现游戏的主界面.主界面包括地图.我方飞机.敌机等 先来实现我方飞机 我方飞机具有哪些属性呢? 飞机要具有生命值.要有动画效果(尾部喷气),飞机不可以飞出 ...

  7. [数位dp] bzoj 3209 花神的数论题

    题意:中文题. 思路:和普通数位dp一样,这里转换成二进制,然后记录有几个一. 统计的时候乘起来就好了. 代码: #include"cstdlib" #include"c ...

  8. 46. AngularJS所有版本下载

    转自:https://www.cnblogs.com/best/tag/Angular/ 官网下载:https://angularjs.org/ AngularJS所有版本下载:https://cod ...

  9. POJ 3277 线段树+扫描线

    题意: 思路: 线段树求矩形面积的并...同 POJ 1151 //By SiriusRen #include <cstdio> #include <algorithm> us ...

  10. WHERE、ORDER BY、GROUP BY、HAVING语句解析(二十八)

    之前啊,我们提及到,对于update和delete,若不带where条件,则对所有记录都有效. 一.WHERE条件表达式 (1)对记录进行过滤,如果没有指定WHERE子句,则显示所有记录. (2)在W ...