页面指示器与自定义View

来源:互联网 发布:贴片机工作原理及编程 编辑:程序博客网 时间:2024/05/21 14:09

页面知识器是通过自定义View来实现,简单粗暴,直接上代码,以后可以直接拿来用:

(1)布局代码:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:tedu="http://schemas.android.com/apk/res/com.example.day0501viewpagerindicator"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <android.support.v4.view.ViewPager
        android:id="@+id/vPagerId"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.example.day0501viewpagerindicator.CircleIndicator
        android:id="@+id/circleIndicator1"
        android:layout_width="wrap_content"
        android:layout_height="30dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="30dp"
        tedu:count="5"
        tedu:radius="10" />
</RelativeLayout>

(2)自定义View类

//自定义页面指示器
public class CircleIndicator extends View{

//inflate
public CircleIndicator(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public CircleIndicator(Context context, AttributeSet attrs) {
super(context, attrs);
Log.i("TAG", "CircleIndicator(Context context, AttributeSet attrs)");
//获得attrs.xml中名字为"CircleIndicator01"的属性
TypedArray ta=
context.obtainStyledAttributes(attrs,R.styleable.CircleIndicator01);
//获得属性radius的值
radius=ta.getInteger(R.styleable.CircleIndicator01_radius,5);
Log.i("TAG", "radius="+radius);
count=ta.getInteger(R.styleable.CircleIndicator01_count, 0);

}
public CircleIndicator(Context context){
super(context);
}
private float x,y,fillX;//fillX为实心圆x轴位置
private int radius;
private int count;
/**此方法在屏幕尺寸发生变化时调用*/
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
x=w/2-6*radius;//计算第一个圆的x轴初始位置
fillX=x;
y=30/2;
}
/**构建一个画笔对象*/
private Paint paint=
new Paint(Paint.ANTI_ALIAS_FLAG);
/**重写此方法实现view的绘制
 * @param canvar表示画布
 * */
@Override
protected void onDraw(Canvas canvas) {
paint.setColor(Color.BLUE);
paint.setStyle(Style.STROKE);//空心
//绘制5个空心圆
for(int i=0;i<count;i++){
canvas.drawCircle(
x+i*radius*3,
y,
10, paint);   
}
//绘制一个实心圆
paint.setColor(Color.RED);
paint.setStyle(Style.FILL);
canvas.drawCircle(fillX,y, radius-2, paint);
}
public void reDraw(int pos,float offset){
fillX=x+(pos+offset)*radius*3;
//重绘(会重新执行onDraw方法)
invalidate();
}

}

(3)在MainActivity.java中调用

public class MainActivity extends Activity implements OnPageChangeListener {

private ViewPager vPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
setViewPager();
setIndicator();
}
private void setViewPager() {
vPager = (ViewPager) findViewById(R.id.vPagerId);
PagerAdapter adapter = new InnerAdapter();
vPager.setAdapter(adapter);
vPager.setOnPageChangeListener(this);
}
private void setIndicator() {
cir = (CircleIndicator) findViewById(R.id.circleIndicator1);
}
private int imgs[]={R.drawable.a,R.drawable.b,R.drawable.d,
R.drawable.e,R.drawable.f};
CircleIndicator cir;
class InnerAdapter extends PagerAdapter{

@Override
public int getCount() {
// TODO Auto-generated method stub
return imgs.length;
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
// TODO Auto-generated method stub
return arg0==arg1;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
// TODO Auto-generated method stub
container.removeView((View)object);
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
// TODO Auto-generated method stub
Log.i("TAG","instantiateItem");
ImageView iv = new ImageView(MainActivity.this);
iv.setScaleType(ScaleType.FIT_XY);
iv.setImageResource(imgs[position]);
container.addView(iv);
return iv;
}
}

@Override
public void onPageScrollStateChanged(int arg0) {
// TODO Auto-generated method stub
Log.i("TAG","onPageScrollStateChanged");
}

@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO Auto-generated method stub
Log.i("TAG","onPageScrolled");
cir.reDraw(arg0, arg1);
}

@Override
public void onPageSelected(int arg0) {
// TODO Auto-generated method stub
Log.i("TAG","onPageSelected");
}
}

attrs文件中的代码:

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <declare-styleable name="CircleIndicator01">
        <attr name="radius" format="integer"/>
        <attr name="count" format="integer"/>
    </declare-styleable>
</resources>


0 0