最近做的项目,要用到滑动切换的效果,就是类似新闻客户端的图片一张一张的自动切换或者手动滑动切换,于是就搜集了一下资料,使用两种方式实现这样的效果,分别是ViewFlipper和ViewPager。这两种方式都比较容易的实现了手势滑动,但是ViewFlipper更容易实现循环滑动切换。

啥都先不说了,看看效果图

下面我们赶快进去到代码里面去吧!

1.     ViewFlipper是继承至FrameLayout的,所以它是一个Layout里面可以放置多个View。实现两种样式,第一种样式.类似新闻客户端中图片自动手动滑动切换 ,第二种样式.整个布局手动滑动切换 接下来就分别实现这两种样式,

第一种样式.类似新闻客户端中图片自动手动滑动切换

public class MyViewFlipperFirst extends Activity implements OnTouchListener {private ViewFlipper myViewFlipper;private TextView tvMessage;private String[] titles; // 图片标题private int[] imageResId; // 图片IDprivate RadioGroup mTopPage;private volatile boolean interrupt = false;//设置线程的中断标志位public static final int ADV_WHAT = 1;Thread mBannerThread;// 定义线程private float mDx = 0f;private final int lengh = 5; //切换的总长度private final Handler handler = new Handler();@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.viewflipper_one); // 加载布局myViewFlipper = (ViewFlipper) findViewById(R.id.viewflipper_one);mTopPage = (RadioGroup) findViewById(R.id.top_page);tvMessage = (TextView) findViewById(R.id.tv_message);imageResId = new int[] { R.drawable.a, R.drawable.b, R.drawable.c,R.drawable.d, R.drawable.e };// 加载数据titles = new String[lengh];titles[0] = "巩俐不低俗,我就不能低俗";titles[1] = "扑树又回来啦!再唱经典老歌引万人大合唱";titles[2] = "揭秘北京电影如何升级";titles[3] = "乐视网TV版大派送";titles[4] = "热血屌丝的反杀";myViewFlipper.setOnTouchListener(this);// 注册触摸事件showAdvertisementBanner();// 加载切换数据}@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubswitch (event.getAction()) {case MotionEvent.ACTION_DOWN:mDx = event.getX();return true;case MotionEvent.ACTION_MOVE:return true;case MotionEvent.ACTION_UP:float dx = event.getX();float x = dx - mDx;mDx = 0f;// 判断是向左还是向右滑动if (x > 0) {// 向右滑动showPrev();} else {// 向左滑动showNext();}return true;default:break;}return false;}// 广告private void showAdvertisementBanner() {myViewFlipper.removeAllViews(); // 清除原始数据mTopPage.removeAllViews();// 清除原始数据LayoutParams lp = new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT);// 给myViewFlipper中加入图片组件(动态添加组件)for (int i = 0; i < lengh; i++) {ImageView child = new ImageView(this);child.setLayoutParams(lp);child.setScaleType(ScaleType.FIT_XY);child.setBackgroundResource(imageResId[i]);myViewFlipper.addView(child);}LayoutParams lpDot = new LayoutParams(25, 25);// 给mTopPage中加入圆点for (int j = 0; j < lengh; j++) {RadioButton dot = new RadioButton(this);dot.setButtonDrawable(R.drawable.res_radio_home_page);dot.setGravity(Gravity.CENTER);dot.setLayoutParams(lpDot);dot.setEllipsize(TruncateAt.MARQUEE);dot.setPadding(0, 0, 0, 0);mTopPage.addView(dot);}// 初始化数据changeshowNextBanner(0);showMessage(0);mBannerThread = new Thread(new AdvBannerRunnable());mBannerThread.start();// 启动线程}// 启动线程private class AdvBannerRunnable implements Runnable {@Overridepublic void run() {Looper.prepare();Thread.currentThread();while (!interrupt) {try {Thread.sleep(2000);// 休眠2秒,切换下一张Message msg = new Message();msg.what = ADV_WHAT;handler.post(new Runnable() {public void run() {showNext();}});} catch (InterruptedException e) {}}}}// 下一张private void showNext() {if (myViewFlipper.getChildCount() <= 1) {return;}// 进入进出动画int in = R.anim.push_left_in;int out = R.anim.push_left_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showNext();//myViewFlipper自带的方法,调用下一张changeshowNextBanner(myViewFlipper.getDisplayedChild());showMessage(myViewFlipper.getDisplayedChild());}// 前一张private void showPrev() {if (myViewFlipper.getChildCount() <= 1) {return;}// 进入进出动画int in = R.anim.push_right_in;int out = R.anim.push_right_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showPrevious();myViewFlipper自带的方法,调用前一张changeshowNextBanner(myViewFlipper.getDisplayedChild());showMessage(myViewFlipper.getDisplayedChild());}// 显示文字private void showMessage(int position) {tvMessage.setText(titles[position]);}// 改变圆点的状态private void changeshowNextBanner(int position) {RadioButton page = (RadioButton) mTopPage.getChildAt(position);if (page == null) {return;}page.setChecked(true);} }

第二种样式.整个布局手动滑动切换

public class MyViewFlipperSecond extends Activity implements OnGestureListener, OnTouchListener {private ViewFlipper myViewFlipper;private GestureDetector myGestureDetector;private TextView tvMessage;private ImageView im_pic;private String[] titles; // 图片标题private int[] imageResId; // 图片IDprivate RadioGroup mTopPage;private ImageView imageView;private ImageView[] imageViews;//圆点private final int lengh = 6;//切换的总长度@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.viewflipper_two);//加载布局myViewFlipper = (ViewFlipper) findViewById(R.id.myViewFlipper);mTopPage = (RadioGroup) findViewById(R.id.top_page1);LayoutInflater factory = LayoutInflater.from(MyViewFlipperSecond.this);imageResId = new int[] { R.drawable.feature_guide_0,R.drawable.feature_guide_1, R.drawable.feature_guide_2,R.drawable.feature_guide_3, R.drawable.feature_guide_4,R.drawable.feature_guide_5 };titles = new String[imageResId.length];titles[0] = "随着Windows Phone逐步渗入中国智能手机市场,Windows Phone作为移动操作平台的新锐,自然不会失宠。Windows Phone 7在中国没有流行的原因,很大程度上是因为在中国并没有上市。现在,诺基亚和微软宣布达成紧密战略合作之后,沉寂许久的Windows Phone操作系统再次走入了人们关注的视野,成了移动应用开发者继iOS和Android之外的另一选择。";titles[1] = "好友曾向我展示了最新的iPhone和iPad版《极品飞车》。游戏的渲染效果令人印象深刻,是款蓄势待发的优秀游戏。但是,游戏的前端是典型的UI设计偏差案例。但界面中有大量的属性数据等内容,它在玩家没有时间做决定时提供了过多的内容。这些内容能够显著改变他们的游戏体验,但却在玩家往往感受不到变化的时候呈现。";titles[2] = "3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举行。来自全世界的移动互联网精英在此交流经验、相互学习。同时这次我们有幸也采访到了CocoaChina的CEO陈昊芝先生。他将为我们揭秘苹果新榜单的算法秘密,并未我们带来捕鱼达人成功的推广经验,对微软Windows Phone平台的吐槽和对未来3D技术趋势的前瞻。";titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。";titles[4] = "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售";titles[5] = "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。"; //加载切换的内容for (int i = 0; i < lengh; i++) {View view = factory.inflate(R.layout.item01, null);tvMessage = (TextView) view.findViewById(R.id.tv1_message);im_pic = (ImageView) view.findViewById(R.id.im1_pic);tvMessage.setText(titles[i]);im_pic.setBackgroundResource(imageResId[i]);myViewFlipper.addView(view);}imageViews = new ImageView[lengh]; //加载圆点for (int i = 0; i < lengh; i++) {imageView = new ImageView(MyViewFlipperSecond.this);imageView.setLayoutParams(new LayoutParams(20, 20));imageView.setPadding(20, 0, 20, 0);imageViews[i] = imageView;if (i == 0) {// 默认选中第一张图片imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);} else {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}mTopPage.addView(imageViews[i]);}changeshowBannerPage(0);myGestureDetector = new GestureDetector(this);myViewFlipper.setOnTouchListener(this);myViewFlipper.setLongClickable(true);}@Overridepublic boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubreturn myGestureDetector.onTouchEvent(event);}@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// TODO Auto-generated method stub// 按下时的横坐标大于放开时的横坐标,从右向左滑动if (e1.getX() > e2.getX()) {showAdvertisementNext();}// 按下时的横坐标小于放开时的横坐标,从左向右滑动else if (e1.getX() < e2.getX()) {showPrev();}return false;}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,float distanceY) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}private void showPrev() {if (myViewFlipper.getChildCount() <= 1) {return;}int in = R.anim.push_right_in;int out = R.anim.push_right_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showPrevious();changeshowBannerPage(myViewFlipper.getDisplayedChild());}private void showAdvertisementNext() {if (myViewFlipper.getChildCount() <= 1) {return;}int in = R.anim.push_left_in;int out = R.anim.push_left_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showNext();changeshowBannerPage(myViewFlipper.getDisplayedChild());}// 改变状态private void changeshowBannerPage(int position) {for (int i = 0; i < imageViews.length; i++) {imageViews[position].setBackgroundResource(R.drawable.page_indicator_focused);if (position != i) {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}}} }

2.     ViewPager用于实现多页面的切换效果,该类存在于Google的兼容包里面,所以在引用时记得在BuilldPath中加入“android-support-v4.jar”,这里还是实现了两种样式的滑动,类似新闻客户端中图片自动手动滑动切换和整个布局手动滑动切换接下来就具体看看是如何实现这两种样式,

第一种样式.类似新闻客户端中图片自动手动滑动切换

public class MyViewPagerFirst extends Activity {private ViewPager viewPager; // android-support-v4中的滑动组件private List<imageview> imageViews; // 滑动的图片集合private String[] titles; // 图片标题private int[] imageResId; // 图片IDprivate List<view> dots; // 图片标题正文的那些点private TextView tv_title;private int currentItem = 0; // 当前图片的索引号private ScheduledExecutorService scheduledExecutorService;// 切换当前显示的图片private Handler handler = new Handler() {public void handleMessage(android.os.Message msg) {viewPager.setCurrentItem(currentItem);// 切换当前显示的图片};};@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.viewpager_one);imageResId = new int[] { R.drawable.a, R.drawable.b, R.drawable.c, R.drawable.d, R.drawable.e };titles = new String[imageResId.length];titles[0] = "巩俐不低俗,我就不能低俗";titles[1] = "扑树又回来啦!再唱经典老歌引万人大合唱";titles[2] = "揭秘北京电影如何升级";titles[3] = "乐视网TV版大派送";titles[4] = "热血屌丝的反杀";imageViews = new ArrayList<imageview>();// 初始化图片资源for (int i = 0; i < imageResId.length; i++) {ImageView imageView = new ImageView(this);imageView.setImageResource(imageResId[i]);imageView.setScaleType(ScaleType.CENTER_CROP);imageViews.add(imageView);}dots = new ArrayList<view>();dots.add(findViewById(R.id.v_dot0));dots.add(findViewById(R.id.v_dot1));dots.add(findViewById(R.id.v_dot2));dots.add(findViewById(R.id.v_dot3));dots.add(findViewById(R.id.v_dot4));tv_title = (TextView) findViewById(R.id.tv_title);tv_title.setText(titles[0]);//viewPager = (ViewPager) findViewById(R.id.vp);viewPager.setAdapter(new MyAdapter());// 设置填充ViewPager页面的适配器// 设置一个监听器,当ViewPager中的页面改变时调用viewPager.setOnPageChangeListener(new MyPageChangeListener());}@Overrideprotected void onStart() {scheduledExecutorService = Executors.newSingleThreadScheduledExecutor();// 当Activity显示出来后,每两秒钟切换一次图片显示scheduledExecutorService.scheduleAtFixedRate(new ScrollTask(), 1, 2, TimeUnit.SECONDS);super.onStart();}@Overrideprotected void onStop() {// 当Activity不可见的时候停止切换scheduledExecutorService.shutdown();super.onStop();}/*** 换行切换任务* * @author Administrator* */private class ScrollTask implements Runnable {public void run() {synchronized (viewPager) {System.out.println("currentItem: " + currentItem);currentItem = (currentItem + 1) % imageViews.size();handler.obtainMessage().sendToTarget(); // 通过Handler切换图片}}}/*** 当ViewPager中页面的状态发生改变时调用* * @author Administrator* */private class MyPageChangeListener implements OnPageChangeListener {private int oldPosition = 0;/*** This method will be invoked when a new page becomes selected.* position: Position index of the new selected page.*/public void onPageSelected(int position) {currentItem = position;tv_title.setText(titles[position]);dots.get(oldPosition).setBackgroundResource(R.drawable.dot_normal);dots.get(position).setBackgroundResource(R.drawable.dot_focused);oldPosition = position;}public void onPageScrollStateChanged(int arg0) {}public void onPageScrolled(int arg0, float arg1, int arg2) {}}/*** 填充ViewPager页面的适配器* * @author Administrator* */private class MyAdapter extends PagerAdapter {@Overridepublic int getCount() {return imageResId.length;}@Overridepublic Object instantiateItem(View arg0, int arg1) {((ViewPager) arg0).addView(imageViews.get(arg1));return imageViews.get(arg1);}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {((ViewPager) arg0).removeView((View) arg2);}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {}@Overridepublic Parcelable saveState() {return null;}@Overridepublic void startUpdate(View arg0) {}@Overridepublic void finishUpdate(View arg0) {}} }

第二种样式.整个布局手动滑动切换

public class MyViewPagerSecond extends Activity {private ViewPager viewPager;private ArrayList<view> pageViews;private ImageView imageView;private ImageView im_pic;private TextView tvMessage;private ImageView[] imageViews;// 包裹滑动图片LinearLayoutprivate ViewGroup main;// 包裹小圆点的LinearLayoutprivate ViewGroup group;private String[] titles; // 图片标题private int[] imageResId; // 图片ID@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);// setContentView(R.layout.viewpager_two);// 设置无标题窗口requestWindowFeature(Window.FEATURE_NO_TITLE);imageResId = new int[] { R.drawable.feature_guide_0,R.drawable.feature_guide_1, R.drawable.feature_guide_2,R.drawable.feature_guide_3, R.drawable.feature_guide_4,R.drawable.feature_guide_5 };titles = new String[imageResId.length];titles[0] = "随着Windows Phone逐步渗入中国智能手机市场,Windows Phone作为移动操作平台的新锐,自然不会失宠。Windows Phone 7在中国没有流行的原因,很大程度上是因为在中国并没有上市。现在,诺基亚和微软宣布达成紧密战略合作之后,沉寂许久的Windows Phone操作系统再次走入了人们关注的视野,成了移动应用开发者继iOS和Android之外的另一选择。";titles[1] = "好友曾向我展示了最新的iPhone和iPad版《极品飞车》。游戏的渲染效果令人印象深刻,是款蓄势待发的优秀游戏。但是,游戏的前端是典型的UI设计偏差案例。但界面中有大量的属性数据等内容,它在玩家没有时间做决定时提供了过多的内容。这些内容能够显著改变他们的游戏体验,但却在玩家往往感受不到变化的时候呈现。";titles[2] = "3月31日,第四届CocoaChina游戏开发者大会暨Cocos2D-X技术研讨会在北京举行。来自全世界的移动互联网精英在此交流经验、相互学习。同时这次我们有幸也采访到了CocoaChina的CEO陈昊芝先生。他将为我们揭秘苹果新榜单的算法秘密,并未我们带来捕鱼达人成功的推广经验,对微软Windows Phone平台的吐槽和对未来3D技术趋势的前瞻。";titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。";titles[4] = "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售";titles[5] = "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。";LayoutInflater inflater = getLayoutInflater();pageViews = new ArrayList<view>();for (int i = 0; i < 6; i++) {View view = inflater.inflate(R.layout.item01, null);tvMessage = (TextView) view.findViewById(R.id.tv1_message);im_pic = (ImageView) view.findViewById(R.id.im1_pic);tvMessage.setText(titles[i]);im_pic.setBackgroundResource(imageResId[i]);pageViews.add(view);}main = (ViewGroup) inflater.inflate(R.layout.viewpager_two, null);group = (ViewGroup) main.findViewById(R.id.viewGroup);viewPager = (ViewPager) main.findViewById(R.id.guidePages);imageViews = new ImageView[pageViews.size()];for (int i = 0; i < pageViews.size(); i++) {imageView = new ImageView(MyViewPagerSecond.this);imageView.setLayoutParams(new LayoutParams(20, 20));imageView.setPadding(20, 0, 20, 0);imageViews[i] = imageView;if (i == 0) {// 默认选中第一张图片imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);} else {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}group.addView(imageViews[i]);}setContentView(main);viewPager.setAdapter(new GuidePageAdapter());viewPager.setOnPageChangeListener(new GuidePageChangeListener());}// 指引页面数据适配器class GuidePageAdapter extends PagerAdapter {@Overridepublic int getCount() {return pageViews.size();}@Overridepublic boolean isViewFromObject(View arg0, Object arg1) {return arg0 == arg1;}@Overridepublic int getItemPosition(Object object) {// TODO Auto-generated method stubreturn super.getItemPosition(object);}@Overridepublic void destroyItem(View arg0, int arg1, Object arg2) {// TODO Auto-generated method stub((ViewPager) arg0).removeView(pageViews.get(arg1));}@Overridepublic Object instantiateItem(View arg0, int arg1) {// TODO Auto-generated method stub((ViewPager) arg0).addView(pageViews.get(arg1));return pageViews.get(arg1);}@Overridepublic void restoreState(Parcelable arg0, ClassLoader arg1) {// TODO Auto-generated method stub}@Overridepublic Parcelable saveState() {// TODO Auto-generated method stubreturn null;}@Overridepublic void startUpdate(View arg0) {// TODO Auto-generated method stub}@Overridepublic void finishUpdate(View arg0) {// TODO Auto-generated method stub}}// 指引页面更改事件监听器class GuidePageChangeListener implements OnPageChangeListener {@Overridepublic void onPageScrollStateChanged(int arg0) {// TODO Auto-generated method stub}@Overridepublic void onPageScrolled(int arg0, float arg1, int arg2) {// TODO Auto-generated method stub}@Overridepublic void onPageSelected(int arg0) {for (int i = 0; i < imageViews.length; i++) {imageViews[arg0].setBackgroundResource(R.drawable.page_indicator_focused);if (arg0 != i) {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}}}} }

以上就是具体实现滑动切换的主类,Demo里面用到的布局、图片资源都放在下载里面去了,用到的朋友欢迎下载!第一次写博客,有许多问题,望大家见谅。有什么问题请留言!

PS 在实际的项目中可能会遇到滑动的界面里面有ScrollView,那按照上面的方法,左右滑动和上下滑动就冲突了,

解决办法如下:首先自定义一个ScrollView

public class MyScrollView extends ScrollView {GestureDetector gestureDetector;public MyScrollView(Context context) {super(context);// TODO Auto-generated constructor stub}public MyScrollView(Context context, AttributeSet attrs) {super(context, attrs);// TODO Auto-generated constructor stub}public MyScrollView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);// TODO Auto-generated constructor stub}public void setGestureDetector(GestureDetector gestureDetector) {this.gestureDetector = gestureDetector;}@Overridepublic boolean onTouchEvent(MotionEvent event) {super.onTouchEvent(event);return gestureDetector.onTouchEvent(event);//将当前的手势返回到当前的手势监听器中,以触发相应手势处理事件}@Overridepublic boolean dispatchTouchEvent(MotionEvent ev) {gestureDetector.onTouchEvent(ev);super.dispatchTouchEvent(ev);return true;} }

接着定义一个界面类MyViewFlipperThird

public class MyViewFlipperThird extends Activity {private ViewFlipper myViewFlipper;private GestureDetector myGestureDetector;private TextView tvMessage;private ImageView im_pic;private String[] titles; // 图片标题private int[] imageResId; // 图片IDprivate RadioGroup mTopPage;private ImageView imageView;private ImageView[] imageViews;private final int lengh = 4;LayoutInflater inflater;private MyScrollView myScrollView = null;private int selectedPosition = 0;@Overrideprotected void onCreate(Bundle savedInstanceState) {// TODO Auto-generated method stubsuper.onCreate(savedInstanceState);setContentView(R.layout.viewflipper_two);myViewFlipper = (ViewFlipper) findViewById(R.id.myViewFlipper);mTopPage = (RadioGroup) findViewById(R.id.top_page1);imageResId = new int[] { R.drawable.meinv1, R.drawable.meinv2,R.drawable.meinv3, R.drawable.meinv4 };titles = new String[imageResId.length];titles[0] = "PayPal基于Hadoop的文本挖掘系统是公司内各种数据科学活动的关键组成部分,这些数据科学活动包括预测建模、情绪分析、影响力评级、简历排名还有主题建模和聚类分析。Ambati说:如果没有仪表盘程序,这些文本本身不存在任何额外的价值,不过这些文本可以与我们的其他数据结合起来使用,而且有一些公司或许会需要这些数据进行更多的预测建模,"+ "该公司使用NLP(自然语言处理)算法从交易过程的谈话数据中提取有价值的信息,提高商户交易的成功率。"+ "然而PayPal没有采用Netflix那种直接的推荐方式。Netflix通过四或五星级评级标识用户的偏好,然后采用商品推荐系统向用户推荐商品。但Ambati指出,事实上,用户购买某种商品并不能说明用户喜欢这个商品,Netflix的方式存在问题。"+ "当消费者浏览商户的商品时,我们事实上并不知道消费者是否对商户有好感,因为有可能消费者只是对品牌或者商品感兴趣,所以我们进行文本挖掘,分析产品信息以了解消费者是否对某种品牌感兴趣,然后再进行商品推荐。";titles[1] = "Android逆向助手是一功能强大的逆向辅助软件。该软件可以帮助用户来进行apk反编译打包签名;dex/jar互转替换提取修复;so反编译;xml、txt加密;字符串编码等等,操作简单,只需要直接将文件拖放到源和目标文件。"+ "android逆向工程 问题说明:1.没有完整的动态调试程序。目前由于android系统的bionic并不完全支持POSIX,导致现有编译的gdb不支持多线程无符号调试。(我实验了一下,的确多线程问题比较多,当然,gdb本身也有问题)。所以对于NDK逆向工程比较麻烦,以静态分析为主。2.手机本身种类较多,而且android版本繁多,更新较快,增加了逆向的难度。但是android系统自身也有好处:1.手机系统的简化工作让分析也随着简化 2.公开源代码 大不了我修改系统API编译系统来进行API hook。谁也拦不住。(android不支持LD_Library API hook)";titles[2] = "cocos2d-x是一个支持多平台的 2D 手机游戏引擎,使用 C++ 开发,基于OpenGL ES,支持 WOPhone, iOS 4.1, Android 2.1 及更高版本,WindowsXP & Windows7,WindowsPhone 8"+ "Cocos2d-x是一个开源的移动2D游戏框架,MIT许可证下发布的。这是一个C++的版本。Cocos2d-x项目可以很容易地建立和运行iOS,我们可以编写的源代码很容易在桌面操作系统中编辑和调试。"+ "cocos2d-x的主要特效包括跨平台性、免费开源性、活跃社区支持等,这些特性使得开发人员可以容易,高效和低成本开发出用户喜欢的移动平台游戏。跨平台性主要包括,其可以开发基于IOS ANDROID WINDOWS BADA 等平台的游戏,免费开源指的是,cocos2d-x的开源与众多的工具和文档让开发者学习起来更加的轻松容易,活跃的社区支持是指,现在cocos2d-x通过这么多年的发展,使得这个开源项目更加的强壮与稳定,所有的BUG跟缺陷都可以很快的发现,并进行修复,很多大型的公司的工程师都投入到了cocos2d-x的开发";titles[3] = "北京时间4月1日消息,谷歌虽然一直以来都在地图产品上提供和完善各种各样的系统接口,但是迄今为止却一直忽略了广受欢迎的NES游戏。然而也就是今天搜索巨头谷歌利用愚人节的机会,“调皮”地推出流行的NES八位地图产品。"+ "在NASA和美国国家地理的参与下,这群小鸟摆脱了地球引力,跑到了太空,这就是即将在2012年3月22日公测的《愤怒的小鸟:太空版》。为了让小鸟们成功解救出它们珍贵的“无价之蛋”,美国国家地理为此出版了一本书,来提供完成任务所需的关于行星、卫星、银河系等关于外太空的知识,并将于3月20日开始发售"+ "Google搜索引擎已经赢得全球范围的赞誉,而这一切都要归功于Google开创性的MapReduce。Google搜索引擎算法只是其搜索引擎的一部分,在后台支持Google算法的基础设施才是真正的幕后英雄,其基础设施可快速的索引链接成千上万台普通服务器。MapReduce的成功也直接推动了Hadoop的发展。";imageViews = new ImageView[lengh];for (int i = 0; i < lengh; i++) {imageView = new ImageView(MyViewFlipperThird.this);imageView.setLayoutParams(new LayoutParams(20, 20));imageView.setPadding(20, 0, 20, 0);imageViews[i] = imageView;if (i == 0) {// 默认选中第一张图片imageViews[i].setBackgroundResource(R.drawable.page_indicator_focused);} else {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}mTopPage.addView(imageViews[i]);}myGestureDetector = new GestureDetector(new CommonGestureListener());myViewFlipper.addView(getContentView(selectedPosition));// 设置初始页面changeshowBannerPage(selectedPosition);// 设置底部圆点}// 加载布局private View getContentView(int i) {inflater = getLayoutInflater();View view = inflater.inflate(R.layout.item02, null);tvMessage = (TextView) view.findViewById(R.id.tv1_message);im_pic = (ImageView) view.findViewById(R.id.im1_pic);myScrollView = (MyScrollView) view.findViewById(R.id.myscrollview);tvMessage.setText(titles[i]);im_pic.setBackgroundResource(imageResId[i]);myScrollView.setOnTouchListener(onTouchListener);myScrollView.setGestureDetector(myGestureDetector);return view;}// 上一张private void showPrev() {if (myViewFlipper.getChildCount() <= 1) {return;}int in = R.anim.push_right_in;int out = R.anim.push_right_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showPrevious();changeshowBannerPage(selectedPosition);}// 下一张private void showAdvertisementNext() {if (myViewFlipper.getChildCount() <= 1) {return;}int in = R.anim.push_left_in;int out = R.anim.push_left_out;myViewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, in));myViewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, out));myViewFlipper.showNext();changeshowBannerPage(selectedPosition);}// 改变状态private void changeshowBannerPage(int position) {for (int i = 0; i < imageViews.length; i++) {imageViews[position].setBackgroundResource(R.drawable.page_indicator_focused);if (position != i) {imageViews[i].setBackgroundResource(R.drawable.page_indicator);}}}// 触摸事件private View.OnTouchListener onTouchListener = new View.OnTouchListener() {public boolean onTouch(View v, MotionEvent event) {// TODO Auto-generated method stubreturn myGestureDetector.onTouchEvent(event);}};// 手势监听器public class CommonGestureListener extends SimpleOnGestureListener {@Overridepublic boolean onDown(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic void onShowPress(MotionEvent e) {// TODO Auto-generated method stubsuper.onShowPress(e);}@Overridepublic void onLongPress(MotionEvent e) {// TODO Auto-generated method stub}@Overridepublic boolean onSingleTapConfirmed(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onSingleTapUp(MotionEvent e) {// TODO Auto-generated method stubreturn false;}@Overridepublic boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) {// e1是手指离开时的MotionEvent,e2是手指接触时的MotionEvent// TODO Auto-generated method stubif (e1.getX() - e2.getX() > 100 & Math.abs(velocityX) > 50) {// 向左selectedPosition = selectedPosition + 1 < lengh ? (selectedPosition + 1): 0;myViewFlipper.addView(getContentView(selectedPosition));showAdvertisementNext();myViewFlipper.removeViewAt(0);} else if (e2.getX() - e1.getX() > 100 & Math.abs(velocityX) > 50) {// 向右selectedPosition = selectedPosition > 0 ? (selectedPosition - 1): (lengh - 1);myViewFlipper.addView(getContentView(selectedPosition));showPrev();myViewFlipper.removeViewAt(0);}return true;}@Overridepublic boolean onScroll(MotionEvent e1, MotionEvent e2,float distanceX, float distanceY) {// TODO Auto-generated method stubreturn super.onScroll(e1, e2, distanceX, distanceY);}} }

ps:代码下载地址

Android 滑动切换(首页展示,图片、新闻自动切换,循环切换,自动和手动)相关推荐

