Android开发之6步教你自定义view
来源:互联网 发布:伦敦金交易数据 编辑:程序博客网 时间:2024/05/16 14:17
如果你打算完全定制一个View,那么你需要实现View类(所有的Android View都实现于这个类),并且实现确定尺寸的onMeasure(…))方法和确认绘图的onDraw(…))方法。
效果图:
第一步:继承View,实现构造方法:
public class SmaileView extends View { private Paint mCirclePaint; //画圆脸的笔 private Paint mEyeAndMouthPaint; //画眼睛和嘴巴的笔 private float mCenterX; //x方向中心 private float mCenterY; //y方向中心 private float mRadius; //半径 private RectF mArcBounds = new RectF(); public SmaileView(Context context) { this(context,null); } public SmaileView(Context context, AttributeSet attrs) { this(context, attrs,0); } public SmaileView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaints(); }
第二步:实现画笔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); }
第三步:重写onMearsure(…)方法:
以下是一个正方形,确认它的宽和高是一样的。
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { //实现这个方法告诉了母容器如何放弃自定义View,可以通过提供的measureSpecs来决定你的View的高和宽 int w = MeasureSpec.getSize(widthMeasureSpec); int h = MeasureSpec.getSize(heightMeasureSpec); int size = Math.min(w, h); setMeasuredDimension(size, size); }
注意:这个方法需要至少保证一个setMeasuredDimension(..)调用,否则会报IllegalStateException错误。
第四步:重写onSizeChanged(…):
@Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { //这个方法是你获取View现在的宽和高. 这里我们计算的是中心和半径。 mCenterX = w / 2f; mCenterY = h / 2f; mRadius = Math.min(w,h)/2f; }
第五步:重写onDraw()方法:
这个方法提供了如何绘制view,它提供的Canvas类可以进行绘制。
@Override protected void onDraw(Canvas canvas) { //画脸 canvas.drawCircle(mCenterX,mCenterY,mRadius,mCirclePaint); //画眼睛 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); //画嘴巴 float mouthInset = mRadius / 3f; mArcBounds.set(mouthInset,mouthInset,mRadius*2 - mouthInset,mRadius*2 - mouthInset); canvas.drawArc(mArcBounds,45f,90f,false,mEyeAndMouthPaint); }
第六步:添加你的view到布局文件:
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.classical.example_view.MainActivity"> <com.classical.example_view.view.SmaileView android:layout_width="match_parent" android:layout_height="match_parent"/></RelativeLayout>
0 0
- Android开发之6步教你自定义view
- Android-6步教你自定义View
- Android-6步教你自定义View
- Android-6步教你自定义View
- Android-6步教你自定义View
- 【Android】Android开发之自定义View的功能实现详解。教你一步一步学会自定义View
- android开发之自定义View
- Android开发之自定义View
- Android学习开发 之 自定义view
- Android开发之自定义View(视图)
- Android开发之自定义View(视图)
- Android开发之自定义View(视图)
- Android开发之自定义View --详解
- Android开发笔记之自定义View
- Android开发进阶之自定义view
- Android-手把手教你自定义view
- 教你搞定Android自定义View
- 教你搞定Android自定义View
- caffe实战二:mnist训练和测试
- nm
- 记录一个使用MySql函数实现查找子节点的功能实现
- java基础
- android 监听USB连接状态
- Android开发之6步教你自定义view
- 【五年】Java打怪升级之路
- 原生JS编写popup
- 新技术跟踪
- android:configChanges属性
- Ashx+Jquery(Ajax)案例
- SQLServer学习笔记
- 直接排序
- 全志sunxi u-boot 配置过程简析