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模拟器,制作的动态图片太卡了,就贴一下静 ...
随机推荐
- PatentTips - Controlling voltage and frequency
BACKGROUND OF THE INVENTION Mobile devices, such as but not limited to personal data appliances, cel ...
- C++的hashmap和Java的hashmap
C++里面是这样的:typedef std::unordered_map<std::string,std::string> stringmap; std::unordered_map< ...
- "duplicate symbol for architecture i386" 解决的方法
我在写项目的过程中,碰到了这个错误,我在网上查了一下,发现这个错误的原因是,project里面有反复的类. 解决方式:找到反复的类,然后删除掉就好了. 分析一下, 如图. 能够看出, 错误类型是 du ...
- 在AutoLyout中动态获得cell的高度 和 autoLyout中的小随笔
autoLyout中动态获得cell的高度和autoLyout小总结 一.在autoLyout中通过动态的方式来获取cell 的方式呢? 1. 在布局时候要有对于cell中contentV ...
- 使用quick自己定义Button
使用quick时自己封装的类存放于特定的文件夹.便于以后使用 以下是作者经经常使用到的一个按钮 local MyButton = class("MyButton") functio ...
- bzoj2438: [中山市选2011]杀人游戏(强联通+特判)
2438: [中山市选2011]杀人游戏 题目:传送门 简要题意: 给出n个点,m条有向边,进行最少的访问并且可以便利(n-1)个点,求这个方案成功的概率 题解: 一道非常好的题目! 题目要知道最大的 ...
- 48.AngularJS ng-src 指令
转自:https://www.cnblogs.com/best/tag/Angular/ 1. <!DOCTYPE html> <html> <head> < ...
- CUDA笔记13
在新的环境上用CUTIL的时候,出现了问题.无法解析的外部符号 __imp_cutCheckCmdLineFlag 问题描述: kernel.cu.obj : error LNK2019: 无法解析的 ...
- 一篇文章助你理解Python3中字符串编码问题
前几天给大家介绍了unicode编码和utf-8编码的理论知识,以及Python2中字符串编码问题,没来得及上车的小伙伴们可以戳这篇文章:浅谈unicode编码和utf-8编码的关系和一篇文章助你理解 ...
- SPOJ 7258 SUBLEX 后缀数组 + 二分答案 + 前缀和
Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...