Android自定义组件系列【16】——最帅气的自动滚动广告条
前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用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】——最帅气的自动滚动广告条的更多相关文章
- Android自定义组件系列【7】——进阶实践(4)
上一篇<Android自定义组件系列[6]--进阶实践(3)>中补充了关于Android中事件分发的过程知识,这一篇我们接着来分析任老师的<可下拉的PinnedHeaderExpan ...
- Android自定义组件系列【6】——进阶实践(3)
上一篇<Android自定义组件系列[5]--进阶实践(2)>继续对任老师的<可下拉的PinnedHeaderExpandableListView的实现>进行了分析,这一篇计划 ...
- Android自定义组件系列【5】——进阶实践(2)
上一篇<Android自定义组件系列[5]--进阶实践(1)>中对任老师的<可下拉的PinnedHeaderExpandableListView的实现>前一部分进行了实现,这一 ...
- Android自定义组件系列【4】——自定义ViewGroup实现双侧滑动
在上一篇文章<Android自定义组件系列[3]--自定义ViewGroup实现侧滑>中实现了仿Facebook和人人网的侧滑效果,这一篇我们将接着上一篇来实现双面滑动的效果. 1.布局示 ...
- Android自定义组件系列【3】——自定义ViewGroup实现侧滑
有关自定义ViewGroup的文章已经很多了,我为什么写这篇文章,对于初学者或者对自定义组件比较生疏的朋友虽然可以拿来主义的用了,但是要一步一步的实现和了解其中的过程和原理才能真真脱离别人的代码,举一 ...
- Android自定义组件系列【12】——非UI线程绘图SurfaceView
一.SurfaceView的介绍 在前面我们已经会自定义View,使用canvas绘图,但是View的绘图机制存在一些缺陷. 1.View缺乏双缓冲机制. 2.程序必须重绘整个View上显示的图片,比 ...
- Android自定义组件系列【1】——自定义View及ViewGroup
View类是ViewGroup的父类,ViewGroup具有View的所有特性,ViewGroup主要用来充当View的容器,将其中的View作为自己孩子,并对其进行管理,当然孩子也可以是ViewGr ...
- Android自定义组件系列【17】——教你如何高仿微信录音Toast
一.Toast介绍 平时我们在Android开发中会经常用到一个叫Toast的东西,官方解释如下 A toast is a view containing a quick little message ...
- Android自定义组件系列【15】——四个方向滑动的菜单实现
今天无意中实现了一个四个方向滑动的菜单,感觉挺好玩,滑动起来很顺手,既然已经做出来了就贴出来让大家也玩弄一下. 一.效果演示 (说明:目前没有安装Android模拟器,制作的动态图片太卡了,就贴一下静 ...
随机推荐
- 紫书 习题 11-1 UVa 821 (Floyd)
水题, Floyd一遍就完了. #include<cstdio> #include<algorithm> #define REP(i, a, b) for(int i = (a ...
- Docker搭建MySQL的PXC集群
原文:Docker搭建MySQL的PXC集群 一.简介 PXC属于一套近乎完美的mysql高可用集群解决方案,相比那些比较传统的基于主从复制模式的集群架构MHA和MM+keepalived,galer ...
- CodeVS 1789 最大获利
1789 最大获利 2006年NOI全国竞赛 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 大师 Master 题目描述 Description 新的技术正冲击着 ...
- POJ——T 3687 Labeling Balls
http://poj.org/problem?id=3687 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 14842 ...
- hadoop-11-ambari-server安装
hadoop-11-ambari-server安装 #ambari 安装yum install ambari-servercd mysql-5.7.18/cp mysql-connector-java ...
- hive导入导出数据案例
查询数据: use ods;set /user.password=ODS-SH;select * from base_cdma_all limit 10; use tag_bonc;select * ...
- 安装xcode6 beta 后调试出现Unable to boot the iOS Simulator以及编译苹果官方Swift的demo报错failed with exit code 1的解决的方法
苹果昨天公布新语言Swift(雨燕),须要安装xcode6 以及mac os 系统为10.9以上. (xcode6 beta 可在官方下载.须要登录开发人员账号:mac os 系统直接更新就可以.在此 ...
- 大浪淘沙,JSP终将死去
首先讲明,我不是标题党. 这纯属我个人的意见.勿喷. 先来讲讲JSP是怎么出现的吧. 在早期的WEB中,JS.CSS远未成熟,技术慷慨向并不明白!因为前端语言的匮乏.各家大公司都推出基于后端的模板语言 ...
- JAVA:从public static void main(String args[])開始
我们都知道当你要执行一个JAVA文件的时候必需要有一个main函数. 这是为什么呢? 跟C语言的道理一样,当你执行一个文件的时候.你必需要有一个入口函数或者入口地址,在C里面是main函数.相同的在J ...
- Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本号 1. 框架选型的要求 1 1.1. 文档多 1 1.2. 跨平台 1 2. html解析器特性: 1 2 ...