什么是自定义控件?
把原有的控件组合一起形成一个控件来用
什么是自定义View?
发明创造,自定义View(组件) ,一般继承于View子类或者ViewGroup的子类
现在新建一个工程命名为viewpager
在xml 文件添加viewpager控件宽度为填充父类窗口
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="200dip" >
<android.support.v4.view.ViewPager
android:layout_width="fill_parent"
android:layout_height="200dip"
android:id="@+id/vp_advert"
>
</android.support.v4.view.ViewPager>
<!-- 文字描述和点的显示 -->
<RelativeLayout
android:paddingTop="5dip"
android:paddingBottom="5dip"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:background="#33000000"
android:gravity="center_horizontal"
android:orientation="vertical"
>
<!-- 文字描述 -->
<TextView
android:textColor="#ffffff"
android:id="@+id/tv_main_desc"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="你好" />
<!-- 点的容器 -->
<LinearLayout
android:id="@+id/ll_main_points"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" >
</LinearLayout>
</RelativeLayout>
</RelativeLayout>
红点参数point_red.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 半径 -->
<corners android:radius="5dip"/>
<!-- 颜色 -->
<solid android:color="#ff0000"/>
</shape>
白点point_white.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<!-- 半径 -->
<corners android:radius="5dip"/>
<!-- 颜色 -->
<solid android:color="#ffffff"/>
</shape>
java 部分
package com.example.viewpager;
import java.util.ArrayList;
import java.util.List;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.view.View;
import android.view.View.OnAttachStateChangeListener;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.annotation.SuppressLint;
import android.app.ActionBar.LayoutParams;
import android.app.Activity;
public class MainActivity extends Activity {
private ViewPager vpPager;
// 用于储存图片
private List<ImageView> datas = new ArrayList<ImageView>();
private LinearLayout ll_points;
private TextView tv_desc;
private int selectIndex;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
initView();
initData() ;
initEvent();
}
@SuppressLint("NewApi")
//监听viewpager 的滑动事件以便确保 图片跟红点能同步
private void initEvent() {
// 给ViewPager添加view改变的事件
vpPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageSelected(int position) {
// 页面选中
selectIndex = position % datas.size();
System.out.println("sssssss");
initPoints();
}
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
// 页面滑动
}
@Override
public void onPageScrollStateChanged(int state) {
// 页面状态改变
}
});
}
private void initData() {
//初始化Image 把要显示的Image 放入List 容器中
initImageView();
// 初始化点
initPoints();
PagerAdapter pAdapter = new PagerAdapter() {
@Override
public void destroyItem(ViewGroup container, int position,
Object object) {
// 删除view
// 从ViewPager中移除掉View 用完了就释放,节省没存空间
container.removeView((View) object);
}
@Override
public boolean isViewFromObject(View view, Object object) {
// 每展示一个View 都要是判断 true 才可以显示
return view == object;
}
// 初始化View的显示 相当于 baseadapter 的 getView
@Override
public Object instantiateItem(ViewGroup container, int position) {
// 初始化view
View view = datas.get(position);
// 添加View到ViewPager中
vpPager.addView(view);
return view;
}
@Override
public int getCount() {
//无限个
return Integer.MAX_VALUE;
}
};
vpPager.setAdapter(pAdapter);
}
@SuppressLint("NewApi")
private void initPoints() {
ll_points.removeAllViews();
//为确保图片的个数跟点个数一样
for (int i = 0; i < datas.size(); i++) {
View v = new View(this);
LayoutParams lp = new LayoutParams(10, 10);
if (i == selectIndex) {
// 描述信息
tv_desc.setText("图片" + i + "描述");
// 红点
v.setBackgroundResource(R.drawable.point_red);
}
else {
v.setBackgroundResource(R.drawable.point_white);
}
//右边边框
lp.rightMargin = 5;
//左边边框
lp.leftMargin = 5;
v.setLayoutParams(lp);
// 设置布局参数
ll_points.addView(v);
}
}
private void initImageView() {
//组织数据
for(int id =R.drawable.a; id < R.drawable.a +5; id++){
//每个id 都要申请一个对象
ImageView iv = new ImageView(this);
// 设置图片 把图片放入对应的 ImageView中
iv.setImageResource(id);
// 图片填充控件
iv.setScaleType(ScaleType.FIT_XY);
//把组织好的图片放入容器中
datas.add(iv);
}
}
private void initView() {
//activiy 的布局
setContentView(R.layout.activity_main);
//获取viewpager id
vpPager = (ViewPager) findViewById(R.id.vp_advert);
//获取点的ll_points id
ll_points = (LinearLayout) findViewById(R.id.ll_main_points);
//获取描述文本的id
tv_desc = (TextView) findViewById(R.id.tv_main_desc);
}
}