(文章针对类似我这种初学者,大神看到不要嘲笑)

演示

  我的规矩是先上GIF动画效果(Linux下用转的GIF,清晰度还可以但是不知道为什么放博客上,界面会这么大):

代码:

  android中有ViewPager这么个控件,可以帮助用户实现多个页面的高效管理,该控件需要导入包android.support.v4.view.ViewPager;下面先把androidstudio中的项目截图贴出:

  

这是代码的结构,下面会对代码大概进行介绍:

    private Context mContext = MainActivity.this;
private ViewPager mPager;
private List<View> listViews;//存放多个View界面
private ImageView cursor;//动画图片
private int currentIndex = 0;//当前选项编号
private TextView t1;
private TextView t2;
private TextView t3;
private int width;

mPager来自一个ViewPager对象,下面主要是对其进行初始化、适配、以及切换事件监听;

cursor这个对象到后面就会了解,它就是选项栏的黄色View。就是它在移动,在后面要对该View的移动设置动画、以及判断何时移动、怎么移动;

currentIndex这个是用于判断当前页面;

width是用于存储屏幕的宽度;

    protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DisplayMetrics displayMetrics = getResources().getDisplayMetrics();
width = displayMetrics.widthPixels;
cursor = (ImageView) findViewById(R.id.move_view);
params=(LinearLayout.LayoutParams) cursor.getLayoutParams();
InitTextView();///初始化下部选项栏
params.width=width/3;
cursor.setLayoutParams(params);
InitViewPager();//初始化页面配置
}

DisplayMetrics displayMetrics = getResources().getDisplayMetrics();

width = displayMetrics.widthPixels;获取当前屏幕资源并求得宽度。

ImageView无法直接动态设置其宽高,所以可以通过这个方法来间接实现:

  新建一个LayoutParams对象,并将其配置到cursor上面,这样即可修改cursor的宽度,这里高度不用修改。

    private void InitTextView() {
t1 = (TextView) findViewById(R.id.text1);
t2 = (TextView) findViewById(R.id.text2);
t3 = (TextView) findViewById(R.id.text3); t1.setOnClickListener(new MyOnClickListener(0));
t2.setOnClickListener(new MyOnClickListener(1));
t3.setOnClickListener(new MyOnClickListener(2));
} class MyOnClickListener implements View.OnClickListener { private int index = 0; public MyOnClickListener(int index) {
this.index = index;
} @Override
public void onClick(View v) {
mPager.setCurrentItem(index);
}
}

上面这个没什么好说的。

下面这个才是重点(讲解我就放在代码里面啦):

