Android学习之自定义View详解

来源:互联网 发布:阿里云虚拟机价 价格 编辑:程序博客网 时间:2024/05/16 15:54
本文和大家分享的主要是android自定义View相关内容,一起来看看吧,希望对大家学习android有所帮助。
  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(Canvascanvas) {
  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);
  CanvasbitmapCanvas = new Canvas(bitmap);
  PaintbitmapPaint = 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);
  }
  Rectrect = 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
  RectFoval = 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(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);
  }

来源:u3coding
0 0
原创粉丝点击