博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android之ViewPager 第一课
阅读量:5346 次
发布时间:2019-06-15

本文共 7587 字,大约阅读时间需要 25 分钟。

    想要了解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
viewList; private List
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
list=null; //通过构造函数将装有View的集合传入适配器 MyPagerAdapter(List
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:

 

  viewPager_01.xml

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

 

代码下载

     

作者:

出处:

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

转载于:https://www.cnblogs.com/xiaotaoqi/p/5996742.html

你可能感兴趣的文章
AspNet Core Api Restful +Swagger 实现微服务之旅(四)
查看>>
Vue组件模板形式实现对象数组数据循环为树形结构
查看>>
四叉树的js实现
查看>>
关于游戏
查看>>
X.Org可能将失去它的域名x.org
查看>>
activated钩子函数
查看>>
转载:开发者需知的10类工具
查看>>
避免明文保存用户密码
查看>>
第二周冲刺_第四天总结
查看>>
软件工程总结报告
查看>>
swift中判断设备是否打开定位
查看>>
6. 合并排序数组:
查看>>
JDK与Java SE/EE/ME的区别
查看>>
ASP.NET MVC IOC 之Ninject攻略
查看>>
Vue学习指南
查看>>
前端通信小结
查看>>
js字符替换等操作
查看>>
Subsequence(HDU3530+单调队列)
查看>>
JS倒计时网页自动跳转代码
查看>>
mysql中find_in_set()函数的使用
查看>>