  1. 【Unity】UGUI动态切换不同尺寸图片时自动设置Image大小

    UGUI动态切换不同尺寸图片时自动设置Image大小: 1. image.SetNativeSize(),将Image设置为贴图的原始尺寸 2. sprite.rect获取贴图尺寸,rectTrans ...

  2. 智能玩具 数据采集 首页展示 注册 登录 自动登录 二维码图片

    玩具需求分析 1.语音实时通讯 - 让玩具成为孩子与父母之间沟通的桥梁 分支 建立幼儿社交圈2.积极正面幼教内容 - 让玩具能够播放 父母选定的儿歌,故事,百科,英语- 通过语音识别内容名称 玩具可以 ...

  3. Android 朋友圈九宫格展示图片

    现在有很多列表都会展示图片,有的像社交软件似的九宫格,然而我这个是当图片是一张时,就会显示一张,2张时会平铺,大于3张就会像九宫格那样.当然这里你也可以设置一排显示多少张.其中也有点击放大图片. 效果 ...

  4. 微信android手机中点击大图片会自动放大图片

    自己使用的是微信Android客户端,使用img标签的src属性将图片设置好了以后,在微信中调试,点击图片竟然放大,自己没写放大图片的方法,也没有调用wx.previewImage()方法,最后查找, ...

