欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android中自定义View的实现方式总结大全

程序员文章站 2023-11-21 15:15:28
android自定义view是什么 在我们的日常开发中,很多时候系统提供的view是无法满足我们的需求的,例如,我们想给一个edittext加上清除按钮,等等。 这时候...

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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对的支持。