问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

android使用ViewPager实现轮播效果教程

发布网友 发布时间:2023-10-08 20:42

我来回答

1个回答

热心网友 时间:2024-02-22 10:26

ViewPager:一个可以实现视图左右滑动切换的控件。
ViewPager的基本使用:
ViewPager的视图需要通过PagerAdapter来实现显示。
PagerAdapter的主要方法:
● getCount 视图的数量
● instantiateItem 添加视图
● destroyItem 销毁视图
● isViewFromObject 是否由对象创建视图
ViewPager的常用方法:
setAdapter 设置适配器
addOnPageChangeListener 监听页面切换的状态
setCurrentItem 设置当前页面的索引
实现广告轮播
技术点分析:
1、网络连接
2、JSON解析
3、ViewPager的初始化
4、图片的异步加载
5、圆点指示器的实现
使用selector+shape实现圆点图片
动态创建ImageView添加到集合中,同时添加到布局中
在ViewPager切换事件中,切换圆点状态
6、自动切换效果
使用Handler的post方法,定时执行代码
资源文件:
mydot.xml //创建圆点资源,放在drawable文件下
布局文件:
activity_main.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/lv_list" /
activity_banner.xml
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:id="@+id/vp_image"
android:layout_width="wrap_content"
android:layout_height="150dp"
android:layout_gravity="center" /
android:layout_width="match_parent"
android:layout_height="40dp"
android:id="@+id/layout"
android:layout_gravity="bottom"
android:gravity="center"
android:orientation="horizontal"
java代码
ImageLoader.java //该代码是通过URL获取图片资源
package cn.e.huse.banner_re.util;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 图片加载的工具类
* @author xray
*
*/
public class ImageLoader {
/**
* 图片加载完成的回调接口
* 添加URL参数,用于做图片错位判断
*/
public interface OnImageLoadListener{
//完成图片加载
void onImageLoadComplete(String url, Bitmap bitmap);
}
private OnImageLoadListener mListener;
/**
* 启动图片加载任务
* @param urlStr
* @param listener
*/
public void loadImage(String urlStr,OnImageLoadListener listener){
this.mListener = listener;
new ImageLoadTask().execute(urlStr);
}
/**
* 图片加载任务
* @author xray
*
*/
class ImageLoadTask extends AsyncTask
@Override
protected UrlAndBitmap doInBackground(String... params) {
try {
//创建URL,指定图片地址
URL url = new URL(params[0]);
//打开连接获得HttpURLConnection对象
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
//获得文件输入流
InputStream stream = conn.getInputStream();
//把输入流转换为图片
Bitmap bmp = BitmapFactory.decodeStream(stream);
//关闭流
stream.close();
return new UrlAndBitmap(params[0],bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
//包装图片地址和图片
class UrlAndBitmap{
String url;
Bitmap bitmap;
public UrlAndBitmap(String url, Bitmap bitmap) {
this.url = url;
this.bitmap = bitmap;
}
}
@Override
protected void onPostExecute(UrlAndBitmap result) {
//进行接口回调
if(mListener != null){
mListener.onImageLoadComplete(result.url,result.bitmap);
}
}
}
}
JSONLoader.java
//读取服务器json
package cn.e.huse.banner_re.util;
import android.os.AsyncTask;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
/**
* 读取服务器JSON的工具类
* @author xray
*
*/
public class JSONLoader {
public interface OnJSONLoadListener{
void onJSONLoadComplete(String json);
}
private OnJSONLoadListener mListener;
public void loadJSON(String urlStr,OnJSONLoadListener listener){
this.mListener = listener;
new JSONLoadTask().execute(urlStr);
}
class JSONLoadTask extends AsyncTask
@Override
protected String doInBackground(String... params) {
try {
URL url = new URL(params[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
InputStream inputStream = conn.getInputStream();
byte[] buffer = new byte[1024];
int len = 0;
//StringBuffer 线程安全,性能低 VS StringBuilder 线程不安全,性能高
StringBuilder strB = new StringBuilder();
while((len = inputStream.read(buffer)) != -1){
//将字节码转换为String
String str = new String(buffer,0,len);
strB.append(str);
}
inputStream.close();
return strB.toString();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
if(mListener != null){
mListener.onJSONLoadComplete(result);
}
}
}
}
MyViewPagerAdapter.java
package cn.e.huse.banner_re.adapter;
import java.util.List;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
/**
* 图片轮播的适配器
* @author Lenovo
*
*/
public class MyViewPagerAdapter extends PagerAdapter {
private List mData;
public MyViewPagerAdapter(List mData) {
this.mData = mData;
}
//返回视图的数量
@Override
public int getCount() {
return mData.size();
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
//销毁图片
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mData.get(position));
}
//添加图片
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mData.get(position));
return mData.get(position);
}
}
MainActivity.java
package cn.e.huse.banner_re;
import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.RadioButton;
import cn.e.huse.banner_re.adapter.MyViewPagerAdapter;
import cn.e.huse.banner_re.util.ImageLoader;
import cn.e.huse.banner_re.util.ImageLoader.OnImageLoadListener;
import cn.e.huse.banner_re.util.JSONLoader;
import cn.e.huse.banner_re.util.JSONLoader.OnJSONLoadListener;
public class MainActivity extends Activity implements OnClickListener{
public static final String URL_GIFT = "http://www.1688wan.com/majax.action?method=getGiftListpageno=1";
public static final String URL_BASE = "http://www.1688wan.com";
private ListView mLv;
//放置圆点图片的布局
private LinearLayout mLayout;
private ViewPager mPager;
//保存viewpager上图片的集合
private List mImageViews;
//保存圆点图片的集合
private List mDotViews;
//当前图片
private ImageView mDotView;
//当前下标
private int mIndex;
private Handler mHandler = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化viewpager
initViewPager();
}
private void initViewPager() {
new JSONLoader().loadJSON(URL_GIFT, new OnJSONLoadListener() {
@Override
public void onJSONLoadComplete(String json) {
//得到图片的地址
List list = josnPare(json);
//初始化主控件
initView();
//将图片显示到viewpager中
initImageViews(list);
//为ViewPager设置适配器
mPager.setAdapter(new MyViewPagerAdapter(mImageViews));
//加载圆点图片
initDot(mImageViews.size());
//实现图片的轮播
mPager.postDelayed(new Runnable() {
@Override
public void run() {
//下标自动++
mIndex++;
//当下标到最后时,就重新来过
if(mIndex = mImageViews.size()){
mIndex = 0;
}
//设置图片
mPager.setCurrentItem(mIndex);
//重复调用
mHandler.postDelayed(this, 1500);
}
}, 1500);
//添加页码滑动的监听,实现圆点图片的切换
mPager.setOnPageChangeListener(new OnPageChangeListener() {
//页选中后调用
@Override
public void onPageSelected(int arg0) {
//改变原来的圆点图片的状态
mDotView.setEnabled(true);
//更新当前的圆点图片
mDotView = mDotViews.get(arg0);
//将当前选中的圆点设为选中状态
mDotView.setEnabled(false);
//更新下标
mIndex = arg0;
}
//滑动中途调用
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
}
//页面滑动状态修改
@Override
public void onPageScrollStateChanged(int arg0) {
}
});
}
});
}
/**获取圆点图片函数
* @param count viewpager上图片的数量
*/
private void initDot(int count){
mDotViews = new ArrayList();
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
LinearLayout.LayoutParams.WRAP_CONTENT,
LinearLayout.LayoutParams.WRAP_CONTENT);
//设置边距
params.setMargins(5, 0, 5, 0);
for(int i = 0; i count; i++){
ImageView image = new ImageView(this);
//设置圆点图片
image.setImageResource(R.drawable.mydot);
//设置图片的位置,方便后面的取值
image.setTag(i);
//设置监听
image.setOnClickListener(this);
//添加到布局中
mLayout.addView(image, params);
//将圆点图片保存到集合中
mDotViews.add(image);
}
mDotView = mDotViews.get(0);
mDotView.setEnabled(false);
}
/**
*显示图片的函数
*/
private void initImageViews(List list) {
mImageViews = new ArrayList();
for(String str : list){
final ImageView imageView = new ImageView(this);
//设置默认图片
imageView.setImageResource(R.drawable.ic_launcher);
new ImageLoader().loadImage(URL_BASE+str, new OnImageLoadListener() {
@Override
public void onImageLoadComplete(String url, Bitmap bitmap) {
if(bitmap != null){
imageView.setImageBitmap(bitmap);
}
}
});
//将ImageView保存到集合中
mImageViews.add(imageView);
}
}
/**
* JSON解析获取图片的地址
* @param url
* @return
*/
private List josnPare(String url){
List list = new ArrayList();
try {
JSONObject jobj = new JSONObject(url);
JSONArray array = jobj.getJSONArray("ad");
for(int i = 0; i array.length(); i++){
JSONObject obj = (JSONObject) array.get(i);
list.add(obj.getString("iconurl"));
}
} catch (Exception e) {
e.printStackTrace();
}
return list;
}
/**
* 初始化控件
*/
private void initView() {
//找到控件
mLv = (ListView) findViewById(R.id.lv_list);
View view = LayoutInflater.from(this).inflate(R.layout.activity_banner, null);
mPager = (ViewPager)view.findViewById(R.id.vp_image);
//圆点图片布局
mLayout = (LinearLayout)view.findViewById(R.id.layout);
//模拟数据
List mList = new ArrayList();
for(int i = 0; i 20; i++){
mList.add("条目--"+i);
}
//创建适配器
ArrayAdapter mAdapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_1,
android.R.id.text1,
mList);
//设置头部视图
mLv.addHeaderView(view);
//设置适配器
mLv.setAdapter(mAdapter);
/*//圆点图片布局
mLayout = (LinearLayout)findViewById(R.id.layout);*/
}
/**
* 圆点图片的监听事件
*/
@Override
public void onClick(View arg0) {
//获取该圆点图片的位置
int index = Integer.parseInt(arg0.getTag().toString());
//将viewpager的图片显示成下标为index的图片
mPager.setCurrentItem(index);
//将原来的设置成默认值
mDotView.setEnabled(true);
//保存新的值
mDotView = (ImageView) arg0;
//将新的值改变成false
mDotView.setEnabled(false);
//更新下标
mIndex = index;
}
}
注意:因为这里用到了json解析,需要用到联网操作,一定要写上上网的权限:

     运行效果:
