轮播图片的展示
实现逻辑
创建XML布局文件,使用ViewPager完成轮播图片 初始化ViewPager控件,然后为控件设置适配器,创建出来的适配器实现里面的四个方法 四个方法分别是getCount isViewFromObject instantiateItem destroyItem 在onCreat方法中,加载图片资源,将图片ID存在集合中,使图片能够在页面中显示,(图片之所以能够在页面中显示,是因为在适配器中的instantiateItem方法中获取了集合中的图片元素) 图片下方的文字显示: 图片下方之所以会有文字,可以通过初始化控件,在ViewPager监听器中的onPageSelected方法中tv_desc.setText(descs[position]);
这样文字就可以跟随者图片进行切换文字下方的小圆点的切换: 在XML布局中设置一个Linlayout布局,然后再onCreat方法中设置小圆点,通过LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10, 10);
的方法引入小圆点(具体代码可以参考下方的initDot方法) 要想让小圆点随着页面的切换而切换,可以定义下方的changeDots的方法,让此方法在监听器中的onPageSelected方法中进行调用 图片的无限轮播的实现: 可以使适配器中的getCount返回值设为一个很大很大的值,同时在instantiateItem方法中设置position position = position % imageResIds.length;
防止索引越界异常,这样就可以使图片无限轮播,但是此时还有一个问题就是,右边可以无限轮播,但是左边是无法无限轮播的,这个问题的解决办法是在onCreat方法中设置当前选中的条目viewPager.setCurrentItem(count / 2);
这样两边都可以实现无限轮播 9.图片自动切换的处理: 使用handler机制实现页面的延时更新,同时为了防止内存溢出,需要在页面可见时,也就是activity的onStart方法中发送消息,在页面消失时,也就是onStop方法中删除消息
布局文件
<?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:id ="@+id/activity_main"
android:layout_width ="match_parent"
android:layout_height ="match_parent"
tools:context ="com.example.a2_.MainActivity" >
<android.support.v4.view.ViewPager
android:id ="@+id/vp"
android:layout_width ="match_parent"
android:layout_height ="250dp" >
</android.support.v4.view.ViewPager >
<LinearLayout
android:orientation ="vertical"
android:gravity ="center"
android:background ="#66000000"
android:layout_alignBottom ="@id/vp"
android:layout_width ="match_parent"
android:layout_height ="50dp" >
<TextView
android:id ="@+id/desc"
android:text ="描述文本"
android:textColor ="#ffffff"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content" />
<LinearLayout
android:id ="@+id/layout_dot"
android:orientation ="horizontal"
android:layout_width ="wrap_content"
android:layout_height ="wrap_content" >
</LinearLayout >
</LinearLayout >
</RelativeLayout >
核心代码
package com.example.a2_;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends AppCompatActivity {
private static final int UPDATE_ITEM = 1 ;
private ArrayList<ImageView> imageViews = new ArrayList<>();
private int [] imageResIds = {R.mipmap.icon_1, R.mipmap.icon_2, R.mipmap.icon_3,
R.mipmap.icon_4, R.mipmap.icon_5};
private String[] descs = {"为梦想坚持" , "我相信我是黑马" , "黑马公开课" , "Google/IO" , "轻松1w+" };
private ViewPager viewPager;
private TextView tv_desc;
private LinearLayout layout_dot;
private int count = 10000000 ;
private Handler handler = new Handler() {
@Override
public void handleMessage (Message msg) {
switch (msg.what) {
case UPDATE_ITEM:
upDataItem();
break ;
}
super .handleMessage(msg);
}
};
@Override
protected void onCreate (Bundle savedInstanceState) {
super .onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) findViewById(R.id.vp);
tv_desc = (TextView) findViewById(R.id.desc);
layout_dot = (LinearLayout) findViewById(R.id.layout_dot);
viewPager.setAdapter(new MyPagerAdapter());
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled (int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected (int position) {
position = position % imageViews.size();
tv_desc.setText(descs[position]);
changeDots(position);
}
@Override
public void onPageScrollStateChanged (int state) {
if (state == viewPager.SCROLL_STATE_IDLE) {
handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000 );
} else {
handler.removeMessages(UPDATE_ITEM);
}
}
});
initImage();
initDot();
viewPager.setCurrentItem(count / 2 );
upDataItem();
}
private void upDataItem () {
int index = viewPager.getCurrentItem();
viewPager.setCurrentItem(++index);
handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000 );
}
private void changeDots (int position) {
for (int i = 0 ; i < layout_dot.getChildCount(); i++) {
View view = layout_dot.getChildAt(i);
view.setSelected(false );
}
layout_dot.getChildAt(position).setSelected(true );
}
private void initDot () {
LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(10 , 10 );
layoutParams.setMargins(4 , 4 , 4 , 4 );
for (int i = 0 ; i < imageViews.size(); i++) {
View view = new View(this );
view.setBackgroundResource(R.drawable.seletor_dot);
view.setLayoutParams(layoutParams);
layout_dot.addView(view);
}
}
private void initDescFirst () {
tv_desc.setText(descs[0 ]);
changeDots(0 );
}
private void initImage () {
for (int i = 0 ; i < imageResIds.length; i++) {
ImageView imageView = new ImageView(getApplicationContext());
imageView.setImageResource(imageResIds[i]);
imageViews.add(imageView);
}
}
private class MyPagerAdapter extends PagerAdapter {
@Override
public int getCount () {
return count;
}
@Override
public boolean isViewFromObject (View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem (ViewGroup container, int position) {
position = position % imageResIds.length;
ImageView imageView = imageViews.get(position);
container.addView(imageView);
return imageView;
}
@Override
public void destroyItem (ViewGroup container, int position, Object object) {
container.removeView((View) object);
}
}
@Override
protected void onStart () {
super .onStart();
handler.sendEmptyMessageDelayed(UPDATE_ITEM, 3000 );
}
@Override
protected void onStop () {
super .onStop();
handler.removeCallbacksAndMessages(null );
}
}