前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用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;
- }
- }