android使用ViewPager实现轮播效果教程

import android.support.v4.view.ViewPager;import android.support.v4.view.ViewPager.OnPageChangeListener;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.ImageView;import android.widget.LinearLayout;import...

android 中怎么实现多图自动轮播中间放大的效果

1,顶部轮播图,自动轮播效果。2,顶部的viewpager 可随着下拉图片有渐变大的效果。使用方法:1,带轮播图的自定义ScrollView ,在项目中的名字叫ViewPagerImageScrollView,主要是通过图片的matrix.postScale(scale, scale, imgHeight/2, 0); 这个来进行当大图片。

Android-自定义轮播Banner-Viewpaper2实现+贪吃蛇原点指示器+触摸暂 ...

自定义ViewGroup以添加圆角效果,通过测量布局调整内部Viewpaper2的margin,确保内容在圆角内显示。重写dispatchDraw方法完成最终绘制。设计指示器绘制,考虑位置和颜色变化,结合ViewPager2的OnPageChangeCallback,实现贪吃蛇效果,通过判断位置和滚动距离动态调整。触控暂停轮播:利用Viewpaper2提供的回调机制,当...

安卓ViewFlipper的使用详解

android:inAnimation//设置View或ImageView进入屏幕时使用的动画android:outAnimation//设置View或ImageView退出屏幕时使用的动画android:flipInterval//设置View或ImageView之间切换的时间间隔常用方法:setInAnimation:设置View或ImageView进入屏幕时使用的动画 setOutAnimation:设置View或ImageView退出屏幕时使用的动画 ...

