很多时候在想依赖系统提供的组件来是实现某种功能,用起来都很麻烦。比如显示页数,作者因为布局问题,实现起来有很多局限性,要么不能够重用,要么就是不能达到自己的效果。所以这就有促使咱们自己定义view,想怎么画就怎么画……
作者的理解:在实现自定义view的时候,大多数情况下复写了onMeasure和onLayout及onDraw方法就基本可以是实现自定义view了,接着就是添加一些set方法,提供给外面设置。也可以基本的总结为3个点:
1>onMeasure:设置自定义view的宽高,一定要设置,不然会显示不出来,如果里面有子view,也得循环设置一下
2>onLayout:设置真正自定义view中的内容(或子view)相对于这个自定义view的位置,很重要
3>onDraw:当自定义view里都是系统有的子控件的时候,这个可以不复写
继承Linearlayout,显示页数,非常实用,mark分享下O(∩_∩)O~。。。。
public class PageView extends LinearLayout {
private static final String TAG="PageLinearLayout";
Context cxt;
public PageView(Context context) {
this(context, null);
}
public PageView(Context context, AttributeSet attrs) {
super(context, attrs);
cxt = context;
}
/**
* 添加数据
*
* @param pageCount
*/
public void setData(int pageCount,int page){
this.removeAllViews();
for(int i=0;i
ImageView iv = new ImageView(cxt);
if(i== page){
iv.setImageResource(R.drawable.flag_current_page1);
}else{
iv.setImageResource(R.drawable.flag_current_page2);
}
this.addView(iv);
}
invalidate();
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}
private int spacing,iv_w,iv_h,start_x,start_y;
/**
* @param spacing 间距
* @param start_x 页图片开始显示坐标
* @param start_y
* @param iv_w 页图片宽度
* @param iv_h 页图片高度
*/
public void setParams(int spacing,int start_x,int start_y,int iv_w,int iv_h){
this.spacing = spacing;
this.iv_h = iv_h;
this.iv_w = iv_w;
this.start_x = start_x;
this.start_y = start_y;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int childCount = getChildCount();
for(int i=0;i
getChildAt(i).measure(iv_w,iv_h);
}
setMeasuredDimension(widthMeasureSpec, heightMeasureSpec);
}
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
super.onLayout(changed, l, t, r, b);
int childCount = getChildCount();
int startLeft = start_x-((childCount/2)*(iv_w+spacing));
for(int i=0;i
//Log.i(TAG,"###startLeft:"+startLeft);
View child=getChildAt(i);
if(child.getVisibility() != View.GONE){
child.layout(startLeft,start_y,startLeft+iv_w,start_y+iv_h);
}
startLeft+=(iv_w+spacing);
}
}
}