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模拟器,制作的动态图片太卡了,就贴一下静 ...
随机推荐
- SCIP,Clp,Gurobi和Cplex安装
SCIP安装 1.在自己的家目录下建立目录scip,并将获得的压缩包考入该文件夹并解压缩 tar -zxvf scipoptsuite-5.0.0.tgz 2.进入目录scipoptsuite-5.0 ...
- java 对象 拆箱装箱 编译和反编译的验证
创建对象 package 创建对象的个数; public class main { public static void main(String[] agrs){ Check c1=new Check ...
- vue-cli#2.0项目结构分析
项目结构 build 构建工具相关的目录 config 配置目录 dist 通过工具打包生成的最终需要上线的目录 node_modules 存放本地开发所有的依赖包的目录 src 源码目录 stati ...
- pandas 8 画图
from __future__ import print_function import pandas as pd import numpy as np import matplotlib.pyplo ...
- Ubuntu设置显示桌面快捷键
Ubuntu设置显示桌面快捷键 直接在系统设置中没有效果, 学习了:http://www.cnblogs.com/pluse/p/5286585.html 需要进行安装compizconfig,然后在 ...
- ScrollView反弹效果的实现
发现非常多APP的界面都能够滑动,QQ.微信等等,自己琢磨了下.效果例如以下: 代码:ScrollView package com.wsj.wsjdemo; import android.conten ...
- Unity Image Effect
1.工作原理 Image Effect是运用于一个Camera,将Camera视见体最终看到的二维图像内容作为一个2DTexture传递给一个Shader, 然后在Shader的Fragment渲染阶 ...
- sass03 变量、样式导入
demo1.scss @import "css.css"; //导入css文件 @import "http://ss/xx"; //导入css文件 @impor ...
- angularjs 路由 ngRoute tab切换
<!DOCTYPE HTML> <html ng-app="myApp"> <head> <meta http-equiv="C ...
- powershell输出错误信息到文件
https://stackoverflow.com/questions/8925323/redirection-of-standard-and-error-output-appending-to-th ...