  5. 【Android】实现九宫格展示图片+视频(仿QQ空间、微信朋友圈)

    CSDN的Markdown很多功能不支持,详情写到Github上了. Github地址:https://github.com/littlecurl/NineGridView 这里放上预览图吧 欢迎访问 ...

  6. 使用Axure制作无限循环展示图片效果

    一.实现的效果 如图: 1.此次需要实现的效果是,进入界面后,在图片展示区域的图片根据事先设定好的时间,自动切换不同的图片: 2.循环不间断: 3.页面不出现闪烁的现象. 二.做前工作 图片:4张 软 ...

  7. JavaScript html 图片滑动切换效果,幻灯片式切换,新闻展示,滚动新闻

    新闻展示,滚动新闻 程序说明 原理就是通过不断设置滑动对象的left(水平切换)和top(垂直切换)来实现图片切换的动态效果. 首先需要一个容器,程序会自动设置容器overflow为hidden,如果 ...

  8. UIScrollView+UIPageControl+NSTimer实现图片的自动滑动以及用户可手动切换,UIPageControl可点击

    原文链接http://blog.csdn.net/zhuiyi316/article/details/7756472 研究了一整天的成果,也借鉴了网上的一些资料,参考了http://huluwa.me ...

  9. 超强的jquery极品插件--色彩选择器类/ 右键菜单类/ 图片新闻flash展示类

