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

这篇文章主要总结了Android中自定义View的实现方式的相关资料,文中介绍的非常详细,对各位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开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对html中文网的支持。

以上就是Android中自定义View的实现方式总结大全的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 移动