Android中自定義View的實現(xiàn)方式總結(jié)大全
Android自定義view是什么
在我們的日常開發(fā)中,很多時候系統(tǒng)提供的view是無法滿足我們的需求的,例如,我們想給一個edittext加上清除按鈕,等等。
這時候我們就需要對系統(tǒng)的view進(jìn)行擴(kuò)展或者組合,這就是所謂的自定義view。
Android自定義view的種類
自定義view大概可以分為四個大類,主要是通過實現(xiàn)方式來區(qū)分
1.自繪控件,繼承view,重寫onDraw方法,在其中進(jìn)行繪制,需要自己適配邊距等等
2.繼承ViewGroup派生的特殊Layout,主要用于實現(xiàn)自定義布局,也需要自己適配邊距等
3.繼承特定的View(如TextView等),不用自己適配支持wrap_conten,match_parent,可以給其加入新的功能
4.繼承特定的ViewGroup,例如linearlayout,多用于多個控件的組合view,也不用自己去做適配
自繪控件
這種自定義view是最復(fù)雜的一種,因為既要適配wrap_conten,match_parent又要通過條件判斷來在屏幕上繪制不同的內(nèi)容,主要就是重寫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); }
關(guān)于這個例子的完整版本,請查看另外一篇文章點擊這里
繼承ViewGroup派生的特殊Layout
主要是通過在方法中加載特定的布局,在對其內(nèi)部的各個view的行為進(jìn)行指定來實現(xiàn)。
繼承特定的View(如TextView等)
可以增加特定view對特定事件的響應(yīng)
繼承指定ViewGroup的view
也是通過加載特定布局,再在其中處理view的行為來實現(xiàn),大部分繼承ViewGroup的自定義view都可以用此方法實現(xiàn),不過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); }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對各位Android開發(fā)者們能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
- Android 自定義View的使用介紹
- android自定義進(jìn)度條漸變色View的實例代碼
- Android自定義View實現(xiàn)廣告信息上下滾動效果
- Android自定義View實現(xiàn)帶數(shù)字的進(jìn)度條實例代碼
- Android自定義View之酷炫圓環(huán)(二)
- Android自定義view制作絢麗的驗證碼
- Android自定義View實現(xiàn)豎直跑馬燈效果案例解析
- Android自定義View之酷炫數(shù)字圓環(huán)
- Android自定義View實現(xiàn)照片裁剪框與照片裁剪功能
- Android自定義View實現(xiàn)折線圖效果
相關(guān)文章
淺談Android獲取ImageView上的圖片,和一個有可能遇到的問題
下面小編就為大家?guī)硪黄獪\談Android獲取ImageView上的圖片,和一個有可能遇到的問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04Android計時器的三種實現(xiàn)方式(Chronometer、Timer、handler)
這篇文章主要介紹了Android計時器的三種實現(xiàn)方式,Chronometer、Timer、handler計時器的實現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11Android編程實現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果(附demo源碼)
這篇文章主要介紹了Android編程實現(xiàn)仿優(yōu)酷旋轉(zhuǎn)菜單效果的方法,較為詳細(xì)的分析了Android實現(xiàn)旋轉(zhuǎn)菜單的布局與功能實現(xiàn)技巧,并附帶完整的demo源碼供讀者下載參考,需要的朋友可以參考下2015-12-12Android利用廣播接收器實現(xiàn)自動填充短信驗證碼
這篇文章主要為大家詳細(xì)介紹了Android利用廣播接收器實現(xiàn)自動填充短信驗證碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-12-12