您好,登錄后才能下訂單哦!
這篇文章主要介紹了Android開發(fā)如何使用自定義View將圓角矩形繪制在Canvas上的方法,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Android開發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法,具體如下:
前幾天,公司一個(gè)項(xiàng)目中,頭像圖片需要添加圓角,這樣UI效果會(huì)更好看,于是寫了一個(gè)小的demo進(jìn)行圓角的定義,該處主要是使用BitmapShader進(jìn)行了渲染(如果要將一張圖片裁剪成橢圓或圓形顯示在屏幕上,也可以使用BitmapShader來完成).
BitmapShader類完成渲染圖片的基本步驟如下:
1、創(chuàng)建BitmapShader類的對(duì)象
/** * Call this to create a new shader that will draw with a bitmap. * * @param bitmap The bitmap to use inside the shader * @param tileX The tiling mode for x to draw the bitmap in. * @param tileY The tiling mode for y to draw the bitmap in. */ public BitmapShader(Bitmap bitmap, TileMode tileX, TileMode tileY) { ...... }
其中,Shader.TitleMode類型有三種,CALMP、MIRROR、REPEAT
CALMP:使用邊界顏色來填充剩余空間
MIRROR:使用鏡像方式
REPEAT:使用重復(fù)方式
2、通過Paint的setShader(bitmapShafer)
來設(shè)置畫筆
3、使用已經(jīng)setShader(bitmapShafer)
的畫筆來繪制圖形
下面展示繪制圓角圖片的demo
1、自定義RounderCornerImageView.java類
package com.example.test; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapShader; import android.graphics.Canvas; import android.graphics.Matrix; import android.graphics.Paint; import android.graphics.RectF; import android.graphics.Shader; import android.util.AttributeSet; import android.view.View; public class RounderCornerImageView extends View { private Bitmap mImage;// source bitmap private Paint mBitmapPaint;//paint private RectF mBrounds;//rect private float mRadius=20.0f;//round public RounderCornerImageView(Context context) { this(context, null); } public RounderCornerImageView(Context context, AttributeSet attrs) { this(context, attrs, 0); } public RounderCornerImageView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } private void init() { mBitmapPaint=new Paint(Paint.ANTI_ALIAS_FLAG); mBrounds=new RectF(); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO Auto-generated method stub int height,width; height=width=0; //obtain bitmap size int imageHeight,imageWidth; if (null!=mImage) { imageHeight=imageWidth=0; }else { imageHeight=mImage.getHeight(); imageWidth=mImage.getWidth(); } //obtain best measure data and set on View width=getMeasurement(widthMeasureSpec,imageWidth); height=getMeasurement(heightMeasureSpec, imageHeight); //set View last size setMeasuredDimension(width, height); } /** * measure width and height by specMode **/ private int getMeasurement(int measureSpec, int contentSize) { int specSize=MeasureSpec.getSize(measureSpec); switch (MeasureSpec.getMode(measureSpec)) { case MeasureSpec.AT_MOST: return Math.min(specSize, contentSize); case MeasureSpec.UNSPECIFIED: return contentSize; case MeasureSpec.EXACTLY: return specSize; default: return 0; }//switch } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { if (w!=oldw || h!=oldh) { int imageWidth,imageHeight; if (null==mImage) { imageWidth=imageHeight=0; }else { imageWidth=mImage.getWidth(); imageHeight=mImage.getHeight(); } //center point int left=(w-imageWidth)/2; int top=(h-imageHeight)/2; mBrounds.set(left, top, left+imageWidth, top+imageHeight); if (null!=mBitmapPaint.getShader()) { Matrix m=new Matrix(); m.setTranslate(left, top); mBitmapPaint.getShader().setLocalMatrix(m); } } } public void setImage(Bitmap bitmap) { if (mImage!=bitmap) { mImage=bitmap; if (null!=mImage) { BitmapShader shader=new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP); mBitmapPaint.setShader(shader); }else { mBitmapPaint.setShader(null); } requestLayout();//invalidated the layout of this view by onDraw() } } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (null!=mBitmapPaint) { //draw Round Rect canvas.drawRoundRect(mBrounds, mRadius, mRadius, mBitmapPaint); } } }
2、顯示圓角圖片的RoundActivity.java類
package com.example.test; import android.app.Activity; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.os.Bundle; public class RoundActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); RounderCornerImageView view=new RounderCornerImageView(this); Bitmap souBitmap=BitmapFactory.decodeResource(getResources(), R.drawable.sun); view.setImage(souBitmap); setContentView(view); } }
另外,附注下自定義View的一些基本步驟和必須實(shí)現(xiàn)的方法
1、繼承view
2、重寫自定義View的構(gòu)造方法
3、如需要對(duì)view進(jìn)行位置進(jìn)行測(cè)量和重寫布局,則需要重寫onMeasure()
、onLayout()
、onDraw()
方法
onMeasure():view本身大小多少,可以測(cè)量出來
onLayout():view在ViewGroup中的位置可以決定
onDraw():定義了如何繪制該view
Android是一種基于Linux內(nèi)核的自由及開放源代碼的操作系統(tǒng),主要使用于移動(dòng)設(shè)備,如智能手機(jī)和平板電腦,由美國(guó)Google公司和開放手機(jī)聯(lián)盟領(lǐng)導(dǎo)及開發(fā)。
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“Android開發(fā)如何使用自定義View將圓角矩形繪制在Canvas上的方法”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。