private void InitViewPager() {
mPager = (ViewPager) findViewById(R.id.vPager);
listViews = new ArrayList<>();
listViews.add(LayoutInflater.from(mContext).inflate(R.layout.tab1, null));
listViews.add(LayoutInflater.from(mContext).inflate(R.layout.tab2, null));
listViews.add(LayoutInflater.from(mContext).inflate(R.layout.tab3, null));
mPager.setCurrentItem(0);//初始化的默认界面就是第一个,标号为0
mPager.setAdapter(new MyPagerAdapter());//为mPager设置适配器
// MyOnPageChangeListener myOnPageChangeListener=new MyOnPageChangeListener();以前是直接使用这个方法,但是现在已经弃用,改用下面两个方法的综合,这个大家可以ctrl+鼠标左键看官方的说明。
mPager.addOnPageChangeListener(new MyOnPageChangeListener());//新增页面事件监听
mPager.removeOnPageChangeListener(new MyOnPageChangeListener());//销毁页面事件监听 }
//这段代码是仿照一位大神写的,在此谢过,原文链接后来找了一会忘记在哪了。。。
class MyOnPageChangeListener implements ViewPager.OnPageChangeListener {
int one = params.width;
int two = one * 2; /**
* This method will be invoked when the current page is scrolled, either as part
* of a programmatically initiated smooth scroll or a user initiated touch scroll.
*
* @param position Position index of the first page currently being displayed.
* Page position+1 will be visible if positionOffset is nonzero.
* @param positionOffset Value from [0, 1) indicating the offset from the page at position.
* @param positionOffsetPixels Value in pixels indicating the offset from position.
*/
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } /**
* This method will be invoked when a new page becomes selected. Animation is not
* necessarily complete.
*
* @param position Position index of the new selected page.
*/
@Override
public void onPageSelected(int position) {
Animation animation = null;
switch (position) {
case 0:
if (currentIndex == 1) {
animation = new TranslateAnimation(one, 0, 0, 0);//这些个参数可以通过API了解到,大家可以通过修改某些值就可以很快上手动画的效果实现
} else if (currentIndex == 2) {
animation = new TranslateAnimation(two, 0, 0, 0);
}
break;
case 1:
if (currentIndex == 0) {
animation = new TranslateAnimation(0, one, 0, 0);
} else if (currentIndex == 2) {
animation = new TranslateAnimation(two, one, 0, 0);
}
break;
case 2:
if (currentIndex == 0) {
animation = new TranslateAnimation(0, two, 0, 0);
} else if (currentIndex == 1) {
animation = new TranslateAnimation(one, two, 0, 0);
}
break;
}
currentIndex = position;
animation.setFillAfter(true);
animation.setDuration(300);
cursor.startAnimation(animation);
} /**
* Called when the scroll state changes. Useful for discovering when the user
* begins dragging, when the pager is automatically settling to the current page,
* or when it is fully stopped/idle.
*
* @param state The new scroll state.
* @see ViewPager#SCROLL_STATE_IDLE
* @see ViewPager#SCROLL_STATE_DRAGGING
* @see ViewPager#SCROLL_STATE_SETTLING
*/
@Override
public void onPageScrollStateChanged(int state) { }
} class MyPagerAdapter extends PagerAdapter {//适配器的写法应该都是轻车熟路,但是与平常的还是有所不同,我们需要手动去重写两个方法 /**
* Return the number of views available.
*/
@Override
public int getCount() {
return listViews.size();
} @Override
public void destroyItem(ViewGroup container, int position, Object object) {//重写该方法,销毁不用的界面
((ViewPager) container).removeView(listViews.get(position));
} @Override
public Object instantiateItem(ViewGroup container, int position) {//加载界面
((ViewPager) container).addView(listViews.get(position), 0);//?
return listViews.get(position);
} /**
* Determines whether a page View is associated with a specific key object
* as returned by {@link #instantiateItem(ViewGroup, int)}. This method is
* required for a PagerAdapter to function properly.
*
* @param view Page View to check for association with <code>object</code>
* @param object Object to check for association with <code>view</code>
* @return true if <code>view</code> is associated with the key object <code>object</code>
*/
@Override
public boolean isViewFromObject(View view, Object object) {//注意重写该方法,如果两者相等返回一个true。默认是返回false
return view == object;
}
}

项目链接:

链接: https://pan.baidu.com/s/1pLIxJIj 密码: h4xn

