Android自定义组件系列【16】

前一段时间要实现一个滚动的广告条,参考了一下网上许多实现,发现实现都很麻烦,所以我决定自己使用ViewFlipper来实现一个,在此将代码贴出来,,与大家共享。

转载请说明出处:

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博客: * */public class AutoViewFlipper extends FrameLayout{private static final int SLOP_DELAY_TIME = 3000; //滑动等待时间,单位msprivate 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() {@Overridepublic 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;@Overridepublic 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】

相关文章:

你感兴趣的文章:

标签云: