现在的位置: 首页 > 综合 > 正文

使用ViewFlipper实现图片左右滑动效果

2013年10月21日 ⁄ 综合 ⁄ 共 3997字 ⁄ 字号 评论关闭

在Eclipse中查看ViewFlipper的类关系图:

ViewFlipper,不妨把它看做一个容器吧,你可以把许多的View放在这个容器中,让它展示给用户,虽然它每次只展示一个view,我感觉它的用途更好是作为广告展示,比如类似购物网站那样的广告滚动展示。这个demo是一个手动滑动屏幕查看图片的例子,共有10张图片,左右滑动可以查看图片,效果不是很好。其实用ViewPager会更好些。

程序运行截图:

这个是Main类,它是点击icon就运行的主Activity,它只是负责把ViewFlipperView展示给用户。

public class Main extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(new ViewFlipperView(this));
	}
}

这是最关键的ViewFlipperView,展示图片的同时,也用一排点点来告诉用户已经展示到第几张图片了。

/**
 * 这是一个类似于ViewFlipper的Wiget。
 * @author haozi
 *
 */
public class ViewFlipperView extends FrameLayout implements IAdImages {

	private Context context;                           // 调用方的上下文
	private int currentAdImgIndex;                     // 当前广告图片索引
	private Animation left2RightInAnimation;           // 广告图片从左到右进入屏幕动画
	private Animation left2RightOutAnimation;          // 广告图片从左到右出去屏幕动画
	private Animation right2LeftInAnimation;           // 广告图片从右到左进入屏幕动画
	private Animation right2LeftOutAnimation;          // 广告图片从右到左出去屏幕动画
	private int animationDuration = 500;               // 动画花费时间500毫秒
	private ViewFlipper mViewFlipper;                  // 滑动页面控件
	private LinearLayout mTipLinearLayout;             // 下方点点控件
	private float startX = 0;                          // touch action down 时的x坐标
	private float endX = 0;                            // touch action up 时的x坐标
	
	
	public ViewFlipperView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		this.context = context;
		setView();
	}

	public ViewFlipperView(Context context, AttributeSet attrs) {
		super(context, attrs);
		this.context = context;
		setView();
	}

	public ViewFlipperView(Context context) {
		super(context);
		this.context = context;
		setView();
	}

	/**
	 * 显示View
	 */
	private void setView(){
		
		// 初始化
		int screenWidth = getResources().getDisplayMetrics().widthPixels;
		mViewFlipper = new ViewFlipper(context);
		mTipLinearLayout = new LinearLayout(context);
		// 初始化动画
		left2RightInAnimation = new TranslateAnimation(-screenWidth, 0, 0, 0);
		left2RightInAnimation.setDuration(animationDuration);
		left2RightOutAnimation = new TranslateAnimation(0, screenWidth, 0, 0);
		left2RightOutAnimation.setDuration(animationDuration);
		right2LeftInAnimation = new TranslateAnimation(screenWidth, 0, 0, 0);
		right2LeftInAnimation.setDuration(animationDuration);
		right2LeftOutAnimation = new TranslateAnimation(0, -screenWidth, 0, 0);
		right2LeftOutAnimation.setDuration(animationDuration);

		
		// 将广告图片加入ViewFlipper
		for(int i=0; i<adImages.length; i++){
			ImageView image = new ImageView(context);
			image.setImageResource(adImages[i]);
			mViewFlipper.addView(image);
		}
		addView(mViewFlipper);
		
		// 将图片索引点动态加入
		for(int i=0; i<adImages.length; i++){
			ImageView image = new ImageView(context);
			if(i == 0){
				image.setImageResource(R.drawable.point_selected);
			}else{
				image.setImageResource(R.drawable.point_normal);
			}
			image.setPadding(5, 0, 5, 20);
			mTipLinearLayout.addView(image);
		}
		// 点点放置在屏幕下方
		mTipLinearLayout.setGravity(Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL);
		addView(mTipLinearLayout);
	}
	
	@Override
	public boolean onTouchEvent(MotionEvent event) {
		
		switch (event.getAction()) {
		case MotionEvent.ACTION_DOWN:
			
			startX = event.getX();
			
			break;
		case MotionEvent.ACTION_UP:
			
			endX = event.getX();
			// 先保存上一个点
			ImageView lastTipImageView = (ImageView) mTipLinearLayout.getChildAt(currentAdImgIndex);
			
			if(currentAdImgIndex > 0 && endX > startX){// 查看前一页的广告

				mViewFlipper.setInAnimation(left2RightInAnimation);
				mViewFlipper.setOutAnimation(left2RightOutAnimation);
				mViewFlipper.showPrevious();
				currentAdImgIndex--;
				if(currentAdImgIndex < 0){
					currentAdImgIndex = 0;
				}
			}
			
			if(currentAdImgIndex < adImages.length-1 && endX < startX){// 查看后一页的广告

				mViewFlipper.setInAnimation(right2LeftInAnimation);
				mViewFlipper.setOutAnimation(right2LeftOutAnimation);
				mViewFlipper.showNext();
				currentAdImgIndex++;
				if(currentAdImgIndex > adImages.length-1){
					currentAdImgIndex = adImages.length-1;
				}
			}
			
			// 根据currentAdImgIndex改变底部点的状态
			ImageView currTipImageView = (ImageView) mTipLinearLayout.getChildAt(currentAdImgIndex);
			lastTipImageView.setImageResource(R.drawable.point_normal);
			currTipImageView.setImageResource(R.drawable.point_selected);
			
			break;		
		}	
		return true;
	}
}

这个是接口IAdImages,它保存要展示的图片id

/**
 * 图片信息接口
 * @author haozi
 *
 */
public interface IAdImages {

	/**
	 * 广告图片
	 */
	int[] adImages = {
			R.drawable.img01, R.drawable.img02, R.drawable.img03, R.drawable.img04, R.drawable.img05,
			R.drawable.img06, R.drawable.img07, R.drawable.img08, R.drawable.img09, R.drawable.img10
	};
}

源码下载地址:http://download.csdn.net/detail/hello_haozi/4815524

抱歉!评论已关闭.