Fragment和ViewPager的介绍和使用

而ViewPager则是Android扩展库中的一个功能强大的组件,常用于实现滑动切换多个视图,如广告轮播、应用引导页等。它与ListView相似,但用于Fragment时,通常配合PagerAdapter使用,比如FragmentPagerAdapter和FragmentStatePagerAdapter,它们为Fragment的展示提供了适配支持。开发者可以根据需求自定义适配器,实现更...

Android 解决viewPager中嵌套webView的滑动冲突

首先我们要先和H5的小伙伴商量好方法名和参数,在H5中可以监听到是否点击了或者滑动了轮播图,H5的小伙伴可以在监听值判断,如果点击或者滑动了H5中的轮播图则,调用Android原生的方法参数为true,Android端则进行事件的拦截,反之没有点击或者滑动的时候,则调用方法参数为false。交互方法:  ...

怎么在viewpager内添加跳转按钮

ViewPager的adapter通过setPrimaryItem方法设置当前显示子view.将其保存下来就可以在后面通过自定义的getPrimaryItem来获取到当前子view了。装监视器:把view装进list,list加载到pageAdapter,给viewpager设置监听,监听的就是全部view,要实现这种图片轮播(广告栏效果),就是一句关键代码viewPager.setCurrent...

手机银行生活频道广告轮播图支持分行配置几个广告位

