android中无限循环滑动的gallery实例

1.点击图片有变暗的效果,使用imageview.setAlpha(),并且添加ontouchListener

 public void init() {
dots = new ImageView[len];
for (int j = 0; j < len; j++) {
// 添加图片
final ImageView iv = new ImageView(this);
iv.setImageResource(res[j]);
views.add(iv);
iv.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
iv.setAlpha(70);
slideHandler.removeCallbacks(slideRun);
}
return false;
}
});
// 添加索引
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new LayoutParams(15, 15));
dots[j] = imageView;
TextView tv = new TextView(this);
tv.setText(" ");
if (j == 0) {
// 默认进入程序后第一张图片被选中;
dots[j].setBackgroundResource(R.drawable.yst_i_pageon);
} else {
dots[j].setBackgroundResource(R.drawable.yst_i_pageoff);
} layout_point.addView(tv);
layout_point.addView(imageView);
}
gallery.setAdapter(new ImageAdapter());
gallery.setSelection((Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2)
% len);
gallery.setOnItemSelectedListener(selectListener);
((MyGallery) gallery).setViews(views);
// TODO 定时滑动
startSlide();
}

2.无限滑动,自定义adapter,设置count为最大值,图片总数循环从0到图片的总长度

 public class ImageAdapter extends BaseAdapter {

         public int getCount() {
if (views != null) {
return Integer.MAX_VALUE;
} else {
return 0;
}
} public Object getItem(int position) {
if (position >= len) {
position = position % len;
} return position;
} public long getItemId(int position) {
if (position >= len) {
position = position % len;
}
return position;
} public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (position >= len) {
position = position % len;
}
if (view == null) {
view = views.get(position);
} return view;
}
}

3.自动滑动,自定义gallery,重写onFling方法,触摸时,停止滑动,弹起时继续滑动

 public class MyGallery extends Gallery {

     private List<ImageView> views;
/** 左边 */
public static final int LEFT = 0;
/** 右边 */
public static final int RIGHT = 1; public MyGallery(Context context) {
super(context);
// TODO Auto-generated constructor stub
} public MyGallery(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// TODO Auto-generated constructor stub
} public MyGallery(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
} /** 设置视图 */
public void setViews(List<ImageView> views) {
this.views = views;
} @Override
public boolean onTouchEvent(MotionEvent event) {
// TODO Auto-generated method stub
if (event.getAction() == MotionEvent.ACTION_UP) {
// 遍历views 设置alpha
if (views != null && !views.isEmpty()) {
for (ImageView iv : views) {
iv.setAlpha(255);
}
}
Context context = this.getContext();
if (context != null && context instanceof MainActivity) {
MainActivity main=(MainActivity) context;
main.startSlide();
}
}
return super.onTouchEvent(event);
} /** 滑动 direction=1向右,-1向左 */
public void slide(int direction) {
// MotionEvent e1 = MotionEvent.obtain(SystemClock.uptimeMillis(),
// SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN,
// 89.333336f, 265.33334f, 0);
// MotionEvent e2 = MotionEvent.obtain(SystemClock.uptimeMillis(),
// SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, 300.0f,
// 238.00003f, 0);
if (direction == this.RIGHT)
this.onFling(null, null, -1200, 0);
else {
this.onFling(null, null, 1200, 0);
}
}
}

下面贴出完整代码:
布局xml:

<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"
android:background="@android:color/background_light"
tools:context=".MainActivity" > <LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:gravity="center"
android:orientation="vertical" > <com.allen.gallery.MyGallery
android:id="@+id/mygallery"
android:layout_width="fill_parent"
android:layout_height="160dp"
android:fadingEdge="horizontal|vertical"
android:fadingEdgeLength="20dp" /> <LinearLayout
android:id="@+id/layout_dots"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:orientation="horizontal" >
</LinearLayout>
</LinearLayout> </RelativeLayout>

