通过滑动来切换图片可以直接使用布局中Image图片,设置它的切入切出动画。但是API提供了一个控件ViewPager来实现这类效果。 首次进入应用程序界面的滑动效果功能分析 图片切换ViewPager实现 点切换Selector(图片选择器)和Shape(形状xml文件)实现 ViewPager与ListView和GridView一样也需要设置Adapter,首先需要定义一个类继承PagerAdapter。如下重写其四个个方法,getCount(),isViewFromObject,isitaniateItem,destoryItem class MyAdapter extends PagerAdapter { VIewPager预先将显示的内容左右两边的图片对象初始化好就是instaniateItem方法,当左边图片对象被划出左边,就会调用destroyItem方法将该图片对象销毁。 点切换需要自己写个点图形xml和selectorxml,当enable时点为白色,否则为灰色。 <shape xmlns:android="http://schemas./apk/res/android" <shape xmlns:android="http://schemas./apk/res/android" <selector xmlns:android="http://schemas./apk/res/android"> 开始的时候初始化第一个点为可用状态,其余不可用。 View pointView; 其次 要监听ViewPager的View切换以设置点图形是白色还是灰色。所以要实现OnPageChangerListener接口的监听方法。 public class AdvisementActivity extends AppCompatActivity implements ViewPager.OnPageChangeListener { private int lastPosition = 0; 设置点状态时,用一个变量lastPosition保存设置过的白点,以便切换的时候重新将它设为灰点。 至此首次进入应用程序界面的效果基本完成了。 接下来是轮播图广告 它在上一个效果的基础上 自动播放 定时器(用线程,设置一个bool值(只有退出该界面才为false),无限自动获取pager下一个View) new Thread(new Runnable() { 无限循环(假无限,有限但是要等十多年后,变相等于无限,将Adapter返回的Count值设为int的最大值)初始化到中间某个位置。 mPager.setOnPageChangeListener(this); public int getCount() { 改变onPageSelected方法和instantiateItem方法的position,让它取余显示的图片数量。然后用这个作为图片View和点View的索引。 int newposition =position%mPointViews.size(); 轮播图广告的另一种方式,缺点不能无限左滑。 if (mHandler == null) { mHandler = new Handler() { public void handleMessage(android.os.Message msg) { int currentItem = mViewPager.getCurrentItem(); currentItem++; if (currentItem > mTopNews.size() - 1) { currentItem = 0;// 如果已经到了最后一个页面,跳到第一页 } mViewPager.setCurrentItem(currentItem); mHandler.sendEmptyMessageDelayed(0, 3000);// 继续发送延时3秒的消息,形成内循环 }; }; // 保证启动自动轮播逻辑只执行一次 mHandler.sendEmptyMessageDelayed(0, 3000);// 发送延时3秒的消息 mViewPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: System.out.println("ACTION_DOWN"); // 停止广告自动轮播 // 删除handler的所有消息 mHandler.removeCallbacksAndMessages(null); // mHandler.post(new Runnable() { // // @Override // public void run() { // //在主线程运行 // } // }); break; case MotionEvent.ACTION_CANCEL:// 取消事件, // 当按下viewpager后,直接滑动listview,导致抬起事件无法响应,但会走此事件 System.out.println("ACTION_CANCEL"); // 启动广告 mHandler.sendEmptyMessageDelayed(0, 3000); break; case MotionEvent.ACTION_UP: System.out.println("ACTION_UP"); // 启动广告 mHandler.sendEmptyMessageDelayed(0, 3000); break; default: break; } return false; } }); } |
|
来自: Dragon_chen > 《Android控件》