Android ViewPager简单使用
Posted 森然献凉i
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android ViewPager简单使用相关的知识,希望对你有一定的参考价值。
如题
效果图
功能代码
创建一个集合,存储ViewPager的四张图片
//四张广告图片添加到集合中进行保存
List<View>listPics=new ArrayList<>();
//第一张
ImageView img1=new ImageView(this);
img1.setBackgroundResource(R.drawable.img1);
listPics.add(img1);
//第二张
ImageView img2=new ImageView(this);
img2.setBackgroundResource(R.drawable.img2);
listPics.add(img2);
//第三张
ImageView img3=new ImageView(this);
img3.setBackgroundResource(R.drawable.img3);
listPics.add(img3);
//第四张
ImageView img4=new ImageView(this);
img4.setBackgroundResource(R.drawable.img4);
listPics.add(img4);
动态设置ViewPager右下角四个小圆点的属性
//动态设置四个圆点的属性
indicators=new ImageView[listPics.size()];
//遍历该数组一个个动态加载
for (int i=0;i<indicators.length;i++)
indicator=new ImageView(this);
//设置这张图片在布局中的参数(指定宽度和高度)
indicator.setLayoutParams(new LinearLayout.LayoutParams(40,40));
//小圆点的间隔
indicator.setPadding(5,5,5,5);
//
indicators[i]=indicator;
if (i==0)
indicators[i].setBackgroundResource(R.drawable.dian_f);
else
indicators[i].setBackgroundResource(R.drawable.dian_b);
group.addView(indicators[i]);
设置viewPager的监听器
//设置viewPager的监听器
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
//当页面翻滚
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
//当页面被选中
@Override
public void onPageSelected(int position)
//记录当前位置
// index.getAndSet(position);
for (int i=0;i<indicators.length;i++)
//如果数组的当前下标就是当前位置
if (i==position)
indicators[i].setBackgroundResource(R.drawable.dian_f);
else
indicators[i].setBackgroundResource(R.drawable.dian_b);
@Override
public void onPageScrollStateChanged(int state)
);
适配器
//创建一个适配器
class MyPagerAdapter extends PagerAdapter
private List<View>viewList;
//将集合作为构造方法的参数传递进来
public MyPagerAdapter(List<View>viewList)
this.viewList=viewList;
@Override
public int getCount()
return viewList.size();
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object)
return view==object;
//视图的创建,创建每一页viewpager的时候instantiateItem将会被自动调用
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position)
container.addView(viewList.get(position),0);
return viewList.get(position);
//视图的移除
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object)
container.removeView(viewList.get(position));
自动翻页功能(两秒)
使用多线程
//使用多线程自动定时切换page
new Thread(new Runnable()
@Override
public void run()
while (true)
//循环一直执行,每隔两秒,通过Handler,发出一条消息带去当前ViewPager所显示的页的索引号
if (isContinue)
viewHandler.sendEmptyMessage(index.get());
whatOption();
).start();
private void whatOption()
index.incrementAndGet();//将当前位置值加1
if (index.get()>indicators.length-1)
index.getAndAdd(-4);
//设置一个线程每隔两秒启动
try
Thread.sleep(2000);
catch (InterruptedException e)
e.printStackTrace();
声明一个 Handler,接收指令并更换视图
private Handler viewHandler=new Handler()
public void handleMessage(Message msg)
super.handleMessage(msg);
//将当前的msg.what,也就是index的值置为当前page的值
viewPager.setCurrentItem(msg.what);
;
监听viewPager按压,如果按压则停止线程,放开则继续
viewPager.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
switch (motionEvent.getAction())
//如果状态为压下,则停止
case MotionEvent.ACTION_DOWN:
isContinue=false;
break;
case MotionEvent.ACTION_UP:
isContinue=true;
break;
return false;
);
全部代码
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<androidx.viewpager.widget.ViewPager
android:id="@+id/vp_adv"
android:layout_width="match_parent"
android:layout_height="160dp">
</androidx.viewpager.widget.ViewPager>
<LinearLayout
android:id="@+id/view_indicators"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/vp_adv"
android:layout_marginTop="-25dp"
android:gravity="right"
android:orientation="horizontal">
</LinearLayout>
</RelativeLayout>
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
MainActivity.java
package com.cdw.study6;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
public class MainActivity extends AppCompatActivity
private ImageView indicator;//表示圆点指示器
private ImageView[] indicators;//保存四个圆点指示器的数组
private boolean isContinue=true;
private ViewPager viewPager;
private ViewGroup group;
private AtomicInteger index=new AtomicInteger();
private Handler viewHandler=new Handler()
public void handleMessage(Message msg)
super.handleMessage(msg);
//将当前的msg.what,也就是index的值置为当前page的值
viewPager.setCurrentItem(msg.what);
;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
private void initView()
viewPager=findViewById(R.id.vp_adv);
group=findViewById(R.id.view_indicators);
//四张广告图片添加到集合中进行保存
List<View>listPics=new ArrayList<>();
//第一张
ImageView img1=new ImageView(this);
img1.setBackgroundResource(R.drawable.img1);
listPics.add(img1);
//第二张
ImageView img2=new ImageView(this);
img2.setBackgroundResource(R.drawable.img2);
listPics.add(img2);
//第三张
ImageView img3=new ImageView(this);
img3.setBackgroundResource(R.drawable.img3);
listPics.add(img3);
//第四张
ImageView img4=new ImageView(this);
img4.setBackgroundResource(R.drawable.img4);
listPics.add(img4);
//动态设置四个圆点的属性
indicators=new ImageView[listPics.size()];
//遍历该数组一个个动态加载
for (int i=0;i<indicators.length;i++)
indicator=new ImageView(this);
//设置这张图片在布局中的参数(指定宽度和高度)
indicator.setLayoutParams(new LinearLayout.LayoutParams(40,40));
//小圆点的间隔
indicator.setPadding(5,5,5,5);
//
indicators[i]=indicator;
if (i==0)
indicators[i].setBackgroundResource(R.drawable.dian_f);
else
indicators[i].setBackgroundResource(R.drawable.dian_b);
group.addView(indicators[i]);
//设置viewPager的适配器
viewPager.setAdapter(new MyPagerAdapter(listPics));
//设置viewPager的监听器
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener()
//当页面翻滚
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)
//当页面被选中
@Override
public void onPageSelected(int position)
//记录当前位置
// index.getAndSet(position);
for (int i=0;i<indicators.length;i++)
//如果数组的当前下标就是当前位置
if (i==position)
indicators[i].setBackgroundResource(R.drawable.dian_f);
else
indicators[i].setBackgroundResource(R.drawable.dian_b);
@Override
public void onPageScrollStateChanged(int state)
);
viewPager.setOnTouchListener(new View.OnTouchListener()
@Override
public boolean onTouch(View view, MotionEvent motionEvent)
switch (motionEvent.getAction())
//如果状态为压下,则停止
case MotionEvent.ACTION_DOWN:
isContinue=false;
break;
case MotionEvent.ACTION_UP:
isContinue=true;
break;
return false;
);
//使用多线程自动定时切换page
new Thread(new Runnable()
@Override
public void run()
while (true)
//循环一直执行,每隔两秒,通过Handler,发出一条消息带去当前ViewPager所显示的页的索引号
if (isContinue)
viewHandler.sendEmptyMessage(index.get());
whatOption();
).start();
private void whatOption()
index.incrementAndGet();//将当前位置值加1
if (index.get()>indicators.length-1)
index.getAndAdd(-4);
//设置一个线程每隔两秒启动
try
Thread.sleep(2000);
catch (InterruptedException e)
e.printStackTrace();
//创建一个适配器
class MyPagerAdapter extends PagerAdapter
private List<View>viewList;
//将集合作为构造方法的参数传递进来
public MyPagerAdapter(List<View>viewList)
this.viewList=viewList;
@Override
public int getCount()
return viewList.size();
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object)
return view==object;
//视图的创建,创建每一页viewpager的时候instantiateItem将会被自动调用
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position)
container.addView(viewList.get(position),0);
return viewList.get(position);
//视图的移除
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object)
container.removeView(viewList.get(position));
万分感谢您在百忙之中阅读此文
结束
以上是关于Android ViewPager简单使用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TabLayout 在 ViewPager 中的 Google 地图片段中获取当前位置
Android嵌套滑动控件的冲突解决和ViewPager适配当前子控件高度不留空白的办法
带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置