    Farbtastic Farbtastic是一个color picker插件.它能够在一个页面中加入多个颜色选择控件,然后每个控件关联到页面中的一个元素比如:文本输入框. Farbtastic jQu ...

最新文章

  1. C++中的封装、继承、多态
  2. JS监听手机物理返回键,返回到指定页面
  3. boost::contract模块没有宏实现base types的测试程序
  4. 华为、阿里员工在听的英语资源,即将过期,请自取
  5. 多线程编程: Compare And Swap (CAS)
  6. BZOJ 2566 xmastree(树分治+multiset)
  7. [剑指offer]面试题17:合并两个排序的链表
  8. ADO.NET+Access: 3,参数 @departmentName 没有默认值
  9. C#学习常用方法(3000)---Foreach ,in
  10. 基于jQuery的新浪游戏首页幻灯片
  11. StringBuffer类的常用方法
  12. 使用ANNdotNET GUI工具创建CIFAR-10深度学习模型
  13. 为什么很多人说Python简单呢?
  14. C# Windows 窗体的.Net 框架绘图技术
  15. JavaWeb — 请求响应流程图
  16. Postfix 故障记录
  17. Cellular Network
  18. MacBook Pro 屏幕黑线、条纹、线条、舞台灯、残影、横线这样的排线门问题你遇到了吗?很有可能源于官方的设计缺陷,你该何去何从?
  19. 收不到oracle注册邮件或无法登录
  20. Quartz 定时任务管理

热门文章

  1. JS中的location属性
  2. Android 弹出对话框怎么做?(小白速成9)
  3. 基于微信小程序的中医药配方系统+后台管理系统(SSM+mysql)-JAVA.VUE【数据库设计、论文、源码、开题报告】
  4. java openjdk_OpenJDK的安装与配置
  5. 女生学UI设计的一些优势,转行者必看!
  6. realvnc,realvnc软件是干什么的?有什么作用?
  7. Centos 7.6 KdumpCrash配置
  8. Good tool for creating excel : NPOI
  9. 以太网交换机有何特点?用它怎样组成虚拟局域网?
  10. centos7 添加开机启动命令