ANDROID 自定义VIEW 的相关说明

来源:互联网 发布:手机看电视软件 编辑:程序博客网 时间:2024/06/11 13:36

本文首先发表在http://www.hikyson.cn/archives/468

参考android developer,文章适用于用过一点点自定义view的新手。

首先讲两个方法:

  • invalidate();

  • requestLayout();

这两方法用来刷新view,一旦view的属性变化一定要调用这两个方法,否则会发生意想不到的错误

自定义view一定会有ondraw,每个view都会调用这个方法,用到这个方法的时候必然用到一个canvas,一个paint

画什么由canvas决定

view怎么画由paint决定

ondraw方法的canvas参数有很多draw开头的api,具体不介绍了,下面有段代码:

protectedvoid onDraw(Canvas canvas){    super.onDraw(canvas);// Draw the shadow    canvas.drawOval(mShadowBounds,mShadowPaint);// Draw the label text    canvas.drawText(mData.get(mCurrentItem).mLabel, mTextX, mTextY, mTextPaint);// Draw the pie slices    for(int i =0; i < mData.size();++i){        Item it = mData.get(i);        mPiePaint.setShader(it.mShader);        canvas.drawArc(mBounds,360- it.mEndAngle,it.mEndAngle - it.mStartAngle,true, mPiePaint);    }// Draw the pointer    canvas.drawLine(mTextX, mPointerY, mPointerX, mPointerY, mTextPaint);    canvas.drawCircle(mPointerX, mPointerY, mPointerSize, mTextPaint);}

有一个很重要的问题,这个view即使画出来了,放哪儿?放多大?

这就需要重载几个方法

如果是想简单处理的,用onsizechanged这个方法就可以

想要更好的控制view的布局,就重载 onMeasure(),如下:

@Overrideprotectedvoid onMeasure(int widthMeasureSpec,int heightMeasureSpec){    // Try for a width based on our minimum    int minw = getPaddingLeft()+ getPaddingRight()+ getSuggestedMinimumWidth();    // Whatever the width ends up being, ask for a height that would let the pie    int w = resolveSizeAndState(minw, widthMeasureSpec,1);    // get as big as it can    int minh =MeasureSpec.getSize(w)-(int)mTextWidth + getPaddingBottom()+ getPaddingTop();    int h = resolveSizeAndState(MeasureSpec.getSize(w)-(int)mTextWidth, heightMeasureSpec,0);    setMeasuredDimension(w, h);}

有几点注意的:

  1. padding是属于这个view的,所以要view自己处理

  2. resolveSizeAndState()这个方法用来比较这个view计算出来的想要的宽高和onmesure传进来的宽高,进而得出这个view最终的宽高。

  3. setMeasuredDimension(w, h);这个方法是必须要调用的,不调用会报运行时错误

0 0
原创粉丝点击