Android中怎么利用Drawable實(shí)現(xiàn)圓角矩形,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括膠州網(wǎng)站建設(shè)、膠州網(wǎng)站制作、膠州網(wǎng)頁(yè)制作以及膠州網(wǎng)絡(luò)營(yíng)銷(xiāo)策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,膠州網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到膠州省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
第一步:寫(xiě)個(gè)類(lèi)繼承drawable,重寫(xiě)里面的方法,實(shí)現(xiàn)的核心代碼在draw里
關(guān)鍵技術(shù):BitmapShader
public BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)
調(diào)用這個(gè)方法來(lái)產(chǎn)生一個(gè)畫(huà)有一個(gè)位圖的渲染器(Shader)。
bitmap 在渲染器內(nèi)使用的位圖
tileX The tiling mode for x to draw the bitmap in. 在位圖上X方向渲染器平鋪模式
tileY The tiling mode for y to draw the bitmap in. 在位圖上Y方向渲染器平鋪模式
TileMode:
CLAMP :如果渲染器超出原始邊界范圍,會(huì)復(fù)制范圍內(nèi)邊緣染色。
REPEAT :橫向和縱向的重復(fù)渲染器圖片,平鋪。
MIRROR :橫向和縱向的重復(fù)渲染器圖片,這個(gè)和REPEAT重復(fù)方式不一樣,他是以鏡像方式平鋪。
/** * 四種屏幕尺寸分類(lèi):: small, normal, large, and xlarge * 四種密度分類(lèi): ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) * 四種屏幕的DPI:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi * 四種屏幕對(duì)應(yīng)density:0.75,1,1.5,2 * 四種圖片資源文件夾:drawable-ldpi,drawable-mdpi,drawable-hdpi,drawable-xhdpi */ /** * 圓角 * * @Project App_View * @Package com.android.view.drawable * @author chenlin * @version 1.0 * @Note TODO */ public class RoundImageDrawable extends Drawable { private Paint mPaint; private Bitmap mBitmap; private RectF mRectF; private int mRound; public RoundImageDrawable(Bitmap bitmap) { this.mBitmap = bitmap; mPaint = new Paint(); mPaint.setAntiAlias(true); BitmapShader shader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); mPaint.setShader(shader); } /** * 初始化區(qū)域 */ @Override public void setBounds(int left, int top, int right, int bottom) { mRectF = new RectF(left, top, right, bottom); super.setBounds(left, top, right, bottom); } /** * 核心代碼: 繪制圓角 */ @Override public void draw(Canvas canvas) { canvas.drawRoundRect(mRectF, mRound, mRound, mPaint); } /** * 暴露給外面設(shè)置圓角的大小 * * @param round */ public void setRound(int round) { this.mRound = round; } /** * getIntrinsicWidth、getIntrinsicHeight主要是為了在View使用wrap_content的時(shí)候, * 提供一下尺寸,默認(rèn)為-1可不是我們希望的 */ @Override public int getIntrinsicHeight() { return mBitmap.getHeight(); } @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); } /** * 根據(jù)畫(huà)筆設(shè)定drawable的透明度 */ @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } /** * 根據(jù)畫(huà)筆設(shè)定drawable的顏色過(guò)濾器 */ @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
第二步:實(shí)現(xiàn)類(lèi)
public class RoundActivity extends Activity { private ImageView mImageView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_round_drawable); setContentView(R.layout.activity_round_drawable); mImageView = (ImageView) findViewById(R.id.iv_round); Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa); RoundImageDrawable drawable = new RoundImageDrawable(bitmap); drawable.setRound(30); mImageView.setImageDrawable(drawable); } }
activity_round_drawable.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <ImageView android:id="@+id/iv_round" android:layout_width="wrap_content" android:layout_height="wrap_content" android:scaleType="fitXY" /> </LinearLayout>
繪制圓形圖片
核心代碼:
mWidth = Math.min(bitmap.getWidth(), bitmap.getHeight()); canvas.drawCircle(mWidth / 2, mWidth / 2, mRadius, mPaint);
/** * 圓形 * @Project App_View * @Package com.android.view.drawable * @author chenlin * @version 1.0 * @Note TODO */ public class CircleImageDrawable extends Drawable { private Bitmap mBitmap; private Paint mPaint; private int mWidth; private int mRadius; public CircleImageDrawable(Bitmap bitmap){ this.mBitmap = bitmap; mPaint.setAntiAlias(true); BitmapShader shader = new BitmapShader(mBitmap, TileMode.CLAMP, TileMode.CLAMP); mPaint.setShader(shader); mWidth = Math.min(bitmap.getWidth(), bitmap.getHeight()); mRadius = mWidth / 2; } /** * 核心代碼 */ @Override public void draw(Canvas canvas) { canvas.drawCircle(mWidth / 2, mWidth / 2, mRadius, mPaint); } /** * getIntrinsicWidth、getIntrinsicHeight主要是為了在View使用wrap_content的時(shí)候, * 提供一下尺寸,默認(rèn)為-1可不是我們希望的 */ @Override public int getIntrinsicHeight() { return mWidth; } @Override public int getIntrinsicWidth() { return mWidth; } @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
關(guān)于Android中怎么利用Drawable實(shí)現(xiàn)圓角矩形問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。
文章名稱:Android中怎么利用Drawable實(shí)現(xiàn)圓角矩形
網(wǎng)站URL:http://vcdvsql.cn/article22/pdhecc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、網(wǎng)站策劃、面包屑導(dǎo)航、App設(shè)計(jì)、外貿(mào)網(wǎng)站建設(shè)、服務(wù)器托管
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)