Android之ViewPager 第一课
想要了解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 第一课的更多相关文章
- Android之ViewPager 第二课
在这里只粘贴部分代码 在第一课中,只有View滑动完毕,才触发动画效果,令滑块移动,在第二课中,将实现滑块与View同步运行. SecondActivity.java package com.andr ...
- Android OpenGL教程-第一课【转】
第一课 快速的开始一个Android OpenGL项目 首先,读懂我们的教程,需要有android的初步基础,我们这里只是通过android提供的SDK,来进行OpenGL的学习,所以你必须先学习如何 ...
- 【Android开发】 第一课 环境搭建教程
Windows 开发环境部署: Android Studio 中文社区:http://www.android-studio.org/ 本教程将分为五个步骤来完成Android开发环境的部署. 第一步: ...
- Android内存泄漏第一课【转】--------(使用单例模式造成的内存泄漏)
使用单例模式造成的内存泄漏 Android的单例模式在我们项目开发中经常会用到,不过使用的不恰当的话也会造成内存泄漏.因为单例的静态特性使得单例的生命周期和应用的生命周期一样长, 这就说明了如果一个对 ...
- Android入门第一课之Java基础
通知:由于本周六场地申请没通过,所以本周的培训临时取消. 今天给大家带来的是Android入门的第一课,由于教室申请的不确定性,因此,每次培训的内容都会在博客先提前释放出来.首先Android的APP ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- Android中ViewPager+Fragment取消(禁止)预加载延迟加载(懒加载)问题解决方案
转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53205878本文出自[DylanAndroid的博客] Android中Vie ...
- 【第一课】神奇的Context
初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...
- Android开源项目第一篇——个性化控件(View)篇
本文为那些不错的Android开源项目第一篇——个性化控件(View)篇,主要介绍Android上那些不错个性化的View,包括ListView.ActionBar.Menu.ViewPager.Ga ...
随机推荐
- Oracle-01-数据库分类/oracle sql*plus常用命令
一.数据库分类 一.数据库分类1.小型数据库:access.foxbase2.中型数据库:informix.sql server.mysql3.大型数据库:sybase.db2.oracle 二.项目 ...
- nginx配置、域名、前端代码部署
服务器上部署nginx,部署多个独立的代码,用nginx做域名映射的配置方法: 修改/usr/local/nginx/conf/nginx.conf文件,重点是最后一行,include /data/n ...
- C++ vector用法积累
1. vector的初始化 2. vector基本操作 2.1 vector属性 size resize 2.2 vector操作 插入 在最后插入一个元素 push_back() 删除 在最后删除一 ...
- mysql like 变量
Mysql: select * from 表名 where 字段 like concat('%',变量,'%');
- VMware虚拟化NSX-Manager命令行更改admin用户密码
1.1 登录到NSX-Manager命令行界面,输入用户名和密码登录到用户模式 Log in to the vSphere Client and select an NSX virtual ap ...
- IDEA中解决Edit Configurations中没有tomcat Server选项的问题(附配置Tomcat)
1.点击File-->settings(Ctrl+Alt+S) 2.在弹出的窗口中的搜索框中输入appliation,然后选择下方的Plugins,再然后勾选左侧Installed中的如图所示的 ...
- MAC系统如何显示隐藏文件解决方法
苹果Mac OS 操作系统下,隐藏文件默认为隐藏状态,隐藏文件是否显示有多种方法可以设置. 方法一: 打开终端,输入命令行 1.显示Mac隐藏文件的命令: defaults write com.app ...
- java对接微信支付
对接微信扫码支付(模式2),前端使用velocity技术 (1)调用微信支付接口(view层) 此部分业务逻辑部分可以省略 @RequestMapping("/wxpay.htm" ...
- HTTP-Http状态码301和302的区别
官方解释: 301 redirect: 301 代表永久性转移(Permanently Moved) 302 redirect: 302 代表暂时性转移(Temporarily Moved ) 共同点 ...
- Java小功能大杂烩
生成UUID: import java.util.UUID; public class ProductUUID { // 随机返回前十位的UUID public static String getUU ...