服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android实现图片轮播效果

Android实现图片轮播效果

2021-04-20 17:06徐刘根 Android

这篇文章主要为大家详细介绍了Android实现图片轮播效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例讲述了jaandroid实现图片轮播效果代码,分享给大家供大家参考。具体如下:
运行效果截图如下:

Android实现图片轮播效果

具体代码如下:

首先看下一下布局文件:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<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=".mainactivity" >
 
 <!-- 广告条的使用 -->
 
 <com.xuliugen.viewpager.myviewpagertransformeranim
 android:id="@+id/viewpager"
 android:layout_width="match_parent"
 android:layout_height="200dp" />
 
 <!-- 广告条下边的文字 -->
 
 <linearlayout
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 android:layout_alignbottom="@id/viewpager"
 android:background="#33000000"
 android:orientation="vertical" >
 
 <textview
  android:id="@+id/image_desc"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:gravity="center"
  android:text="@string/app_name"
  android:textcolor="@android:color/white"
  android:textsize="16sp" />
 
 <linearlayout
  android:id="@+id/point_group"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"
  android:layout_gravity="center_horizontal"
  android:layout_marginbottom="5dp"
  android:orientation="horizontal" >
 </linearlayout>
 </linearlayout>
 
</relativelayout>

Android实现图片轮播效果

效果很简单,从布局文件中我们看到使用了一个自定义的viewpager动画,代码如下:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package com.xuliugen.viewpager;
 
import java.util.hashmap;
import java.util.map;
 
import android.content.context;
import android.support.v4.view.viewpager;
import android.util.attributeset;
import android.view.view;
 
import com.nineoldandroids.view.viewhelper;
 
/*
 * 自定义viewpager实现动画切换效果:
 *
 * 1、需要拿到当前切换的两个view
 *
 * 2、一个动画的梯度值
 */
public class myviewpagertransformeranim extends viewpager {
 
 private view mleft;
 private view mright;
 
 private float mtrans;
 private float mscale;
 
 private static final float min_scale = 0.6f;
 private map<integer, view> mchildren = new hashmap<integer, view>();
 
 /*
 * 要有两个构造方法
 */
 public myviewpagertransformeranim(context context, attributeset attrs) {
 super(context, attrs);
 }
 
 public myviewpagertransformeranim(context context) {
 super(context);
 }
 
 /*
 * 设置put的方法
 */
 public void setviewforposition(view view, int position) {
 mchildren.put(position, view);
 }
 
 /*
 * remove的方法
 */
 public void removeviewfromposition(integer position) {
 mchildren.remove(position);
 }
 
 /**
 * 重写的方法
 */
 @override
 protected void onpagescrolled(int position, float offset, int offsetpixels) {
 
 // log.e("tag", "position =" + position + ",offset = " + offset);
 mleft = mchildren.get(position);
 mright = mchildren.get(position + 1);
 
 animstack(mleft, mright, offset, offsetpixels);// 创建动画效果
 
 super.onpagescrolled(position, offset, offsetpixels);
 }
 
 private void animstack(view left, view right, float offset, int offsetpixels) {
 if (right != null) {
 
  // 从0-1页,offset:0`1
  mscale = (1 - min_scale) * offset + min_scale;
 
  mtrans = -getwidth() - getpagemargin() + offsetpixels;
 
  viewhelper.setscalex(right, mscale);
  viewhelper.setscaley(right, mscale);
 
  viewhelper.settranslationx(right, mtrans);
 }
 if (left != null) {
  left.bringtofront();
 }
 }
}

mainactivity.java

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
package com.xuliugen.viewpager;
 
import java.util.arraylist;
 
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.view;
import android.view.viewgroup;
import android.widget.imageview;
import android.widget.linearlayout;
import android.widget.textview;
 
public class mainactivity extends activity {
 
 private viewpager viewpager;
 
 private linearlayout pointgroup;
 
 private textview iamgedesc;
 
 // 图片资源id
 private final int[] imageids = { r.drawable.a, r.drawable.b, r.drawable.c,
  r.drawable.d, r.drawable.e };
 
 // 图片标题集合
 private final string[] imagedescriptions = { "巩俐不低俗,我就不能低俗",
  "扑树又回来啦!再唱经典老歌引万人大合唱", "揭秘北京电影如何升级", "乐视网tv版大派送", "热血屌丝的反杀" };
 
 private arraylist<imageview> imagelist;
 
 /**
 * 上一个页面的位置
 */
 protected int lastposition;
 
