想要了解Android新版本的的新特性,从头开始吧,这是Android3.0新加入的widget,以前也接触过,但是没有好好的研究过,今天写了一个小程序,研究一下ViewPager。

这个程序是支持左右滑动的View,核心是ViewPager。讲解都在注释中进行。

代码如下:

MainActivity.java:

package com.android3;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.os.Bundle;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.DisplayMetrics;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.TranslateAnimation;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener, ViewPager.OnPageChangeListener {
private ViewPager viewPager;
private ArrayList<View> viewList;
private List<String> titleList;
private MyPagerAdapter adapter;
private ImageView cursor;
private LinearLayout titleBar;
private float cursorW= 0;
private float offset = 0;
private float currentIndex = 0;
private float screenW = 0;
private float currentX = 0;
private float fScreenW;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initToolbar();
initViewPager();
} /**
* ViewPager 保证 缓存中存在三个视图,即 左边 右边 和中间 隔一个的灰被destroy,
*/
@SuppressLint("InflateParams")
private void initViewPager() {
viewPager = (ViewPager) findViewById(R.id.viewpager);
titleBar = (LinearLayout) findViewById(R.id.titleBar);
LayoutInflater inflater = getLayoutInflater();
//创建四个View
View view1 = inflater.inflate(R.layout.viewpage_01, null);
View view2 = inflater.inflate(R.layout.viewpage_02, null);
View view3 = inflater.inflate(R.layout.viewpage_03, null);
View view4 = inflater.inflate(R.layout.viewpage_04, null); viewList = new ArrayList<>();// 将要分页显示的View装入数组中
viewList.add(view1);
viewList.add(view2);
viewList.add(view3);
viewList.add(view4);
adapter = new MyPagerAdapter(viewList);
titleList = new ArrayList<>();
titleList.add("第一页面");
titleList.add("第二页面");
titleList.add("第三页面");
titleList.add("第四页面");
for (int i = 0; i < titleList.size(); i++) {
TextView textView = new TextView(this);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT);
params.weight = 1;
params.setMargins(5, 3, 5, 3);
textView.setLayoutParams(params);
textView.setText(titleList.get(i));
textView.setTextSize(15);
textView.setGravity(Gravity.CENTER);
titleBar.addView(textView);
} initCursorPos(); //初始化指示器位置 viewPager.setAdapter(adapter);//绑定适配器
viewPager.addOnPageChangeListener(this); //注 : setOnPageChangeListener 过时
} /**
* 单位px
*/
public void initCursorPos() {
// 初始化动画
cursor = (ImageView) findViewById(R.id.cursor);
cursorW= BitmapFactory.decodeResource(getResources(), R.mipmap.cursor).getWidth();// 获取图片宽度
DisplayMetrics dm = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(dm);
screenW = dm.widthPixels;// 获取分辨率宽度
fScreenW=screenW / viewList.size();
offset = (fScreenW - cursorW) / 2;// 计算偏移量
Matrix matrix = new Matrix();
matrix.postTranslate(offset, 0);
cursor.setImageMatrix(matrix);// 设置动画初始位置 ###原始位置
currentX = offset;
} private void initToolbar() {
Toolbar mToolbar = (Toolbar) findViewById(R.id.toolbar);
Button btnRight = (Button) mToolbar.findViewById(R.id.btnRight);
mToolbar.setTitle("");
mToolbar.setNavigationIcon(R.mipmap.back);
setSupportActionBar(mToolbar);
mToolbar.setNavigationOnClickListener(this);
btnRight.setOnClickListener(this);
} @Override
public void onClick(View view) {
switch (view.getId()) {
case -1:
finish();
break;
case R.id.btnRight:
Intent intent = new Intent(MainActivity.this, SecondActivity.class);
startActivity(intent);
break;
}
} @Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
} @Override
public void onPageSelected(int position) {
float X=fScreenW*position; //在此页面中,滑块位置和原始位置的距离
//currentX 当前位置和原始位置的距离
TranslateAnimation animation = new TranslateAnimation(currentX, X, 0, 0);
/**
* public TranslateAnimation(float fromXDelta, float toXDelta, float fromYDelta, float toYDelta) {
* throw new RuntimeException("Stub!");
* }
* 在X轴方向:
* fromXDelta 动画从原始位置+fromXDelta开始
*
* toXDelta 动画从原始位置+toXDelta结束
*
* 在Y轴方向:
* fromYDelta 动画从原始位置+fromYDelta开始
*
* toYDelta 动画从原始位置+toYDelta结束
*
*
*/
currentX=fScreenW*position;//更新当前位置
currentIndex = position;//保存上一个View编号
animation.setFillAfter(true);//保存动画
animation.setDuration(300);//动画持续时间
cursor.startAnimation(animation);//开始
} @Override
public void onPageScrollStateChanged(int state) { }
}

 MyPagerAdapter.java

package com.android3;

