Android中自定义View的实现方式总结大全
android自定义view是什么
在我们的日常开发中,很多时候系统提供的view是无法满足我们的需求的,例如,我们想给一个edittext加上清除按钮,等等。
这时候我们就需要对系统的view进行扩展或者组合,这就是所谓的自定义view。
android自定义view的种类
自定义view大概可以分为四个大类,主要是通过实现方式来区分
1.自绘控件,继承view,重写ondraw方法,在其中进行绘制,需要自己适配边距等等
2.继承viewgroup派生的特殊layout,主要用于实现自定义布局,也需要自己适配边距等
3.继承特定的view(如textview等),不用自己适配支持wrap_conten,match_parent,可以给其加入新的功能
4.继承特定的viewgroup,例如linearlayout,多用于多个控件的组合view,也不用自己去做适配
自绘控件
这种自定义view是最复杂的一种,因为既要适配wrap_conten,match_parent又要通过条件判断来在屏幕上绘制不同的内容,主要就是重写ondraw方法
以下是一个简单的ondraw重写代码
@override protected void ondraw(canvas canvas) { super.ondraw(canvas); final int paddingleft = getpaddingleft(); final int paddingright = getpaddingright(); final int paddingtop = getpaddingtop(); final int paddingbottom = getpaddingbottom(); //get the view's width and height and decide the radiu int width = getwidth() - paddingleft - paddingright; int height = getheight() - paddingtop - paddingbottom; radiu = math.min(width , height) / 2 - boundwidth - progresswidth; //setup the paint paint.setstyle(paint.style.stroke); paint.setstrokewidth(boundwidth); paint.setcolor(color.black); //draw the inner circle int centerx = paddingleft + getwidth()/2; int centery = paddingtop + getheight() / 2; canvas.drawcircle(centerx,centery, radiu, paint); float totalradiu = radiu +boundwidth +progresswidth/2; //draw the circlr pic if (drawable != null&&bitmap == null) { image = ((bitmapdrawable) drawable).getbitmap(); bitmap = bitmap.createbitmap((int)(2*totalradiu),(int)(2*totalradiu), bitmap.config.argb_8888); canvas bitmapcanvas = new canvas(bitmap); paint bitmappaint = new paint(); bitmappaint.setantialias(true); bitmapcanvas.drawcircle(totalradiu, totalradiu, radiu, bitmappaint); bitmappaint.setxfermode(new porterduffxfermode(porterduff.mode.src_in)); bitmapcanvas.drawbitmap(image,null,new rectf(0,0,2*totalradiu,2*totalradiu) , bitmappaint); } rect rect = new rect((int)(centerx -totalradiu),(int)(centery-totalradiu),(int)(centerx+totalradiu),(int)(centery+ totalradiu)); canvas.save(); if(isrotate) canvas.rotate(rotatedegree,centerx,centery); canvas.drawbitmap(bitmap,null ,rect, paint); canvas.restore(); //set paint for arc paint.setstrokewidth(progresswidth); paint.setstrokecap(paint.cap.round); //prepare for draw arc rectf oval = new rectf(); oval.left = centerx -totalradiu ; oval.top =centery- totalradiu ; oval.right = centerx + totalradiu; oval.bottom = centery+ totalradiu; paint.setcolor(progressbackcolor); //draw background arc canvas.drawarc(oval, arcstar, arcend, false, paint); //draw progress arc paint.setcolor(progresscolor); canvas.drawarc(oval, arcstar, progress, false, paint); }
关于这个例子的完整版本,请查看另外一篇文章
继承viewgroup派生的特殊layout
主要是通过在方法中加载特定的布局,在对其内部的各个view的行为进行指定来实现。
继承特定的view(如textview等)
可以增加特定view对特定事件的响应
继承指定viewgroup的view
也是通过加载特定布局,再在其中处理view的行为来实现,大部分继承viewgroup的自定义view都可以用此方法实现,不过viewgroup的方式更接近底层。
一个简单的例子
public myview(context context, attributeset attrs) { super(context, attrs); layoutinflater inflater=(layoutinflater) context.getsystemservice(context.layout_inflater_service); inflater.inflate(r.layout.imagebtn, this); imageview=(imageview) findviewbyid(r.id.imageview1); textview=(textview)findviewbyid(r.id.textview1); }
总结
以上就是这篇文章的全部内容了,希望本文的内容对各位android开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。
推荐阅读