当前位置:首页 > 未命名 > 正文内容

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

u3blog7年前 (2017-04-25)未命名352

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);       
    } 

扫描二维码推送至手机访问。

版权声明:本文由u3blog发布,如需转载请注明出处。

本文链接:https://u3blog.xyz/?id=664

分享给朋友:

评论列表

11
11 IP:江苏省
1个月前 (08-07)

识别码:icwvtb06193BX-这游戏真不错!http://www.a5km.com/yxgl/jdqs/28774.html

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。