这些图片来自于网络。这个广告位banner是典型的AndroidViewPager实现,要解决一系列问题,比如:1、这个广告位ViewPager要支持无限循环轮播。2、ViewPager要实现自动播放,比如每个若干秒如2秒,自动切换播放到下一张图片。3、通常这样的ViewPager下面会放一排指示器小圆圈,用以形象指示当前页码。

用RecyclerView打造一个轮播图(进阶版)

看到这,我想大家都能看到用RecyclerView实现无限轮播图的强大的之处了吧:adapter可以处理itemview布局和无限轮播; LayoutManager 可以处理整体布局和滑动动画;SnapHelper可以让itemview滑动起来像viewpager一样(一般用自带的 PagerSnapHelper 就行了)。而上面的所有动画效果仅仅都是通过改动 LayoutManager ,...

android studio 怎么下拉刷新上啦加载

我最初的想法就是:先利用RecyclerView添加不同的item布局,上面是一个轮播的ViewPager,下面是一个一个的列表数据,当滑到到底部的时候,可以自动加载更多,当然要在底部添加一个个性化的视图显示正在加载,即脚View。先看一下RecyclerView如何加载不同的item的,通过getItemViewType实现,注意:继承的是...

网页中轮播图的效果如何实现 轮播效果 js实现轮播 js轮播图怎么实现 html图片轮播效果 css3做轮播效果 自动轮播图怎么实现 js实现左右轮播图 js实现图片自动轮播
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
我是一个手机贩子,我在闲鱼上花700块买了一部小米8,下单前忘了问屏幕... vivoX510T 我双清之后不小心把sd卡也格式化了 现在手机无法用wifi 蓝 ... 怎么删除vivox510t手机中的两个系统!第二个系统是刷机精灵上面安装的... recovery在vivox510t中怎么使用 我买了个多玩弹弹堂的游戏号,请问现在怎么办才不被找回 最安全?_百度... 多玩弹弹堂绿色点券是干什么的 多玩歪歪弹弹堂我已经开通一个月的弹王盟约.现在如果再开6个月的弹王... 厦门海底世界游玩多长时间 科学城博能电子厂怎么样 龙之谷手游海龙巢穴怎么打 海龙巢穴通关技巧攻略 为什么数字工程师需要了解些射频知识 汽车摆件佛面脸朝外还是朝内 联通卡怎么查询剩余免费短信条数 我一直用ps cs2,现在想安装cs6,会不会吧cs2覆盖掉?两个版本能共存... cs6和cc可以同时装吗?谁有CC? 怎样知道男生是否真的喜欢我啊? 怎样才能知道对方是不是在乎你,喜欢你 怎样知道一个男人是不是真心爱你啊? ...6千米,下山速度每小时4千米,求上下山的平均速度是多少千米? 明日之后为什么挖不了火山灰 android 怎么鎖nt数据到资源文件中 如何使用HierarchyViewer分析优化布局 我的青春谁做主什么时候拍摄的15 关于我的青春谁做主的两个问题6 我的青春谁做主中的周晋是坏人吗?22 如果被网上通缉的情况下还能办得到居住证吗?或者买车! 封死了。登陆不了。怎么才能注销微信支付 封了,能注消微信支付吗 怎样知道对方喜欢我或是在乎我呢(不问对方) 高数,不定积分问题? 探索奥迪A4L的颜色世界 如何在图纸中插入图框 xd怎么剪掉多余的图形 从山下挑水到山顶的速度是6千米/小时,下山的速度为12千米/时,求上下山... 怎样做能避免盲从,理性消费?16 用clover引导安装黑苹果出现禁止符是什么原因导致的36 WIN7与XP如何实现打印机共享设置 高手请进3 win7和xp共享打印机怎么连接4 win7上的打印机怎么共享给XP——Win7与XP打印机共享...46 如何设置WIN7与XP共享打印机,为什么我的WIN7找不到网...14 一台win7系统的电脑,和一台windows xp 系统的电...1 Win7是主机,怎么共享打印机给XP的电脑5 WIN7系统通过局域网连接XP系统共享的打印机22 男友带我去见他的好哥们,介绍我是他对象5 跟相亲对象互有好感,接触有两个多月了,一次他带我去见他朋友,...2 电脑建盘上显示1是怎么回事 怎么学习高数不定积分?62 有一个人上一座山时,上山速度6千米时,下山8千米时.求平均速度. 急 做皮包厂需要什么机器36 想问下熟黑牛皮多少钱一斤 和制做牛皮包的机器多少一台 我一国...3