Android 自定义View原理
2017-03-09 09:07
267 查看
如果你打算完全定制一个View,那么你需要实现View类(所有的Android View都实现于这个类),并且实现确定尺寸的onMeasure(…))方法和确认绘图的onDraw(…))方法。
本文一共两只画笔
实现这个方法告诉了母容器如何放弃自定义View,可以通过提供的measureSpecs来决定你的View的高和宽,以下是一个正方形,确认它的宽和高是一样的。
这个方法需要至少保证一个setMeasuredDimension(..)调用,否则会报IllegalStateException错误。
这个方法是你获取View现在的宽和高. 这里我们计算的是中心和半径。
这个方法提供了如何绘制view,它提供的Canvas类可以进行绘制。
到此就结束了,自定义View没你想的那么难
自定义View一共分为6步
第一步
public class SmileyView extends View { private Paint mCirclePaint; private Paint mEyeAndMouthPaint; private float mCenterX; private float mCenterY; private float mRadius; private RectF mArcBounds = new RectF(); public SmileyView(Context context) { this(context, null); } public SmileyView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public SmileyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaints(); } private void initPaints() {/* ... */} @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {/* ... */} @Override protected void onDraw(Canvas canvas) {/* ... */} }
2.实现画笔paint类
本文一共两只画笔private void initPaints() { mCirclePaint = new Paint(Paint.ANTI_ALIAS_FLAG); mCirclePaint.setStyle(Paint.Style.FILL); mCirclePaint.setColor(Color.YELLOW); mEyeAndMouthPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mEyeAndMouthPaint.setStyle(Paint.Style.STROKE); mEyeAndMouthPaint.setStrokeWidth(16 * getResources().getDisplayMetrics().density); mEyeAndMouthPaint.setStrokeCap(Paint.Cap.ROUND); mEyeAndMouthPaint.setColor(Color.BLACK); }
3.覆写onMeasure(…)方法
实现这个方法告诉了母容器如何放弃自定义View,可以通过提供的measureSpecs来决定你的View的高和宽,以下是一个正方形,确认它的宽和高是一样的。@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int w = MeasureSpec.getSize(widthMeasureSpec); int h = MeasureSpec.getSize(heightMeasureSpec); int size = Math.min(w, h); setMeasuredDimension(size, size); }
注意:
这个方法需要至少保证一个setMeasuredDimension(..)调用,否则会报IllegalStateException错误。
4.实现onSizeChanged(…)方法
这个方法是你获取View现在的宽和高. 这里我们计算的是中心和半径。@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { mCenterX = w / 2f; mCenterY = h / 2f; mRadius = Math.min(w, h) / 2f; }
5.实现onDraw(…)方法
这个方法提供了如何绘制view,它提供的Canvas类可以进行绘制。@Override protected void onDraw(Canvas canvas) { // draw face canvas.drawCircle(mCenterX, mCenterY, mRadius, mCirclePaint); // draw eyes float eyeRadius = mRadius / 5f; float eyeOffsetX = mRadius / 3f; float eyeOffsetY = mRadius / 3f; canvas.drawCircle(mCenterX - eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint); canvas.drawCircle(mCenterX + eyeOffsetX, mCenterY - eyeOffsetY, eyeRadius, mEyeAndMouthPaint); // draw mouth float mouthInset = mRadius /3f; mArcBounds.set(mouthInset, mouthInset, mRadius * 2 - mouthInset, mRadius * 2 - mouthInset); canvas.drawArc(mArcBounds, 45f, 90f, false, mEyeAndMouthPaint); }
6.添加你的View
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <com.example.app.SmileyView android:layout_width="match_parent" android:layout_height="match_parent" /> </FrameLayout>
到此就结束了,自定义View没你想的那么难
相关文章推荐
- android自定义view-绘制顺序及相关原理
- android基础学习之自定义view的简单原理
- android自定义View的实现原理
- Android自定义View、ViewGroup的OnMeasure的原理和模板代码
- android自定义View的绘制原理
- android自定义view–绘制顺序及相关原理
- Android读书笔记-----自定义View(1)原理
- 自定义View控件详解(一) :Android LayoutInflater原理分析,带你一步步深入了解View
- android之自定义View和ViewGroup(一)(此篇不讲述代码,只讲述原理和结构,带你走进自定义的世界)
- android初级学习之视图的绘制(自定义View的实现原理)
- android自定义view–绘制顺序及相关原理
- 自定义View很简单 - Android翻页效果原理实现之曲线的实现
- android 自定义View原理详解01
- Android 自定义view 折线翻页原理笔记
- android自定义view–绘制顺序及相关原理
- android自定义view–绘制顺序及相关原理
- 自定义View很简单 - Android翻页效果原理实现之翻页的尝试
- 自定义View很简单 - Android翻页效果原理实现之引入折线
- Android 自定义 View 之 draw 原理分析
- Android 自定义View的原理与基础