大家先看一下如何来自定义ViewGroup的:

public class MyGridView extends ViewGroup{

private Context mContext;
public MyGridView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
myAddView();
}
/**
* 继承ViewGroup之后,eclipse提示需要生成自定义ViewGroup的构造方法和onLayout方法。
*onLayout方法是ViewGroup中的抽象方法,因此继承ViewGroup之后一定要实现该方法。
*ViewGroup中的onLayout方法将在ViewGroup为它的孩子们分配尺寸和位置的时候被调用,
*在这个类的实现中,需要调用每一个控件的布局方法为其布局。
*/
//注意:onLayout在View中是一个public的方法,在ViewGroup为protected类型,并且为abstract,
//由于这个方法在ViewGroup中没有实现,因此ViewGroup本身不可以直接使用。
//为子布局设定位置和大小
/**
* 该方法在ViewGroup中定义是抽象函数,继承该类必须实现onLayout方法,
* 而ViewGroup的onMeasure并非必须重写的。View的放置都是根据一个矩形空间放置的,
* onLayout传下来的l,t,r,b分别是放置父控件的矩形可用空间
* (除去margin和padding的空间)的左上角的left、top以及右下角right、bottom值
*/
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {
// TODO Auto-generated method stub
View v = getChildAt(0);
// v.layout(l, t, r, b);
v.layout(260, 370, 520,900);
Log.d("yuyahao", "l: " + l+ "t: " + t+ "r: " + r+ "b: " +b+"changed: " +changed);
}
/**
* layout方法的调用:
* 该方法是View的放置方法,在View类实现。
* 调用该方法需要传入放置View的矩形空间左上角left、top值和右下角right、bottom值。
* 这四个值是相对于父控件而言的。例如传入的是(10, 10, 100, 100),
* 则该View在距离父控件的左上角位置(10, 10)处显示,
* 显示的大小是宽高是90(参数r,b是相对左上角的),这有点像绝对布局。
*/
/**
* 添加View的方法
* */
public void myAddView(){
ImageView mIcon = new ImageView(mContext);
mIcon.setImageResource(R.drawable.ic_launcher);
addView(mIcon);
}
// http://www.spasvo.com/news/html/2013517100523.html
/**
*在Android中view如何完成绘制这个过程介绍了很多,但是很多理论化的东西,最近重新整理一下,通俗的讲解一下。
  View绘制过程就好比你向银行贷款,
  在执行onMeasure的时候,好比银行告诉你大概贷款额度有多少?你根据自己的需求,进行各方面的计算,计算出一个自己大概需要的金额,然后告诉询问需要多少贷款。贷款额度好比显示空间大小。
  实际代码执行过程是这样
  onMeasure(int widthMeasureSpec, int heightMeasureSpec),其中widthMeasureSpec和heightMeasureSpec是银行告诉的大致额度。然后内部计算完成后,通过setMeasuredDimension(width, height)将实际需要的大小返回给父view。
  即onMeasure用来确定确定view显示的大小(通过调用子view的measure,来确定子view的大小)
  在执行onLayout的时候,好比银行收到你的贷款请求后,根据自身储备的情况及你的资质情况,批发了贷款的额度及领取的时间。领取的时间好比显示的起始位置,额度好比是显示空间的大小。
  实际代码执行过程是这样的
  onLayout(boolean changed, int left, int top, int right, int bottom)-确定view在父类中的显示位置,通过对子view的位置计算,通过调用子view的layout将在父类中的位置设置给子view。
  在执行dispatchDraw的时候,好比你去银行真正获取贷款,拿到你需要的钱了,签署各类合同和手续,完成你的贷款过程。
  在dispatchDraw的过程是在指定的空间内绘制你需要绘制的内容,可以通过drawChild实现内部子view的绘制。
*/

// 进过研究发现,起作用主要是:来通过调用子View的measure()方法,来确定View的大小。

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// TODO Auto-generated method stub
super.onMeasure(widthMeasureSpec, heightMeasureSpec);

final int childCount = getChildCount(); //此方法得到该布局下的所有View的个数
}

//他的作用主要是确定view在父类中的显示位置,通过子View的位置计算,条用子view的layout的得到将在复类中的位置设置给View
@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {

}

}

如果大家认真的读的话,就会知道自定义组件也是多么的简单了吧!

接下老于就教你如如自定义ViewGroup.也会在接下来的环节中如何使用onMeasure()方法,以及onLayout()方法;

我始终相信: 没有做不到的,只有想不到的。


更多相关文章

  1. LinearLayout和RelativeLayout
  2. android 使用DigestUtilsmd5加密的方法
  3. Android短信----发送流程---框架层(Frameworks)
  4. android布局 LinearLayout和RelativeLayout
  5. [Android] Android零碎知识点
  6. android 退出程序 seekbar mediaplayer
  7. Android和H5的交互
  8. Android(安卓)N画中画模式
  9. android基础(对话框风格Activity实现)

随机推荐

  1. Android(安卓)APK调用mongoose
  2. Android之网络请求3————OkHttp的拦截
  3. Android简明开发教程十九:线程 Bezier曲线
  4. android HDMI (一):HDMI基础篇
  5. Android Uri获取资源文件(多种方式)
  6. 【Android】SerialPortFinder学习笔记,显
  7. 一个支持上下滚动动画的Android TextView
  8. Android应用程序打包签名、加固、二次打
  9. Android 复盘——帮你彻底了解消息机制
  10. Android UI基础——ViewPager+Fragment