2.完整的实现代码:

 package com.allen.gallery;

 import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView; public class MainActivity extends Activity {
private List<ImageView> views = new ArrayList<ImageView>();
/** 图片资源 */
private int[] res = new int[] { R.drawable.image1, R.drawable.image2,
R.drawable.image3, R.drawable.image4 };
private ImageView[] dots;
int len = 4;
int currentItem = 0;// 当前选中的viewPager的item
private Gallery gallery;
private LinearLayout layout_point;
/** 定时滑动 */
private final Handler slideHandler = new Handler();
/** 滑动 */
private final Runnable slideRun = new Runnable() { @Override
public void run() {
// TODO Auto-generated method stub
currentItem++;
currentItem = checkPosition(currentItem);
((MyGallery) gallery).slide(MyGallery.RIGHT);
slideHandler.postDelayed(this, 2000);
}
}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 初始化中间
layout_point = (LinearLayout) this.findViewById(R.id.layout_dots);
gallery = (Gallery) findViewById(R.id.mygallery);
gallery.setSpacing(20);
init();
} public void init() {
dots = new ImageView[len];
for (int j = 0; j < len; j++) {
// 添加图片
final ImageView iv = new ImageView(this);
iv.setImageResource(res[j]);
views.add(iv);
iv.setOnTouchListener(new OnTouchListener() { @Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN) {
iv.setAlpha(70);
slideHandler.removeCallbacks(slideRun);
}
return false;
}
});
// 添加索引
ImageView imageView = new ImageView(this);
imageView.setLayoutParams(new LayoutParams(15, 15));
dots[j] = imageView;
TextView tv = new TextView(this);
tv.setText(" ");
if (j == 0) {
// 默认进入程序后第一张图片被选中;
dots[j].setBackgroundResource(R.drawable.yst_i_pageon);
} else {
dots[j].setBackgroundResource(R.drawable.yst_i_pageoff);
} layout_point.addView(tv);
layout_point.addView(imageView);
}
gallery.setAdapter(new ImageAdapter());
gallery.setSelection((Integer.MAX_VALUE / 2) - (Integer.MAX_VALUE / 2)
% len);
gallery.setOnItemSelectedListener(selectListener);
((MyGallery) gallery).setViews(views);
// TODO 定时滑动
startSlide();
} private AdapterView.OnItemSelectedListener selectListener = new AdapterView.OnItemSelectedListener() { @Override
public void onItemSelected(AdapterView<?> parent, View view,
int position, long id) {
// TODO Auto-generated method stub
if (position >= len) {
position = position % len;
currentItem = position;
}
selectPage();
} @Override
public void onNothingSelected(AdapterView<?> parent) {
// TODO Auto-generated method stub
}
}; public class ImageAdapter extends BaseAdapter { public int getCount() {
if (views != null) {
return Integer.MAX_VALUE;
} else {
return 0;
}
} public Object getItem(int position) {
if (position >= len) {
position = position % len;
} return position;
} public long getItemId(int position) {
if (position >= len) {
position = position % len;
}
return position;
} public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (position >= len) {
position = position % len;
}
if (view == null) {
view = views.get(position);
} return view;
}
} /** 开始滑动 */
public void startSlide() {
slideHandler.postDelayed(slideRun, 2000);
} public int checkPosition(int position) {
if (position >= len) {
position = position % len;
} return position;
} /** 设置当前选中页 */
private void selectPage() {
/** 设置当前显示的页码 */
for (int i = 0; i < len; i++) {
dots[currentItem].setBackgroundResource(R.drawable.yst_i_pageon);
if (currentItem != i) {
dots[i].setBackgroundResource(R.drawable.yst_i_pageoff);
}
}
}
}

点击我

下载就不用了吧。。。

© Copyright by allen