import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup; import java.util.List; /**
*
* Created by Administrator on 2016/10/25.
*/ public class MyPagerAdapter extends PagerAdapter {
private List<View> list=null;
//通过构造函数将装有View的集合传入适配器
MyPagerAdapter(List<View> list){
this.list=list;
} /**
*
* @return 将要显示的View的总个数
*/
@Override
public int getCount() {
return list.size();
} /**
*
* 该方法 判断Key与View是否是正确的映射关系
*
* 而且在同一个容器中不能有相同的key传入,否则行为会错乱
* @param view
* @param object
* @return
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view==object;
} /**
* 因为ViewPager 容器中只保存当前位置的View和相邻的View,当在容器中的View的编号位置距离当前位置超过1,
* 就对该View进行移除
* @param container 容器
* @param position 即将失去的View位置
* @param object
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(list.get(position));
} /**
*
* 首先判断当前位置的左右view是否在容器中,如果不在,则调用instantiateItem方法将相邻的view(之前不在容器中)加入容器中;
* 返回此View,作为映射的Key
*
* @param container 容器
* @param position 位置 从0开始
* @return view对应的Key
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(list.get(position));
return list.get(position);
}
}

  

  activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.android3.MainActivity"> <android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"> <TextView
android:id="@+id/tv_toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/title"
android:textColor="#ffffff"
android:textSize="14sp"
android:textStyle="bold" /> <Button
android:id="@+id/btnRight"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="end"
android:layout_marginRight="10dp"
android:text="@string/submit"
android:textColor="#ffffff"
android:textSize="12sp"
android:textStyle="bold" />
</android.support.v7.widget.Toolbar> <LinearLayout
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/toolbar"
android:orientation="vertical"> <LinearLayout
android:id="@+id/titleBar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorAccent"
android:orientation="horizontal" /> <ImageView
android:id="@+id/cursor"
android:layout_width="match_parent"
android:layout_height="5dp"
android:scaleType="matrix"
android:src="@mipmap/cursor" /> <android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"/>
</LinearLayout> </RelativeLayout>

  viewPager_01.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffff"
android:orientation="vertical">
</LinearLayout>

  viewpager_02.xml,viewpager_03.xml,viewpager_04.xml  (略)只是背景颜色不同.

代码下载http://download.csdn.net/detail/qq_25059501/9664066

作者: 小淘气儿

出处: http://www.cnblogs.com/xiaotaoqi/p/5996742.html/>

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出.

Android之ViewPager 第一课的更多相关文章

  1. Android之ViewPager 第二课

    在这里只粘贴部分代码 在第一课中,只有View滑动完毕,才触发动画效果,令滑块移动,在第二课中,将实现滑块与View同步运行. SecondActivity.java package com.andr ...

  2. Android OpenGL教程-第一课【转】

    第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...

  3. 【Android开发】 第一课 环境搭建教程

    Windows 开发环境部署: Android Studio 中文社区:http://www.android-studio.org/ 本教程将分为五个步骤来完成Android开发环境的部署. 第一步: ...

  4. Android内存泄漏第一课【转】--------(使用单例模式造成的内存泄漏)

    使用单例模式造成的内存泄漏 Android的单例模式在我们项目开发中经常会用到,不过使用的不恰当的话也会造成内存泄漏.因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 这就说明了如果一个对 ...

  5. Android入门第一课之Java基础

    通知:由于本周六场地申请没通过,所以本周的培训临时取消. 今天给大家带来的是Android入门的第一课,由于教室申请的不确定性,因此,每次培训的内容都会在博客先提前释放出来.首先Android的APP ...

  6. Android中viewPager的一两点使用

    Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...

  7. Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...

  8. 【第一课】神奇的Context

    初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...

  9. Android开源项目第一篇——个性化控件(View)篇

    本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Ga ...

随机推荐

  1. 23.POI导出

    POI导出 XSSFWorkbook 对应Excel2007版本及以上 HSSFWorkbook 对应Excel2003版本 还要注意一点,不要用Swagger-ui测试导出的表格,这样的表格文件都是 ...

  2. code ELIFECYCLE (代码周期)

    问题:build 不成功 解决:新建一个dist 文件,没有自动新建dist 文件 问题 :npm run dev 时候 解决:

  3. 『ACM C++』HDU杭电OJ | 1415 - Jugs (灌水定理引申)

    今天总算开学了,当了班长就是麻烦,明明自己没买书却要带着一波人去领书,那能怎么办呢,只能说我善人心肠哈哈哈,不过我脑子里突然浮起一个念头,大二还要不要继续当这个班委呢,既然已经体验过就可以适当放下了吧 ...

  4. ETO的公开赛T3《寻星》 题解(BY 超級·考場WA怪 )

    题解 寻星 题意:给定一个有向带权图,定义从一点到另一点的某条路径长为路径上所有边权的最大值,并给定四个点编号w,t1,t2,t3. 求出一个点s,使它在到t1,t2,t3三点最短路径最大值最大或者根 ...

  5. HTTP基本内容

    *********************HTTP基本交互*************************** HTTP请求格式:HTTP 请求由三部分组成:请求行.请求头和请求正文请求行: 请求方 ...

  6. is 和 isinstance的区别 and issubclass

    定义一个子类和父类 class A: pass class B(A): pass is print(type(b) is B) # 结果: True print(type(b) is A) # 结果: ...

  7. Docker与FastDFS的安装命令及使用

    Docker特点 1)上手快 用户只需要几分钟,就可以把自己的程序“Docker 化”.Docker 依赖于“写时复制” (copy-on-write)模型,使修改应用程序也非常迅速,可以说达到“随心 ...

  8. wamp2.5怎么设置虚拟域名

    换了台电脑~好不顺手.老大的机器上装的是wamp.几年没用差点连怎么设置虚拟域名都忘记了.自己写点东西~做个备忘吧. 首先,版本 然后在网上百度一堆七七八八的.做的时候没那么复杂.跟phpstudy差 ...

  9. redis搭建

    redis 1.简介.安装 Remote Dictionary Server(Redis)是一个基于 key-value 键值对的持久化数据库存储系统.redis 和 Memcached 缓存服务很像 ...

  10. Hadoop(2)-CentOS下的jdk和hadoop的安装与配置

    准备工作 下载jdk8和hadoop2.7.2 使用sftp的方式传到hadoop100上的/opt/software目录中 配置环境 如果安装虚拟机时选择了open java,请先卸载 rpm -q ...