android ViewPager 自定义控件《一》

什么是自定义控件?

把原有的控件组合一起形成一个控件来用

什么是自定义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);
}


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值