android下ViewPager的使用,带下部选项栏的切换动画的更多相关文章

  1. 有关ViewPager的使用及解决Android下ViewPager和PagerAdapter中调用notifyDataSetChanged失效的问题

    ViewPager是android-support-v4.jar包中的一个系统控件,继承自ViewGroup,专门用以实现左右滑动切换View的效果,使用时需要首先在Project->prope ...

  2. ViewPager切换动画PageTransformer的使用

    Android从3.0开始添加了属性动画后,诸多难以实现的动画都可以轻松解决了,v4包下的ViewPager控件当然也不例外,相对于非常平庸的默认切换动画,Google官方给我们展示了两个动画例子:D ...

  3. Android Activity 切换动画(非原创)

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  4. Android的Activity屏幕切换动画左右滑动切换

    在Android开发过程中,经常会碰到Activity之间的切换效果的问题,下面介绍一下如何实现左右滑动的切换效果,首先了解一下Activity切换的实现,从Android2.0开始在Activity ...

  5. Android使用ViewPager做轮播

    ViewPager.html div.oembedall-githubrepos { border: 1px solid #DDD; list-style-type: none; margin: 0 ...

  6. Android 使用ViewPager实现左右循环滑动图片

    ViewPager这个小demo实现的是可以左右循环滑动图片,下面带索引,滑到最后一页在往右滑动就要第一页,第一页往左滑动就到最后一页,先上效果图,用美女图片是我一贯的作风,呵呵 1.    首先看一 ...

  7. android下tcpdump抓包

    tcpdump是最快捷方便的抓包方式,还可以加深对网络协议的理解.android下可以通过如下方式抓包: 1 Android上启动tcpdump Android设备可以把tcpdump的可执行文件上传 ...

  8. 【原创】窥视懒人的秘密---android下拉刷新开启手势的新纪元

    小飒的成长史原创作品:窥视懒人的秘密---android下拉刷新开启手势的新纪元转载请注明出处 **************************************************** ...

  9. Android 实现个性的ViewPager切换动画 实战PageTransformer(兼容Android3.0以下)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/40411921,本文出自:[张鸿洋的博客] 1.概述 之前写过一篇博文:Andro ...

随机推荐

  1. USB OTG原理+ ID 检测原理

    OTG 检测的原理是: USB OTG标准在完全兼容USB2.0标准的基础上,增添了电源管理(节省功耗)功能,它允许设备既可作为主机,也可作为外设操作(两用OTG).USB OTG技术可实现没有主机时 ...

  2. Cocos2D旋转炮塔到指定角度(一)

    原文地址:Rotating Turrets: How To Make A Simple iPhone Game with Cocos2D 2.X Part 2 翻译有节选和删除. 在你旋转炮塔之前,首 ...

  3. Spring AOP 初探

    本文可作为北京尚学堂spring课程的学习笔记 首先谈谈什么是AOP 它能干什么 AOP Aspect Oriented Programming(面向切面的编程) 什么叫面向切面? 就是我们可以动态的 ...

  4. JAVA之旅(八)——多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例

    JAVA之旅(八)--多态的体现,前提,好处,应用,转型,instanceof,多态中成员变量的特点,多态的案例 学习是不能停止的 一.多态 我们今天又要学习一个新的概念了,就是多态,它是面向对象的第 ...

  5. android universal image loader 缓冲原理详解

    1. 功能介绍 1.1 Android Universal Image Loader Android Universal Image Loader 是一个强大的.可高度定制的图片缓存,本文简称为UIL ...

  6. Android For JNI(三)——C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值

    Android For JNI(三)--C的指针,指针变量,指针常见错误,值传递,引用传递,返回多个值 C中比较难的这一块,大概就是指针了,所以大家还是多翻阅一下资料,当然,如果只是想了解一下,看本篇 ...

  7. Windows CE Notification API的使用方法

    1 引言      以Windows CE 为操作系统的掌上电脑(如PocketPC或HPC),除具备PC的功能外,还具备很强的自身控制能力.Windows CE API超越微软其他操作系统的 API ...

  8. DiskLruCache硬盘缓存技术详解

    上次讲了使用内存缓存LruCache去加载很多图片而不造成OOM,而这种缓存的特点是在应用程序运行时管理内存中的资源(图片)的存储和释放,如果LruCache中有一张图片被释放了,再次加载该图片时需要 ...

  9. 一个类搞定UIScrollView那些事儿

    前言 UIScrollView可以说是我们在日常编程中使用频率最多.扩展性最好的一个类,根据不同的需求和设计,我们都能玩出花来,当然有一些需求是大部分应用通用的,今天就聊一下以下需求,在一个categ ...

  10. 【nginx】4xx,5xx 保持自定义header

    问题 nginx使用中,如果请求返回的状态code类似404或者50x这种,仍然返回自定义的header. 分析和解决 nginx文档中关于 add_header的部分 有这么一句 Adds the ...