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模拟器,制作的动态图片太卡了,就贴一下静 ...
随机推荐
- 上海交大课程MA430-偏微分方程续论(索伯列夫空间)之总结(Sobolev Space)
我们所用的是C.L.Evans "Partial Differential Equations" $\def\dashint{\mathop{\mathchoice{\,\rlap ...
- 洛谷—— P2983 [USACO10FEB]购买巧克力Chocolate Buying
https://www.luogu.org/problem/show?pid=2983 题目描述 Bessie and the herd love chocolate so Farmer John i ...
- 在swt中获取jar包中的文件 uri is not hierarchical
uri is not hierarchical 学习了:http://blog.csdn.net/zdsdiablo/article/details/1519719 在swt中获取jar包中的文件: ...
- C++ 数字、string 简便互转
一.数字转为 string 类型 借用 sprintf 函数: char buffer[256]; int counter = 10; sprintf(buffer,"%04i", ...
- STL_算法_Heap算法(堆排)(精)
C++ Primer 学习中. . . 简单记录下我的学习过程 (代码为主) /***************************************** STL-算法--Heap算法 堆排序 ...
- CIKM 2013 Paper CQARank: Jointly Model Topics and Expertise in Community Question Answering
中文简单介绍: 本文对怎样在问答社区对用户主题兴趣及专业度建模分析进行了研究,而且提出了针对此问题的统计图模型Topics Expertise Model. 论文出处:CIKM'13. 英文摘要: C ...
- MFC中CFileDialog使用方法
用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...
- BZOJ 3110 线段树套线段树
思路: 外围一个权值线段树 里面是个区间线段树 搞一个标记永久化 //By SiriusRen #include <cstdio> #include <cstring> #in ...
- POJ 3670 DP LIS?
权值为1~3 好了 此题是水题-- i表示到了第i个数,j表示结尾的数是j f[i][j]=min(f[i][j],f[i-1][k]+(a[i]!=j)) 1<=k<=j 最长上升的. ...
- Where to Store your JWTs – Cookies vs HTML5 Web Storage--转
原文地址:https://stormpath.com/blog/where-to-store-your-jwts-cookies-vs-html5-web-storage Update 5/12/20 ...