android中无限循环滑动的gallery实例的更多相关文章

  1. Android中ViewPager实现滑动条及与Fragment结合的实例教程

    ViewPager类主要被用来实现可滑动的视图功能,这里我们就来共同学习Android中ViewPager实现滑动条及与Fragment结合的实例教程,需要的朋友可以参考下 自主实现滑动指示条先上一个 ...

  2. 详细分析Android viewpager 无限循环滚动图片

    由于最近在忙于项目,就没时间更新博客了,于是趁着周日在房间把最近的在项目中遇到的技术总结下.最近在项目中要做一个在viewpager无限滚动图片的需求,其实百度一下有好多的例子,但是大部分虽然实现了, ...

  3. 关于UIScrollView无限循环滑动

    在使用某宝或某东购物的时候,我们会在其首页看到一个可以滑动的版块,这个版块的实现就是一个UIScrollView.在我们使用UIScrollView的时候会发现,滑动到最后的时候,UIScrollVi ...

  4. Android中制作自定义dialog对话框的实例

    http://www.jb51.net/article/83319.htm   这篇文章主要介绍了Android中制作自定义dialog对话框的实例分享,安卓自带的Dialog显然不够用,因而我们要继 ...

  5. android 自定义无限循环播放的viewPager。轮播ViewPager。实现循环播放 广告,主题内容,活动,新闻内容时。

    前言 实际项目需要一个 播放广告的控件,可能有多个广告图片.每个一段时间更换该图片.简单来说,就是一个 “循环播放图片”的控件. 间隔时间更换图片 一般来说,图片切换时需要有动画效果 需要支持手势,用 ...

  6. Android中的跨进程通信方法实例及特点分析(二):ContentProvider

    1.ContentProvider简单介绍 在Android中有些数据(如通讯录.音频.视频文件等)是要供非常多应用程序使用的.为了更好地对外提供数据.Android系统给我们提供了Content P ...

  7. Android中Handler的使用方法及实例(基础回顾)

    Handler使用例1 这个例子是最简单的介绍handler使用的,是将handler绑定到它所建立的线程中.本次实验完成的功能是:单击Start按钮,程序会开始启动线程,并且线程程序完成后延时1s会 ...

  8. 详解实现Android中实现View滑动的几种方式

    注: 本文提到的所有三种滑动方式的完整demo:ScrollDemo 1. 关于View我们需要知道的 (1)什么是View? Android中的View类是所有UI控件的基类(Base class) ...

  9. Android中的跨进程通信方法实例及特点分析(一):AIDL Service

    转载请注明出处:http://blog.csdn.net/bettarwang/article/details/40947481 近期有一个需求就是往程序中增加大数据的採集点,可是由于我们的Andro ...

随机推荐

  1. HttpClient读取ASP.NET Web API错误信息的简单方法

    在C#中,用HttpClient调用Web API并且通过Content.ReadAsStringAsync()读取响应内容时,如果出现500错误(InternalServerError),会得到一个 ...

  2. 单元测试 Mocking 类库需具备的特性

    一个优秀的单元测试 Mocking 类库,需要具备如下几个特性: 易用性:有非常明确的 API ,易于使用并易于记忆. 健壮性:行为结果始终一致,并保持准确. 帮助性:当程序出错时,给出尽可能明确的原 ...

  3. 调研一类软件的发展演变—聊天软件( 1000-2000 words, in Chinese)

    因为本人平时对聊天软件的涉及比周边其他同学而言所涉及的是比较多的.所以说想写写这个东西.(ps本文里面的具体通讯信息的时间安排不分先后) 也许最起初的通讯信息的传达是利用.烽火狼烟这一类可以远距离视觉 ...

  4. ActiveReports 9实战教程(3): 图文并茂的报表形式

    基于上面2节内容,我们搭建了AR9的开发环境,配置好了数据源.在本节,我们以官方提供的3个中文图文并茂的报表来展示AR9的功能,并通过实战的方式一一分享. 以往做报表相关的工作时,最害怕的是报表的UI ...

  5. 北大青鸟进入ASP.NET MVC的世界(一)

    今天我们开始ASP.NET  MVC 4.0课程的学习第一讲.我们今天主要关注如下5个问题: 1.理解ASP.NET MVC程序的执行过程 2.会使用ASP.NET中的系统对象 3.会搭建ASP.NE ...

  6. CLIQUE 聚类算法以及Java实现+多线程

    CLIQUE(Clustering In QUEst)是一种简单的基于网格的聚类方法,用于发现子空间中基于密度的簇.CLIQUE把每个维划分成不重叠的区间,从而把数据对象的整个嵌入空间划分成单元.它使 ...

  7. atitit。自定义uml MOF EMF体系eclipse emf 教程o7t

    atitit.自定义uml MOF EMF体系eclipse emf  教程o7t 1. 元对象机制(MOF,Meta-Object Facility)and  结构 1 2. 元模型图.模型图.对象 ...

  8. 一步一步写miscdevice的驱动模块

    (本文使用的平台为友善tiny210SDKv2) 对于linux的驱动程序来说,主要分为三种:miscdevice.platform_device.platform_driver . 这三个结构体关系 ...

  9. iOS开发Swift篇(02) NSThread线程相关简单说明

    iOS开发Swift篇(02) NSThread线程相关简单说明 一 说明 1)关于多线程部分的理论知识和OC实现,在之前的博文中已经写明,所以这里不再说明. 2)该文仅仅简单讲解NSThread在s ...

  10. android: 实现跨程序数据共享

    简单起见,我们还是在上一章中 DatabaseTest 项目的基础上继续开发,通过内容提供器 来给它加入外部访问接口. 打开 DatabaseTest 项目,首先将 MyDatabaseHelper ...