自定义组件<五>

大家先看一下如何来自定义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()方法;

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

androidstarjack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值