Android開(kāi)發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法
本文實(shí)例講述了Android開(kāi)發(fā)使用自定義View將圓角矩形繪制在Canvas上的方法。分享給大家供大家參考,具體如下:
前幾天,公司一個(gè)項(xiàng)目中,頭像圖片需要添加圓角,這樣UI效果會(huì)更好看,于是寫(xiě)了一個(gè)小的demo進(jìn)行圓角的定義,該處主要是使用BitmapShader進(jìn)行了渲染(如果要將一張圖片裁剪成橢圓或圓形顯示在屏幕上,也可以使用BitmapShader來(lái)完成).
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:使用邊界顏色來(lái)填充剩余空間
MIRROR:使用鏡像方式
REPEAT:使用重復(fù)方式
2、通過(guò)Paint的setShader(bitmapShafer)
來(lái)設(shè)置畫(huà)筆
3、使用已經(jīng)setShader(bitmapShafer)
的畫(huà)筆來(lái)繪制圖形
下面展示繪制圓角圖片的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、重寫(xiě)自定義View的構(gòu)造方法
3、如需要對(duì)view進(jìn)行位置進(jìn)行測(cè)量和重寫(xiě)布局,則需要重寫(xiě)onMeasure()
、onLayout()
、onDraw()
方法
onMeasure():view本身大小多少,可以測(cè)量出來(lái)
onLayout():view在ViewGroup中的位置可以決定
onDraw():定義了如何繪制該view
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android控件用法總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》及《Android資源操作技巧匯總》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android 自定義View的使用介紹
- Android自定義View實(shí)現(xiàn)搜索框(SearchView)功能
- Android自定義View設(shè)定到FrameLayout布局中實(shí)現(xiàn)多組件顯示的方法 分享
- Android自定義View實(shí)現(xiàn)廣告信息上下滾動(dòng)效果
- Android自定義View實(shí)現(xiàn)繪制虛線的方法詳解
- Android自定義View之自定義評(píng)價(jià)打分控件RatingBar實(shí)現(xiàn)自定義星星大小和間距
- Android自定義View實(shí)現(xiàn)loading動(dòng)畫(huà)加載效果
- Android自定義View實(shí)現(xiàn)漸變色進(jìn)度條
- Android 使用Kotlin自定義View的方法教程
- Android?自定義view中根據(jù)狀態(tài)修改drawable圖片
相關(guān)文章
Android自定義ViewGroup之實(shí)現(xiàn)FlowLayout流式布局
這篇文章主要為大家詳細(xì)介紹了Android自定義ViewGroup之實(shí)現(xiàn)FlowLayout流式布局的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06Android App開(kāi)發(fā)中創(chuàng)建Fragment組件的教程
這篇文章主要介紹了Android App開(kāi)發(fā)中創(chuàng)建Fragment的教程,Fragment是用以更靈活地構(gòu)建多屏幕界面的可UI組件,需要的朋友可以參考下2016-05-05Android 源碼淺析RecyclerView ItemAnimator
這篇文章主要為大家介紹了Android 源碼淺析RecyclerView ItemAnimator,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12Android編程實(shí)現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能示例
這篇文章主要介紹了Android編程實(shí)現(xiàn)通訊錄中聯(lián)系人的讀取,查詢,添加功能,涉及Android權(quán)限控制及通訊錄相關(guān)操作技巧,需要的朋友可以參考下2017-07-07Android中okhttp3.4.1+retrofit2.1.0實(shí)現(xiàn)離線緩存
這篇文章主要介紹了Android中okhttp3.4.1結(jié)合retrofit2.1.0實(shí)現(xiàn)離線緩存,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-10-10解決android studio 打包發(fā)現(xiàn)generate signed apk 消失不見(jiàn)問(wèn)題
這篇文章主要介紹了解決android studio 打包發(fā)現(xiàn)generate signed apk 消失不見(jiàn)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-09-09android開(kāi)發(fā)教程之開(kāi)機(jī)啟動(dòng)服務(wù)service示例
如果開(kāi)機(jī)啟動(dòng)一個(gè)Activity,開(kāi)機(jī)首先看的界面,是你的程序界面,如果為了,開(kāi)機(jī)后也啟動(dòng)你的程序,但是不顯示自己程序的界面,就要用Service服務(wù),下面是開(kāi)機(jī)啟動(dòng)服務(wù)service示例2014-03-03