您好,登錄后才能下訂單哦!
這篇文章主要介紹了Android開發如何使用自定義View將圓角矩形繪制在Canvas上的方法,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
Android開發使用自定義View將圓角矩形繪制在Canvas上的方法,具體如下:
前幾天,公司一個項目中,頭像圖片需要添加圓角,這樣UI效果會更好看,于是寫了一個小的demo進行圓角的定義,該處主要是使用BitmapShader進行了渲染(如果要將一張圖片裁剪成橢圓或圓形顯示在屏幕上,也可以使用BitmapShader來完成).
BitmapShader類完成渲染圖片的基本步驟如下:
1、創建BitmapShader類的對象
/** * 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:使用重復方式
2、通過Paint的setShader(bitmapShafer)
來設置畫筆
3、使用已經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的一些基本步驟和必須實現的方法
1、繼承view
2、重寫自定義View的構造方法
3、如需要對view進行位置進行測量和重寫布局,則需要重寫onMeasure()
、onLayout()
、onDraw()
方法
onMeasure():view本身大小多少,可以測量出來
onLayout():view在ViewGroup中的位置可以決定
onDraw():定義了如何繪制該view
Android是一種基于Linux內核的自由及開放源代碼的操作系統,主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯盟領導及開發。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Android開發如何使用自定義View將圓角矩形繪制在Canvas上的方法”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。