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

演示

  我的规矩是先上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. matlab中 mcc/mbuild/mex 区别

    mcc 的作用是将 .m文件编译为 c/c++动态链接库文件,使你可以在 c/c++程序中使用 matlab的一些函数功能.mcc 也可以将.m文件编译为exe可执行文件. mex 的作用是将 c/c ...

  2. ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0

    ROS_Kinetic_07 ROS中机器人三维物理引擎高保真仿真利器gazebo 7.0 ROS kinetic中的gazebo版本是7.0,有很多新的特性. 首先,启动gazebo: ~$ gaz ...

  3. golang:使用timingwheel进行大量ticker的优化

    Ticker 最近的项目用go实现的服务器需要挂载大量的socket连接.如何判断连接是否还存活就是我们需要考虑的一个问题了. 通常情况下面,socket如果被客户端正常close,服务器是能检测到的 ...

  4. (三十七)从私人通讯录引出的细节I -Notification -Segue -HUD -延时

    细节1:账号和密码都有值的时候才可以点击登录按钮,因此应该监听文本框的文本改变. 因为文本框的文本改变代理不能处理,因此应该使用通知Notification. 文本框文本改变会发出通知:通知的前两个参 ...

  5. 《java入门第一季》集合框架引入与面试题

    注:在开始的几篇集合介绍里,不包含泛型的概念.泛型在讲述所有集合后再加入进去. 集合的由来:    我们学习的是面向对象语言,而面向对象语言对事物的描述是通过对象体现的,为了方便对多个对象进行操作,我 ...

  6. python3爬虫 - 利用浏览器cookie登录

    http://blog.csdn.net/pipisorry/article/details/47980653 爬虫爬网站不免遇到需要登录的问题. 登录的时候可能还会碰到需要填验证码的问题, 有的验证 ...

  7. C#之概述

    当前流行的开发语言概述 C#是微软公司为Visual Studio开发平台推出的一种简洁.类型安全的面向对象的编程语言,开发人员可以通过她编写在.NET Framework上运行的各种安全可靠的应用程 ...

  8. centos6.5 rsync+inotify实现服务器之间文件实时同步

    1. rsync的优点与不足 与传统的cp.tar备份方式相比,rsync具有安全性高.备份迅速.支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据 ...

  9. OpenCV 轮廓检测

    使用OpenCV可以对图像的轮廓进行检测.这是之前用过的代码,挺简单的,回顾一下.主要要进行以下2步操作: 1.cvThreshold():对图像进行二值化处理 2.cvFindContours(): ...

  10. 程序员的视角:java 线程

    在我们开始谈线程之前,不得不提下进程. 无论进程还是线程都是很抽象的概念,有一个关于进程和线程很形象的比喻能帮我们更好的理解. 进程就像个房子,房子是一个包含了特定属性的容器,例如空间大小.卧室数量等 ...