轮播:3.0之后出现
思路:
1.画界面,viewpage,文字,小点点
2.初始化控件,绑定数据,适配器适显示数据,写javaBean
3.监听viewpage
文字与图片
文字图片与滑动的小点点
handler自动循环轮播
注意:无限循环的滑动处理
第一:xml文件
<?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=".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_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignBottom="@id/viewPager"
android:orientation="vertical"
android:background="#46000000"
android:padding="8dp">
<!--android:singleLine="true" 不允许换行
android:ellipsize="end" 一行显示不完的再末尾处用…来显示-->
<TextView
android:id="@+id/tv_intro"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="文本"
android:textSize="18sp"
android:textColor="#ffffff"
android:singleLine="true"
android:ellipsize="end"/>
<LinearLayout
android:id="@+id/ll"
android:layout_marginTop="3dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:orientation="horizontal">
</LinearLayout>
</LinearLayout>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="200dp">
<!-- src 可以设置这个属性,background没有这个属性 fitXY 充满整个view-->
<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:src="@drawable/a"
android:scaleType="fitXY"/>
</LinearLayout>
第二:javaBean
package heimaviewpage.ncs.yeyy.heimaviewpage;
/**
* javaBean
* Created by yeyy on 2016/4/8.
*/
public class Ad {
private int iconResId;//图片的id,一般实际项目开发用的String,url地址
private String intro;
public Ad(int iconResId, String intro) {
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;
}
}
第三:adapter
package heimaviewpage.ncs.yeyy.heimaviewpage;
import android.content.Context;
import android.support.v4.view.PagerAdapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import java.util.ArrayList;
/**
* Created by yeyy on 2016/4/8.
*/
public class MyViewPagerAdapter extends PagerAdapter {
Context context;
private ArrayList<Ad> list;
public MyViewPagerAdapter(Context context, ArrayList<Ad> list) {
this.context = context;
this.list = list;
}
/**
* 返回多少page
*
* @return
*/
@Override
public int getCount() {
return Integer.MAX_VALUE;//将这个数尽量设置到最大值
}
/**
* viewPage预加载机制,最多保存3个page
* 默认返回false 去重新创建,true 表示不去创建
* 判断当前滑动的和将要进来的是不是同一个view
*
* @param view 当前滑动的view
* @param object 将要进入的新创建的view,由instantiateItem方法创建
* @return
*/
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
/**
* 类似于BaseAdapter的getView方法
* 用来将数据设置给view
* viewPage 预加载机制:最多保存3个page
*
* 因为最多三个界面,所以不需要使用viewHolder
* @param container
* @param position
* @return
*/
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view=View.inflate(context,R.layout.item_ad,null);
ImageView iv = (ImageView) view.findViewById(R.id.image);
// 注意当你布局文件中使用的是src时,要用setImageResource
// 如果你布局文件中使用的是background时,要用setBackgroundResource
Ad ad=list.get(position%list.size());
iv.setImageResource(ad.getIconResId());
container.addView(view);//将view加入到viewpage当中
return view;
}
/**
* 销毁page
*
* @param container viewpage本身的引用
* @param position 当前你要销毁的第几个page
* @param object 当前需要消耗的page
*/
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// 抛出异常,需要注释掉,告诉你这个方法需要重写
// super.destroyItem(container, position, object);
container.removeView((View) object);
}
}
第四:mainActivity
package heimaviewpage.ncs.yeyy.heimaviewpage;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
public class MainActivity extends Activity {
private ViewPager viewPager;
private ArrayList<Ad> list = new ArrayList<Ad>();
private MyViewPagerAdapter adapter;
private TextView tvIntro;
private LinearLayout ll;
private Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
viewPager.setCurrentItem(viewPager.getCurrentItem()+1);
handler.sendEmptyMessageDelayed(0,1000);//自动轮播
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
initListener();
// initDots();
}
// 滑动同小点点一致
private void initDots() {
for (int i = 0; i < list.size(); i++) {
View view = new View(this);
// 相当于在布局文件中对小点点设置了宽高
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(8, 8);
if (i!=0){
params.leftMargin=5;
}
view.setLayoutParams(params);
view.setBackgroundResource(R.drawable.selecttor_dot);
ll.addView(view);
}
}
// 监听滑动
private void initListener() {
viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
undateIntroAndDot();
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
// 图片和文字同步,更新文本
private void undateIntroAndDot() {
// 获得当前是第几页,根据当前页来设置文本,能滑动的数字设为整数最大值,
// 取中间的数,方便左右滑动到最后都能重头开始,无限循环
int currentPage = viewPager.getCurrentItem()%list.size();
tvIntro.setText(list.get(currentPage).getIntro());
for (int i = 0; i < ll.getChildCount(); i++) {
ll.getChildAt(i).setEnabled(i==currentPage);
}
}
private void initData() {
list.add(new Ad(R.drawable.a, "123"));
list.add(new Ad(R.drawable.b, "456"));
list.add(new Ad(R.drawable.c, "789"));
list.add(new Ad(R.drawable.d, "啦啦啦啦啦啦啦"));
list.add(new Ad(R.drawable.e, "哈哈哈哈哈哈哈哈哈哈哈"));
initDots();//在加载文字的时候,就可以设置小点点了
adapter = new MyViewPagerAdapter(MainActivity.this, list);
viewPager.setAdapter(adapter);
// 默认选中整数最大值中间选择, 这样左右都能滑动了
int centerValue =Integer.MAX_VALUE/2;
int value=centerValue%list.size();//就是4
viewPager.setCurrentItem(centerValue-value);
undateIntroAndDot();
handler.sendEmptyMessageDelayed(0,1000);
}
private void initView() {
viewPager = (ViewPager) findViewById(R.id.viewPager);
tvIntro = (TextView) findViewById(R.id.tv_intro);
ll = (LinearLayout) findViewById(R.id.ll);
}
}