 @override
 protected void oncreate(bundle savedinstancestate) {
 super.oncreate(savedinstancestate);
 setcontentview(r.layout.activity_main);
 
 viewpager = (viewpager) findviewbyid(r.id.viewpager);
 pointgroup = (linearlayout) findviewbyid(r.id.point_group);
 iamgedesc = (textview) findviewbyid(r.id.image_desc);
 iamgedesc.settext(imagedescriptions[0]);
 
 imagelist = new arraylist<imageview>();
 for (int i = 0; i < imageids.length; i++) {
 
  // 初始化图片资源
  imageview image = new imageview(this);
  image.setbackgroundresource(imageids[i]);
  imagelist.add(image);
 
  // 添加指示点
  imageview point = new imageview(this);
  linearlayout.layoutparams params = new linearlayout.layoutparams(
   linearlayout.layoutparams.wrap_content,
   linearlayout.layoutparams.wrap_content);
 
  params.rightmargin = 20;
  point.setlayoutparams(params);
 
  point.setbackgroundresource(r.drawable.point_bg);
  if (i == 0) {
  point.setenabled(true);
  } else {
  point.setenabled(false);
  }
  pointgroup.addview(point);
 }
 
 viewpager.setadapter(new mypageradapter());
 
 // viewpager.setcurrentitem(integer.max_value/2 -
 // (integer.max_value/2%imagelist.size())) ;
 
 viewpager.setonpagechangelistener(new onpagechangelistener() {
 
  @override
  /**
  * 页面切换后调用
  * position 新的页面位置
  */
  public void onpageselected(int position) {
 
  position = position % imagelist.size();
 
  // 设置文字描述内容
  iamgedesc.settext(imagedescriptions[position]);
 
  // 改变指示点的状态
  // 把当前点enbale 为true
  pointgroup.getchildat(position).setenabled(true);
  // 把上一个点设为false
  pointgroup.getchildat(lastposition).setenabled(false);
  lastposition = position;
 
  }
 
  @override
  /**
  * 页面正在滑动的时候,回调
  */
  public void onpagescrolled(int position, float positionoffset,
   int positionoffsetpixels) {
  }
 
  @override
  /**
  * 当页面状态发生变化的时候,回调
  */
  public void onpagescrollstatechanged(int state) {
 
  }
 });
 
 /*
  * 自动循环: 1、定时器:timer 2、开子线程 while true 循环 3、colckmanager 4、 用handler
  * 发送延时信息,实现循环
  */
 isrunning = true;
 // 设置图片的自动滑动
 handler.sendemptymessagedelayed(0, 3000);
 }
 
 /**
 * 判断是否自动滚动
 */
 private boolean isrunning = false;
 
 private handler handler = new handler() {
 public void handlemessage(android.os.message msg) {
 
  // 让viewpager 滑动到下一页
  viewpager.setcurrentitem(viewpager.getcurrentitem() + 1);
  if (isrunning) {
  handler.sendemptymessagedelayed(0, 3000);
  }
 };
 };
 
 protected void ondestroy() {
 
 isrunning = false;
 };
 
 private class mypageradapter extends pageradapter {
 
 @override
 /**
  * 获得页面的总数
  */
 public int getcount() {
  return integer.max_value; // 使得图片可以循环
 }
 
 @override
 /**
  * 获得相应位置上的view
  * container view的容器,其实就是viewpager自身
  * position 相应的位置
  */
 public object instantiateitem(viewgroup container, int position) {
 
  // system.out.println("instantiateitem ::" + position);
 
  // 给 container 添加一个view
  container.addview(imagelist.get(position % imagelist.size()));
  // 返回一个和该view相对的object
  return imagelist.get(position % imagelist.size());
 }
 
 @override
 /**
  * 判断 view和object的对应关系
  */
 public boolean isviewfromobject(view view, object object) {
  if (view == object) {
  return true;
  } else {
  return false;
  }
 }
 
 @override
 /**
  * 销毁对应位置上的object
  */
 public void destroyitem(viewgroup container, int position, object object) {
  // system.out.println("destroyitem ::" + position);
 
  container.removeview((view) object);
  object = null;
 }
 }
 
}

另外我们看效果图可以看出,效果图下边的几个原点是变化的,所以我们需要一个selector,如下:

?
1
2
3
4
5
6
7
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
 
 <item android:drawable="@drawable/point_nomal" android:state_enabled="false"/>
 <item android:drawable="@drawable/point_focured" android:state_enabled="true"/>
 
</selector>

希望本文所述对大家学习android软件编程有所帮助。

延伸 · 阅读

精彩推荐
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31