Android ViewPager实现图片轮翻效果
作者:shineflowers 发布时间:2023-08-01 00:30:57
标签:Android,ViewPager,图片轮翻
很多App都有这种效果,特别一些电商类的App,顶部每隔几秒钟会向右翻页显示下张图片,用来作推广或者内容展示用的。今天来简单地模仿一下,还自带一个自动跳动的小功能(底部有几个小点,图片移动的时候,点的状态也在变化),用定时器来实现不难。
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.SystemClock;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.LinearLayout.LayoutParams;
import android.widget.TextView;
public class MainActivity extends Activity implements OnPageChangeListener {
protected static final String TAG = "MainActivity";
private List<ImageView> imageViewList;
private ViewPager mViewPager;
private final int[] imageResIDs = {
R.drawable.a,
R.drawable.b,
R.drawable.c,
R.drawable.d,
R.drawable.e
};
private final String[] imageDescriptions = {
"巩俐不低俗,我就不能低俗",
"扑树又回来啦!再唱经典老歌引万人大合唱",
"揭秘北京电影如何升级",
"乐视网TV版大派送",
"热血 * 丝的反杀"
};
private TextView tvImageDescription; // 图片描述
private LinearLayout llPointGroup; // 点控件的组
private int previousPosition = 0; // viewpager选中的前一个position
private boolean isStop = false; // 控制循环的子线程是否停止
private Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
mViewPager.setCurrentItem(mViewPager.getCurrentItem() + 1);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
new Thread(new Runnable() {
@Override
public void run() {
// 每两秒钟向主线程发送一条消息, 切换viewpager的界面
while(!isStop) {
SystemClock.sleep(2000);
handler.sendEmptyMessage(0);
}
Log.i(TAG, "循环线程停止了");
}}).start();
}
@Override
protected void onDestroy() {
isStop = true;
super.onDestroy();
}
private void initView() {
mViewPager = (ViewPager) findViewById(R.id.viewpager);
llPointGroup = (LinearLayout) findViewById(R.id.ll_point_group);
tvImageDescription = (TextView) findViewById(R.id.tv_image_description);
imageViewList = new ArrayList<ImageView>();
ImageView iv;
View pointView;
LayoutParams params;
for (int i = 0; i < imageResIDs.length; i++) {
iv = new ImageView(this);
iv.setBackgroundResource(imageResIDs[i]);
imageViewList.add(iv);
// 根据图片添加点
pointView = new View(this);
params = new LayoutParams(5, 5);
params.leftMargin = 5;
pointView.setLayoutParams(params);
pointView.setEnabled(false);
pointView.setBackgroundResource(R.drawable.point_bg);
llPointGroup.addView(pointView);
}
MyPagerAdapter mAdapter = new MyPagerAdapter();
mViewPager.setAdapter(mAdapter);
mViewPager.setOnPageChangeListener(this);
int item = (Integer.MAX_VALUE / 2) - ((Integer.MAX_VALUE / 2) % imageViewList.size());
mViewPager.setCurrentItem(item); // 设置当前选中的item的position
tvImageDescription.setText(imageDescriptions[previousPosition]);
llPointGroup.getChildAt(previousPosition).setEnabled(true); // 第一点被选中
}
class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount() {
return Integer.MAX_VALUE;
}
/**
* 移动的对象和进来的对象如果是同一个就返回true, 代表复用view对象
* false 使用object对象
*/
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
/**
* 需要销毁的对象的position传进来
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 移除掉指定position的对象
mViewPager.removeView(imageViewList.get(position % imageViewList.size()));
}
/**
* 加载position位置的view对象
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 添加指定position的对象
mViewPager.addView(imageViewList.get(position % imageViewList.size()));
return imageViewList.get(position % imageViewList.size());
}
}
@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
}
/**
* 当viewpager页面切换时回调
* @param position 就是当前显示的page页
*/
@Override
public void onPageSelected(int position) {
tvImageDescription.setText(imageDescriptions[position % imageViewList.size()]);
llPointGroup.getChildAt(position % imageViewList.size()).setEnabled(true);
llPointGroup.getChildAt(previousPosition).setEnabled(false);
previousPosition = position % imageViewList.size();
}
}
0
投稿
猜你喜欢
- 最近项目中需要实现定时执行任务,比如定时计算会员的积分、调用第三方接口等,由于项目采用spring框架,所以这里结合spring框架来介绍。
- SingleClick:@Retention(AnnotationRetention.RUNTIME)@Target(AnnotationT
- 1、找准入口,使用ClassPathXmlApplicationContext的构造方法加载配置文件,用于加载classPath下的配置文件
- jdk8之前 一、java.lang.Systemlong times = System.currentTimeMillis();
- Android 自动获取验证码的两种方式分别是BroadcastReceiver及ContentObserver,两种方式都需要进行注册、取
- 1.引言在开发中,拖放是一种比较常见的手势操作,使用它能够让应用的交互更加地便捷和友好,本文将简要介绍如何为Android中的View添加拖
- 一. 线性表中的顺序表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见
- 声明:下面的实例全部在linux下尝试,window下未尝试。有兴趣者可以试一下。文章针c初学者。c语言的强符号和弱符号是c初学者经常容易犯
- JSON.toJSONString()空字段不忽略修改使用JSON.toJSONString(object)方法,返回的json中,默认会将
- 一、项目要求实现一个通讯录通讯录可以用来存储100个人的信息,每个人的信息包括:姓名、性别、年龄、电话、住址提供方法:添加联系人信息删除指定
- Android 无障碍的全局悬浮窗可以在屏幕上添加 UI 供用户进行快捷操作,可以展示在所有应用程序之上长期展示。另一方面,在一些自动化场景
- 1 简介Solace是一个强大的实时性的事件驱动消息队列。本文将介绍如何在Spring中使用,虽然代码使用的是Spring Boot,但并没
- 前言空间分配要点有:一是空间分配的连续性;二是动态内存申请;三是防止程序执行中出现异常错误。提示:开始讲解了嗷~后续会根据精力持续更新嗷!!
- 正则表达式是一种描述词素的重要表示方法。虽然正则表达式并不能表达出所有可能的模式(例如“由等数量的 a 和 b 组成的字符串”),但是它可以
- 本文实例为大家分享了C# GDI+实现时钟表盘的具体代码,供大家参考,具体内容如下一、设计如下图界面按键“打开时钟&am
- 本文实例为大家分享了OpenCV实现人脸识别程序的具体代码,供大家参考,具体内容如下//Haar特征检测,人脸识别算法,是用xml作为训练后
- 具体代码如下所示:***web.xml***<?xml version="1.0" encoding="
- 本文实例为大家分享了C#超市收银系统设计的具体代码,供大家参考,具体内容如下1.登录界面代码如下:using System;using Sy
- 其他的不多说了!我们来看看效果吧 一、实现方式一:直接引入compile方式A
- “Java is still not dead—and people are starting to figure that out.”本教