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
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
finalintpaddingLeft=getPaddingLeft();
finalintpaddingRight=getPaddingRight();
finalintpaddingTop=getPaddingTop();
finalintpaddingBottom=getPaddingBottom();
//gettheview'swidthandheightanddecidetheradiu
intwidth=getWidth()-paddingLeft-paddingRight;
intheight=getHeight()-paddingTop-paddingBottom;
radiu=Math.min(width,height)/2-boundWidth-progressWidth;
//setupthepaint
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeWidth(boundWidth);
paint.setColor(Color.BLACK);
//drawtheinnercircle
intcenterX=paddingLeft+getWidth()/2;
intcenterY=paddingTop+getHeight()/2;
canvas.drawCircle(centerX,centerY,radiu,paint);
floattotalRadiu=radiu+boundWidth+progressWidth/2;
//drawthecirclrpic
if(drawable!=null&&bitmap==null){
image=((BitmapDrawable)drawable).getBitmap();
bitmap=Bitmap.createBitmap((int)(2*totalRadiu),(int)(2*totalRadiu),Bitmap.Config.ARGB_8888);
CanvasbitmapCanvas=newCanvas(bitmap);
PaintbitmapPaint=newPaint();
bitmapPaint.setAntiAlias(true);
bitmapCanvas.drawCircle(totalRadiu,totalRadiu,radiu,bitmapPaint);
bitmapPaint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_IN));
bitmapCanvas.drawBitmap(image,null,newRectF(0,0,2*totalRadiu,2*totalRadiu),bitmapPaint);
}
Rectrect=newRect((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();
//setpaintforarc
paint.setStrokeWidth(progressWidth);
paint.setStrokeCap(Paint.Cap.ROUND);
//preparefordrawarc
RectFoval=newRectF();
oval.left=centerX-totalRadiu;
oval.top=centerY-totalRadiu;
oval.right=centerX+totalRadiu;
oval.bottom=centerY+totalRadiu;
paint.setColor(progressBackColor);
//drawbackgroundarc
canvas.drawArc(oval,arcStar,arcEnd,false,paint);
//drawprogressarc
paint.setColor(progressColor);
canvas.drawArc(oval,arcStar,progress,false,paint);
}
关于这个例子的完整版本,请查看另外一篇文章点击这里
继承ViewGroup派生的特殊Layout
主要是通过在方法中加载特定的布局,在对其内部的各个view的行为进行指定来实现。
继承特定的View(如TextView等)
可以增加特定view对特定事件的响应
继承指定ViewGroup的view
也是通过加载特定布局,再在其中处理view的行为来实现,大部分继承ViewGroup的自定义view都可以用此方法实现,不过viewgroup的方式更接近底层。
一个简单的例子
publicMyView(Contextcontext,AttributeSetattrs){
super(context,attrs);
LayoutInflaterinflater=(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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对毛票票的支持。