想要了解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. Navicat Premium 连接Oracle 数据库之配置

    Navicat Premium连接Oracle 数据库之配置 1.Oracle数据库服务器下载 Oracle官方网站下载数据库最新版本:http://www.oracle.com/technetwor ...

  2. Webpack Tapable原理详解

    directory - src - sim ---- 简单的模拟实现 - /.js$/ ---- 使用 代码已上传github, 地址 Detailed Webpack 就像一条生产线, 要经过一系列 ...

  3. vue里使用百度地图

    最近公司项目里要用到百度地图,然后查阅了一些资料,并总结了下: 首先呢,由于本公司使用的是百度离线地图,那么我们首先需要将百度地图离线包放置static静态文件目录下(我的离线地图包名是“baidu_ ...

  4. C#实现文件上传以及文件下载

    public ActionResult Upload() { // var pathUrl = "http://" + Request.Url.Authority; var fil ...

  5. 【学时总结&模板时间】◆学时·10 & 模板·3◆ AC自动机

    ◇学时·10 & 模板·3◇ AC自动机 跟着高中上课……讲AC自动机的扩展运用.然而连KMP.trie字典树都不怎么会用的我一脸懵逼<(_ _)> 花一上午自学了一下AC自动机 ...

  6. Mac系统配置php环境

    [写在前面——叨叨叨] -_-#急着配环境的同志们可以绕道.最近学校的实验室里接了一个小项目——考勤刷卡系统,利用RFID在硬件层获取学生卡的ID,通过wifi传输至服务器,进行考勤信息存储,手机端获 ...

  7. Git详解及github的使用

    1.Devops介绍 1.Devops是什么 开发 development 运维 operations 2.Devops能干嘛 提高产品质量 1 自动化测试 2 持续集成 3 代码质量管理工具 4 程 ...

  8. 23种java设计模式之装饰者模式及动态代理

    设计模式不管对于何种语言都是存在的,这里介绍的是java的模式 装饰者模式是在二次开发中应用比较多的一款模式,当然了用反射也是可以实现的,今天介绍的是装饰模式,有兴趣的朋友可以自己去了解一下反射是怎么 ...

  9. Apache Maven(七):settings.xml

    settings.xml 文件中包含settings标签,这个标签可以配置如何去执行Maven.其中包括本地存储库位置,备用远程存储库服务器和身份验证信息等值. 有如下两个位置可能存放这setting ...

  10. 机器学习基础之knn的简单例子

    knn算法是人工智能的基本算法,类似于语言中的"hello world!",python中的机器学习核心模块:Scikit-Learn Scikit-learn(sklearn)模 ...