——轮播图的实现——
来源:互联网 发布:订票软件哪个好 编辑:程序博客网 时间:2024/04/26 06:15
本例参考http://blog.csdn.net/code_legend/article/details/54729636?ref=myread
一、实现的效果
本例的轮播图使用ViewPager实现
二、代码部分
1、activity_main.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" tools:context="com.example.administrator.viewpagerlunbo.MainActivity" > <android.support.v4.view.ViewPager android:id="@+id/viewPager" android:layout_width="match_parent" android:layout_height="200dp" > </android.support.v4.view.ViewPager> <LinearLayout android:layout_alignBottom="@id/viewPager" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="#77000000" android:padding="8dp" android:orientation="vertical" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center_horizontal" android:textColor="#ffffff" android:textSize="16sp" android:singleLine="true" android:ellipsize="end" android:id="@+id/tv_intro" android:text="我不是文本" /> <LinearLayout android:layout_marginTop="3dp" android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/dot_layout" android:layout_gravity="center_horizontal" android:orientation="horizontal" > </LinearLayout> </LinearLayout></RelativeLayout>
2、设置放置图片的布局 adapter_ad.xml
<?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" > <ImageView android:layout_width="match_parent" android:src="@drawable/a" android:id="@+id/image" android:scaleType="fitXY" android:layout_height="match_parent"/></LinearLayout>
这里图片可以自己找
3、创建一个实体类 Ad.java
/** * 创建实体类,包含文本和点两个属性 */public class Ad { private int iconResId; private String intro; public Ad(int iconResId, String intro) { super(); this.iconResId = iconResId; this.intro = intro; } public int getIconResId() { return iconResId; } public void setIconResId(int iconResId) { this.iconResId = iconResId; } public String getIntro() { return intro; } public void setIntro(String intro) { this.intro = intro; }}
4、MainActivity.java
public class MainActivity extends Activity { private ViewPager viewPager; private TextView tv_intro; private LinearLayout dot_layout; private Handler handler; private ArrayList<Ad> list = new ArrayList<Ad>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); handler = new Handler(); initView(); //初始化布局控件 initListener(); //为每一页设置监听和实现轮播 initData(); //初始化图片资源和文本资源,设置对应页的图片文本和点。 } private void initView() { setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager); tv_intro = (TextView) findViewById(R.id.tv_intro); dot_layout = (LinearLayout) findViewById(R.id.dot_layout); } private void initListener() { viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { Log.e("Activity", "position: "+position); updateIntroAndDot(); } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageScrollStateChanged(int state) { } }); HomeHeaderTask task = new HomeHeaderTask(); task.start(); } private void initData() { list.add(new Ad(R.drawable.a, "巩俐不低俗,我就不能低俗")); list.add(new Ad(R.drawable.b, "朴树又回来了,再唱经典老歌引百万人同唱啊")); list.add(new Ad(R.drawable.c, "揭秘北京电影如何升级")); list.add(new Ad(R.drawable.d, "乐视网TV版大放送")); list.add(new Ad(R.drawable.e, "热血屌丝的反杀")); initDots(); viewPager.setAdapter(new MyPagerAdapter()); updateIntroAndDot(); } /** * 初始化dot——动态加载点 */ private void initDots(){ for (int i = 0; i < list.size(); i++) { View view = new View(this); LayoutParams params = new LayoutParams(8, 8); if(i!=0){ params.leftMargin = 5; } view.setLayoutParams(params); view.setBackgroundResource(R.drawable.selector_dot); dot_layout.addView(view); } } /** * 更新文本和点 */ private void updateIntroAndDot(){ //使用一个整除取余是为了让图片轮播完后从头继续开始播放 int currentPage = viewPager.getCurrentItem()%list.size(); tv_intro.setText(list.get(currentPage).getIntro()); //将当夜对应的点置为白点 for (int i = 0; i < dot_layout.getChildCount(); i++) { dot_layout.getChildAt(i).setEnabled(i==currentPage); } } /** * handler实现自动轮播 */ class HomeHeaderTask implements Runnable { public void start() { // 移除之前发送的所有消息, 避免消息重复 handler.removeCallbacksAndMessages(null); handler.postDelayed(this, 3000); } @Override public void run() { int currentItem = viewPager.getCurrentItem(); currentItem++; viewPager.setCurrentItem(currentItem); // 继续发延时3秒消息, 实现内循环 handler.postDelayed(this, 3000); } } /** * 创建适配器,实现viewpager的装载 */ class MyPagerAdapter extends PagerAdapter{ /** * 返回多少page */ @Override public int getCount() { return 10000; } /** * true: 表示不去创建,使用缓存 false:去重新创建 * view: 当前滑动的view * object:将要进入的新创建的view,由instantiateItem方法创建 */ @Override public boolean isViewFromObject(View view, Object object) { return view==object; } /** * 类似于BaseAdapger的getView方法 * 用了将数据设置给view * 由于它最多就3个界面,不需要viewHolder */ @Override public Object instantiateItem(ViewGroup container, int position) { View view = View.inflate(MainActivity.this, R.layout.adapter_ad, null); ImageView imageView = (ImageView) view.findViewById(R.id.image); Ad ad = list.get(position%list.size()); imageView.setImageResource(ad.getIconResId()); container.addView(view);//一定不能少,将view加入到viewPager中 return view; } /** * 销毁page * position: 当前需要消耗第几个page * object:当前需要消耗的page */ @Override public void destroyItem(ViewGroup container, int position, Object object) {// super.destroyItem(container, position, object); container.removeView((View) object); } }}
5、在drawable目录下 创建三个xml文件,
dot_focus.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#ffffff"/></shape>
dot_unfocus.xml
<?xml version="1.0" encoding="utf-8"?><shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"> <solid android:color="#aa000000"/></shape>
selector_dot.xml
<?xml version="1.0" encoding="utf-8"?><selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="true" android:drawable="@drawable/dot_focus"></item> <item android:drawable="@drawable/dot_unfocus"></item></selector>
阅读全文
0 0
- 栈的实现—由数组实现
- 队列的实现—由数组实现
- ——轮播图的实现——
- Liferay 对JSR168 的实现—— PortletConfig 的实现
- 递归—排列组合的实现
- 数据结构—单链表的实现
- 哈夫曼编码和哈夫曼树的实现——Pascal实现
- Redis设计与实现——单机数据库的实现
- 栈的实现—由链表实现
- 队列的实现—由链表实现
- Socket层实现系列 — bind()的实现(一)
- Socket层实现系列 — bind()的实现(二)
- Socket层实现系列 — listen()的实现
- Socket层实现系列 — accept()的实现(一)
- Socket层实现系列 — getsockname()和getpeername()的实现
- Socket层实现系列 — accept()的实现(二)
- Socket层实现系列 — connect()的实现
- Objective—C实现UICollectionView中UICollectionViewCell的重排实现
- Hybrid APP 混合开发模式的选择之路(一)
- usb Plaxis v8.2+SP4 professioner-ISO 1CD(大型岩土工程有限元设计计算软件,完全安装版,好用
- 又见01背包
- Java String拼接
- sqlite
- ——轮播图的实现——
- Arduino学习日记三
- linux学习记录-逻辑卷章
- 隔离通信-RS485(一)
- ZooKeeper数据流动图
- ./(点斜杠)与. (点空格)执行脚本文件的区别
- 程序员的八重境界
- 基于Python flask全文搜索
- Starting MySQL... ERROR! The server quit without updating PID file 解决方法