自定义View
来源:互联网 发布:程序员的逻辑题 编辑:程序博客网 时间:2024/06/03 11:12
自定义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度,然后再与上面的屏幕合成,最后显示出我们的复合效果。
- 自定义view
- 自定义View
- 自定义view
- 自定义View
- 自定义View
- 自定义view
- 自定义View
- 自定义view
- 自定义view
- 自定义View
- 自定义View
- 自定义view
- 自定义view
- 自定义view
- 自定义view
- 自定义view
- 自定义View
- 自定义View
- 产品设计:Android应用-开发技术【数据缓存】
- ArchLinux安装教程
- JSP九大对象:内置对象
- Android第九讲——网络(四) 文件的下载(单线程下载、多线程下载)
- caffe安装遇到的问题总结
- 自定义View
- Supermarket 并查集
- JVM系列文章(五):Javac编译与JIT编译
- 学习OC有感而发
- uva 11549 Calculator Conundrum 周期,哇!这也能过
- 开篇 奋斗
- 关于caffe安装中的一些小问题
- JavaScript原型链
- hive调用Linux的shell命令测试