自定义View
2015-09-16 22:34
281 查看
自定义View
新建一个类继承自View类,在这个类中有四个构造器,我们必须重写第二个。代码如下:public MyTwoView(Context context) { super(context); } public MyTwoView(Context context, AttributeSet attrs) { super(context, attrs); }
一般画笔的初始化等造作都在第二个构造器中。
除了构造器要重写外我们还必须重写两个方法:
onMeasure()
onDraw()
onMeasure()是测量宽度和高度的。在这个方法中获得View的宽度和高度。获得方法是在super()方法中复制来的。
onDraw()是受UI主线程控制的,在这个方法中进行绘制一系列的图形。
代码如下:
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); with=getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec);//获得宽度 height=getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec);//获得高度 setMeasuredDimension(with,height); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //画圆 canvas.drawRect(with/2-100,height/2-200,with/2+100,height/2+200, recPaint); canvas.drawRect(with/2-100,height/2+200-count,with/2+100,height/2+200, RecProgressPain); // canvas.drawCircle(with/2,height/2,300,recPaint); // if(count==400){ // canvas.drawText(100+"%",with/2,height/2,textpain); // } canvas.drawText(100f*count/400+"%",with/2,height/2,textpain); }
具体的绘制图形
画笔
绘制任何图形都必须有画笔,画笔也是一个对象需要new,一般在第二个构造器中new:mpaintLine=new Paint(); //为画笔的颜色 mpaintLine.setColor(Color.RED); //画笔的宽度 mpaintLine.setStrokeWidth(10); //抗锯齿 mpaintCricle.setAntiAlias(true); //填充与否STROKE为不填充,FILL为填充 mpaintCricle.setStyle(Paint.Style.STROKE);
如果是写文字还会有mpainText.setTextSize(30);//这里设置的是文字的大小。 mpainText.setTextAlign(Paint.Align.CENTER);//为文字的居中。
旋转
注意旋转的是画布,也可以说是坐标,画布的旋转是默认是围绕坐标原点来旋转的,这里容易产生错觉,看起来觉得是图片旋转了,其实我们旋转的是画布,以后在此画布上画的东西显示出来的时候全部看起来都是旋转的。其实Roate函数有两个构造函数:
void rotate(float degrees)
void rotate (float degrees, float px, float py)
第一个构造函数直接输入旋转的度数,正数是顺时针旋转,负数指逆时针旋转,它的旋转中心点是原点(0,0)
第二个构造函数除了度数以外,还可以指定旋转的中心点坐标(px,py)
下面以第一个构造函数为例,旋转一个矩形,先画出未旋转前的图形,然后再画出旋转后的图形;
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); Paint paint_green = generatePaint(Color.GREEN, Style.FILL, 5); Paint paint_red = generatePaint(Color.RED, Style.STROKE, 5); Rect rect1 = new Rect(300,10,500,100); canvas.drawRect(rect1, paint_red); //画出原轮廓 canvas.rotate(30);//顺时针旋转画布 canvas.drawRect(rect1, paint_green);//画出旋转后的矩形 }
效果图是这样的:
这个最终屏幕显示的构造过程是这样的:
下图显示的是第一次画图合成过程,此时仅仅调用canvas.drawRect(rect1, paint_red); 画出原轮廓
然后是先将Canvas正方向依原点旋转30度,然后再与上面的屏幕合成,最后显示出我们的复合效果。
相关文章推荐
- caffe安装遇到的问题总结
- testng 失败自动截图
- CF div2 319 C
- Ember.js 入门指南——handlebars属性绑定
- visual studio 2015 搭建python开发环境,python入门到精通[三]
- HtML<select>标签
- Android 绘图基础:Canvas画布——自定义View基础(绘制表盘、矩形、圆形、弧、渐变)
- 一道简单的百度笔试题
- 自定义组件实现三种进度条
- Mysql学习笔记(三)对表数据的增删改查。
- 插件下载地址 ext
- JavaScript权威设计--JavaScript函数(简要学习笔记十)
- Java学习笔记(七)函数
- 安装与配置Oracle Warehouse Builder 11.2.0.3
- 深圳市福田区蓝特光学材料加工厂
- Laravel 在哪些地方用了 trait?
- JVM系列文章(三):Class文件内容解析
- 【原创】Android5.1 Art Hook 技术分享
- hdu2100(大数)
- 杭电acm--2040