ANDROID 自定义VIEW 的相关说明
2015-05-29 12:56
316 查看
本文首先发表在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,具体不介绍了,下面有段代码:
有一个很重要的问题,这个view即使画出来了,放哪儿?放多大?
这就需要重载几个方法
如果是想简单处理的,用onsizechanged这个方法就可以
想要更好的控制view的布局,就重载 onMeasure(),如下:
有几点注意的:
padding是属于这个view的,所以要view自己处理
resolveSizeAndState()这个方法用来比较这个view计算出来的想要的宽高和onmesure传进来的宽高,进而得出这个view最终的宽高。
setMeasuredDimension(w, h);这个方法是必须要调用的,不调用会报运行时错误
参考android developer,文章适用于用过一点点自定义view的新手。
首先讲两个方法:
invalidate();
requestLayout();
这两方法用来刷新view,一旦view的属性变化一定要调用这两个方法,否则会发生意想不到的错误
自定义view一定会有ondraw,每个view都会调用这个方法,用到这个方法的时候必然用到一个canvas,一个paint
画什么由canvas决定
view怎么画由paint决定
ondraw方法的canvas参数有很多draw开头的api,具体不介绍了,下面有段代码:
[code]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(),如下:
[code]@Override protectedvoid 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); }
有几点注意的:
padding是属于这个view的,所以要view自己处理
resolveSizeAndState()这个方法用来比较这个view计算出来的想要的宽高和onmesure传进来的宽高,进而得出这个view最终的宽高。
setMeasuredDimension(w, h);这个方法是必须要调用的,不调用会报运行时错误
相关文章推荐
- Android 开发工具类 21_SAXForHandler
- Android wear的数据通讯方式之DataItems
- AndroidManifest.xml配置文件详解
- 菜鸟学Android(八):dom4j的增删改查
- Android EditText 属性汇总
- Android-应用程序基础及原理概要
- Android 开发工具类 20_DOMPersonService
- android坐标
- Android Studio 自定义Debug Keystore
- 一、android ndk环境配置
- Android studio两种方法添加jar
- Android Studio
- android之widget开发小结
- android textview分段显示不同的字体 时间 颜色
- Android电源管理-休眠简要分析
- Android 应用开发 之通过AsyncTask与ThreadPool(线程池)两种方式异步加载大量数据的分析与对比--转载
- Android中Animation 详细解读
- Android硬件抽象层(HAL)概要介绍和学习计划
- Android AsyncTask用法介绍
- Android addView动态给Activity添加View组件