android实现无限轮播
第一种方法用的是ViewPager+Handler 来实现无线轮播;
第二种方式用的是UltraViewPager来实现,用UltraViewPager可以很简单的实现无线或不无线的轮播实现
地址:https://github.com/alibaba/UltraViewPager
1 在ViewPager的适配器中的getCount()长度设置无限大Integer.MAX_VALUE
2 明白当前currentIten 为position % images.length;
3 设置一开始ViewPager的位置 viewPager.setCurrentItem((images.length) * 1000);这样刚开始就可以向左滑动了
4 在OnPageChangeListener ViewPager的滑动监听中设置小点的位置
5 设置Handler 定时滑动开启滑动
6 在onResume中发送空消息,在onPause中移除消息将所有的Callbacks和Messages全部清除掉,避免内存泄露。
如下是主代码 图片是本地的
package com.demo.sb.main; import java.util.ArrayList;
import com.demo.sb.utils.DensityUtil;
import com.demo.suibian.R;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout; public class MActivity_Luenbo extends Activity { private ViewPager viewPager;
private LinearLayout group;
private int[] images = { R.drawable.a, R.drawable.c, R.drawable.d,
R.drawable.guide_1, R.drawable.guide_2 };
private ArrayList<ImageView> mImageViewList;
private ImageView[] diandian;// ViewPager上的点点
private int selectedItem = 0; @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.mactivity_luenbo);
viewPager = (ViewPager) findViewById(R.id.vp_viewPager);
group = (LinearLayout) findViewById(R.id.ll_viewGroup);
init(); } @SuppressLint("HandlerLeak")
private Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
viewPager.setCurrentItem(selectedItem + 1);
mHandler.sendEmptyMessageDelayed(0, 3000);
};
}; private void init() {
// TODO Auto-generated method stub
// 引导3个ViewPager
mImageViewList = new ArrayList<ImageView>();
for (int i = 0; i < images.length; i++) {
ImageView imageView = new ImageView(this);
imageView.setBackgroundResource(images[i]);
mImageViewList.add(imageView);
} // 将点点加入到ViewGroup中
diandian = new ImageView[images.length];
for (int i = 0; i < images.length; i++) {
// 循环加入点点图片组
diandian[i] = new ImageView(this);
if (i == 0) {
diandian[i].setImageResource(R.drawable.page_indicator_focused);
} else {
diandian[i]
.setImageResource(R.drawable.page_indicator_unfocused);
}
diandian[i].setPadding(8, 8, 8, 8);
group.addView(diandian[i]);
}
viewPager.setAdapter(new GuideAdapter());
// 设置监听,主要是设置点点的背景
viewPager.setOnPageChangeListener(new GuidePagerListener());
// 设置ViewPager的默认项,设置为长度的1000倍,这样开始就能向左滑动了
viewPager.setCurrentItem((images.length) * 1000);
} /**
* 每次当onResume有焦点时发送个空消息开始轮播
*/
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
mHandler.sendEmptyMessageDelayed(0, 2000);
} /**
* 当暂停时停止轮播
*/
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
mHandler.removeCallbacksAndMessages(null);
} /**
* ViewPager的适配器
*
*/
private class GuideAdapter extends PagerAdapter { @Override
public int getCount() {
// TODO Auto-generated method stub
return Integer.MAX_VALUE;
} @Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0 == arg1;
} // @Override
// public void destroyItem(View container, int position, Object object)
// {
// // TODO Auto-generated method stub
// ((ViewGroup) container).removeView(images[position
// % images.length]);
// }
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View) object);
} /**
* 加载图片进去,用当前的position除以图片数组长度取余数是关键
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
final int currentIten = position % images.length;
ImageView iView = mImageViewList.get(currentIten);
try { if (iView.getParent() == null) {
container.addView(iView);
}
iView.setOnClickListener(new OnClickListener() { @Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
DensityUtil.showToast(MActivity_Luenbo.this,
currentIten + "");
}
});
iView.setOnTouchListener(new NewTouchListener());
} catch (Exception e) {
// TODO: handle exception
} return iView;
} } /**
* ViewPager 的滑动监听
*
* @author Administrator
*
*/
private class GuidePagerListener implements OnPageChangeListener { @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
System.out.println(arg0 + " dd " + arg1 + " dddd " + arg2);
} @Override
public void onPageSelected(int position) {
// TODO Auto-generated method stub
selectedItem = position;
System.out.println("第几个页面" + position + " " + position
% mImageViewList.size());
for (int i = 0; i < diandian.length; i++) {
if (i == position % images.length) {
diandian[i]
.setImageResource(R.drawable.page_indicator_focused);
} else {
diandian[i]
.setImageResource(R.drawable.page_indicator_unfocused);
}
}
} } /**
* ViewPager的触摸事件当按下图片停止轮播
*
* @author Administrator
*
*/
private class NewTouchListener implements OnTouchListener { @Override
public boolean onTouch(View arg0, MotionEvent arg1) {
// TODO Auto-generated method stub
switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
mHandler.removeCallbacksAndMessages(null);
break;
case MotionEvent.ACTION_CANCEL:
mHandler.sendEmptyMessageDelayed(0, 3000);
break;
case MotionEvent.ACTION_UP:
mHandler.sendEmptyMessageDelayed(0, 3000);
break;
default:
break;
}
return true;
} } }
<?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:orientation="vertical" > <TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="@string/luenbo"
android:textColor="#f00" /> <FrameLayout
android:layout_width="match_parent"
android:layout_height="200dp" > <android.support.v4.view.ViewPager
android:id="@+id/vp_viewPager"
android:layout_width="match_parent"
android:layout_height="match_parent" /> <RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="bottom|center"
android:layout_marginBottom="20dp" > <LinearLayout
android:id="@+id/ll_viewGroup"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" />
</RelativeLayout> </FrameLayout> </LinearLayout>
第二种方式:
compile('com.alibaba.android:ultraviewpager:1.0.4@aar') {
transitive = true
}
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.xieer.citybike.app.activity.guide.GuideActivity"> <com.tmall.ultraviewpager.UltraViewPager
android:id="@+id/ultra_viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray" /> <Button
android:id="@+id/guide_start"
android:layout_width="90dp"
android:layout_height="40dp"
android:background="#FCCCC7"
android:textSize="12sp"
android:textColor="#D0525D"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_marginBottom="50dp"
android:text="开始骑行吧"
android:visibility="gone" />
</RelativeLayout>
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Color;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView; import com.tmall.ultraviewpager.UltraViewPager;
import com.xieer.citybike.app.MainActivity;
import com.xieer.citybike.app.R;
import com.xieer.citybike.app.adapter.PageMyAdapter;
import com.xieer.citybike.app.utils.common.ToastUtils; import java.util.ArrayList; /**
* 引导页面
* 使用UltraViewPager 来实现的轮播效果
* https://github.com/alibaba/UltraViewPager
*/
public class GuideActivity extends AppCompatActivity {
private SharedPreferences sPreferences;
private ArrayList<ImageView> mdata;
private static final int[] mImageIds = new int[]{R.drawable.guide_1,R.drawable.guide_2,R.drawable.guide_3};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_guide);
mdata = new ArrayList<>();
for(int i=0;i<mImageIds.length;i++){
ImageView imageView = new ImageView(this);
imageView.setBackgroundResource(mImageIds[i]);
mdata.add(imageView);
}
sPreferences = getSharedPreferences("info",MODE_PRIVATE);
final Button btn_start = (Button)findViewById(R.id.guide_start);
UltraViewPager ultraViewPager = (UltraViewPager)findViewById(R.id.ultra_viewpager);
ultraViewPager.setScrollMode(UltraViewPager.ScrollMode.HORIZONTAL);
PagerAdapter adapter = new PageMyAdapter(this,mdata);
ultraViewPager.setAdapter(adapter);
//设置indicator样式
ultraViewPager.initIndicator();
ultraViewPager.getIndicator().setOrientation(UltraViewPager.Orientation.HORIZONTAL)
.setFocusColor(Color.GREEN)
.setNormalColor(Color.WHITE)
.setMargin(0,0,0, ToastUtils.dp2px(this,10))
.setRadius((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,ToastUtils.dp2px(this,4),this.getResources().getDisplayMetrics()));
ultraViewPager.getIndicator().setGravity(Gravity.CENTER_HORIZONTAL | Gravity.BOTTOM);
ultraViewPager.getIndicator().build();
ultraViewPager.setInfiniteLoop(false);
ultraViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener(){
@Override
public void onPageSelected(int position) {
super.onPageSelected(position);
if(position == mdata.size() - 1){
btn_start.setVisibility(View.VISIBLE);
}else {
btn_start.setVisibility(View.GONE);
}
}
});
btn_start.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
sPreferences.edit().putBoolean("isLoad",false).commit();
startActivity(new Intent(GuideActivity.this, MainActivity.class));
finish();
}
});
}
}
android实现无限轮播的更多相关文章
- Android之无限轮播图源代码
Android轮播广告图是大家经常用到的一个控件今天便撸了一把代码 实现步骤 使用Viewpager进行实现图片滑动 设置ViewPager的数据,让其无限切换 Activity代码 public c ...
- Android之仿京东淘宝的自动无限轮播控件
在App的开发中,很多的时候都需要实现类似京东淘宝一样的自动无限轮播的广告栏,所以就自己写了一个,下面是我自定义控件的思路和过程. 一.自定义控件属性 新建自定义控件SliderLayout继承于Re ...
- Android实现广告页图片无限轮播
一.概述 对于一个联网的Android应用, 首页广告无限轮播基本已经成为标配了. 那么它是怎么实现的呢? 有几种实现方式呢? 二.无限轮播的实现 1.最常规的手段是用 ViewPager来实现 2. ...
- android中广告轮播图总结
功能点:无限轮播.指示点跟随.点击响应.实现思路: 1.指示点跟随,指示点通过代码动态添加,数量由图片数量决定. 在viewpager的页面改变监听中,设置点的状态选择器enable,当前页时,set ...
- ViewPager实现无限轮播踩坑记
最近笔者想通过ViewPager来实现一个广告Banner,并实现无限轮播的效果,但是在这个过程中踩了不少的坑,听我慢慢道来.如果大家有遇到和我一样的情况,可以参考我的解决方法,没有那就更好,如果针对 ...
- ViewPage实现无限轮播画廊效果
1. 效果图 2. 布局文件 主要使用的 android:clipChildren的意思:是否限制子View在其范围内.再父布局和viewpager中设置该属性 ,要显示三个界面 ,还要设置marg ...
- iOS开发之三个Button实现图片无限轮播(参考手机淘宝,Swift版)
这两天使用Reveal工具查看"手机淘宝"App的UI层次时,发现其图片轮播使用了三个UIButton的复用来实现的图片循环无缝滚动.于是乎就有了今天这篇博客,看到“手机淘宝”这个 ...
- iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView
iOS:实现图片的无限轮播(二)---之使用第三方库SDCycleScrollView 时间:2016-01-19 19:13:43 阅读:630 评论:0 收藏:0 ...
- iOS开发之ImageView复用实现图片无限轮播
在上篇博客中iOS开发之多图片无缝滚动组件封装与使用给出了图片无限轮播的实现方案之一,下面在给出另一种解决方案.今天博客中要说的就是在ScrollView上贴两个ImageView, 把ImageVi ...
随机推荐
- DDD~领域事件与事件总线
回到目录 谈谈它 终于有些眉目了,搜刮了很多牛人的资料,英文的,中文的,民国文的,终于小有成就了,同时也做了个DEMO,领域事件这东西好,但需要你明白它之后才会说好,而对于明白领域事件这件事来说,它的 ...
- 知方可补不足~sqlserver中的几把锁~续
回到目录 之前写过相关的文章,对脏读,不可重复读,幻读都做了相当的研究,而今天在程序中又出现了这个问题,即当一条数据被update时,另一个线程同时发起了读的操作,这对于序列化级别的事务是不被允许的, ...
- fir.im Weekly - 17 个提升 iOS 开发效率的必备工具
本期 fir.im Weekly 精选了一些iOS 开发工具和动画源码分享,希望每个开发者能专注效率.实用.灵感. iOS开发工具--如何优化ipa包大小 @iOS程序犭袁 推荐了关于"如 ...
- Design4:数据库设计规范
当数据模型从概念层转到逻辑层时,需要进行规范化设计.要想设计一个结构合理的关系型数据库,至少需要满足1NF,2NF,3NF,即第一范式,第二范式,第三范式. 1,1NF(原子性) 1NF是最基本的,数 ...
- Unity 产生各不相同的随机数
1. 网上很多方法都说用时间种子来解决,但是在极短的时间内,这种方法没效 Random r = new Random(DateTime.Now.Millisecond); Random Counter ...
- Android入门(十一)SQLite CURD
原文链接:http://www.orlion.ga/594/ 一.添加数据 SQLiteOpenHelper的getReadableDatabase()或getWritableDatabase()方法 ...
- Android属性动画之第一重修炼总结
经过这两天对ObjectAnimator属性动画的学习,基本对Android提供的属性动画有了一定的认识,现在就为大家以一个类似扇形打开的效果做总结. 效果图: 下面就让我们用刚刚学到的属性动画效果, ...
- java 显示透明背景png图片
首先理由ps生成一个背景透明的png图片,然后设置JPanel面板的透明属性,也就是panel.setOpaque(false);设置为透明 class MyPanel extends JLayere ...
- AngularJS入门心得3——HTML的左右手指令
在<AngularJS入门心得1——directive和controller如何通信>我们提到“AngularJS是为了克服HTML在构建应用上的不足而设计的.HTML是一门很好的为静态文 ...
- Android上滑手势触发和不增加布局层级扩大点击区域
最近项目中需要实现手势上滑或者点击滑出界面的效果,实现上是利用GestureDetector,然后在onFling中判断,但遇到一个问题:手势上滑是针对整个布局的,但如果有对单独的View设置点击监听 ...