前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用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; //滑动等待时间,单位msprivate 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() {@Overridepublic 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;@Overridepublic 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自定义View——仿1号店垂直滚动广告条实现

    效果图 原理分析 整个过程都是基于坐标Y的增加和交换进行处理的,Y值都会一直增加到endY,然后进行交换逻辑 实现步骤 1.初始化变量 由于1号店是两句话的滚动,所以我们也是使用两句话来实现的 pub ...

  2. Android 竖直滚动广告条、上下滚动广告条,View滚动广告条;

    四种方式实现仿淘宝滚动广告条: TextView+Handler延时动画 实现滚动效果: 自定义ViewFlipper 实现滚动效果:(用法简单,推荐使用) RecyclerView+子线程延时 实现 ...

  3. Android基础控件——ViewFlipper的使用,仿淘宝头条垂直滚动广告条

    ViewFlipper的使用,仿淘宝头条垂直滚动广告条 学习,学习,学以致用 ViewFlipper是安卓自带的控件,很多人可能很少知道这个控件,这个控件很简单,也很好理解,能不能用上实战就看你们的本 ...

  4. 【独立版】智慧城市同城V4_2.1.1全开源全插件+VUE前端,修复平台装修公告组件风格二和风格三无法自动滚动的问题

    源码介绍 [独立版]智慧城市同城V4_2.1.1全开源全插件+VUE前端,修复平台装修公告组件风格二和风格三无法自动滚动的问题! 智慧城市同城是一套专注于多城市生活服务同城技术解决方案,全面覆盖同堿信 ...

  5. Android自定义组件之ListPopWindow

    最近小编在学习IOS开发,感触颇深,看到了iOS里面封装了好多组件,很多组件都是iOS自带的,相信一般的小公司的产品经理都是按照iOS的交互来设计UI,而且还要求Android要和iOS统一风格,这让 ...

  6. android绘制心形_Android自定义View系列(一)——打造一个爱心进度条

    写作原因:Android进阶过程中有一个绕不开的话题--自定义View.这一块是安卓程序员更好地实现功能自主化必须迈出的一步.下面这个系列博主将通过实现几个例子来认识安卓自定义View的方法.从自定义 ...

  7. android 自定义组件圆形边框

    在android开发中,我们经常要自定义组件如TextView等背景或边框为四角圆形. 首先,我们在drawable目录下新建一个xml文件,bg.xml <?xml version=" ...

  8. Android四大组件系列7 Broadcast广播机制(上)

    一 概述 广播 (Broadcast) 机制用于进程或线程间通信,广播分为广播发送和广播接收两个过程,其中广播接收者 BroadcastReceiver 是 Android 四大组件之一.Broadc ...

  9. android 使用自定义组件,Android自定义组件开发之onMeasure使用

    一.自定义组件造成其他组件的隐藏 我们在开发过程中往往现有的组件无法满足我们的需求,所有我们需要去自定义组件来实现我们的需求,在实现的过程中总会有各种问题,这里我们讨论一下onMeasure的使用,首 ...

最新文章

  1. 干货!仅有 100k 参数的高效显著性检测方法
  2. Java集合知识:TreeMap
  3. cocos2d-x 打包成so文件之后,假设出现错误,能够使用ndk-stack来查看里面的异常...
  4. stm32关于.o的错误
  5. 图像处理之opencv图像特效大全
  6. 转:如何提高自己的归纳总结能力?
  7. python中forward函数的引用_pytorch 调用forward 的具体流程
  8. Node Version Manager--NodeJS的多版本管理工具--轻松实现多个版本的NodeJS的管理开发
  9. antd权限管理_Ant Design Pro开发后台管理系统(权限)-阿里云开发者社区
  10. 使用数据库维护计划SQL Server更新统计信息
  11. samba配置不同用户不同权限_前端问题集:vue配置环境-给不同的环境配不同的打包命令...
  12. HTML——校友会(bootstrap)
  13. 抗锯齿_《战地V》深度学习抗锯齿性能测试:对它最友好的竟然是4K
  14. mapgis新手教程(非常适合新手参考)
  15. eclipse中文教程
  16. Jmeter如何控制取样器执行顺序
  17. 验证码的实现 与jQuery阻止跳转封装数据库工具类oracle
  18. 申请邓白氏D-U-N-S编码遇到两个公司名称一样英文翻译的解决方法
  19. Pytorch里addmm()和addmm_()的用法详解
  20. 「Spring Boot」接口幂等性的4种实现方案

热门文章

  1. 适合运动时戴的耳机有哪些?五款运动耳机挑选推荐
  2. 运动耳机哪家强、顶级运动耳机推荐
  3. Sql 中内连接、外连接、全连接、交叉连接的区别
  4. vue 项目页面增加水印
  5. 【攻略】北京国际鲜花港
  6. python字符串常用方法及汇总
  7. java基础学不会,转:《学不会的JAVA,消不了的忧愁》之四-JSP教程,Java基础
  8. 【100亿次的挑战】之拜年红包和春晚彩蛋
  9. Bootstrap4.0前端框架
  10. [一年前写]华为面试官面试