Android開發(fā)基于Drawable實現(xiàn)圓角矩形的方法
本文實例講述了Android開發(fā)基于Drawable實現(xiàn)圓角矩形的方法。分享給大家供大家參考,具體如下:
第一步:寫個類繼承drawable,重寫里面的方法,實現(xiàn)的核心代碼在draw里
關(guān)鍵技術(shù):BitmapShader
public BitmapShader(Bitmap bitmap,Shader.TileMode tileX,Shader.TileMode tileY)
調(diào)用這個方法來產(chǎn)生一個畫有一個位圖的渲染器(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 :如果渲染器超出原始邊界范圍,會復(fù)制范圍內(nèi)邊緣染色。
REPEAT :橫向和縱向的重復(fù)渲染器圖片,平鋪。
MIRROR :橫向和縱向的重復(fù)渲染器圖片,這個和REPEAT重復(fù)方式不一樣,他是以鏡像方式平鋪。
/** * 四種屏幕尺寸分類:: small, normal, large, and xlarge * 四種密度分類: ldpi (low), mdpi (medium), hdpi (high), and xhdpi (extra high) * 四種屏幕的DPI:ldpi是120dpi,mdpi是160dpi,hdpi是240dpi,xhdpi是320dpi * 四種屏幕對應(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的時候, * 提供一下尺寸,默認為-1可不是我們希望的 */ @Override public int getIntrinsicHeight() { return mBitmap.getHeight(); } @Override public int getIntrinsicWidth() { return mBitmap.getWidth(); } /** * 根據(jù)畫筆設(shè)定drawable的透明度 */ @Override public void setAlpha(int alpha) { mPaint.setAlpha(alpha); } /** * 根據(jù)畫筆設(shè)定drawable的顏色過濾器 */ @Override public void setColorFilter(ColorFilter cf) { mPaint.setColorFilter(cf); } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } }
第二步:實現(xiàn)類
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的時候, * 提供一下尺寸,默認為-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相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android圖形與圖像處理技巧總結(jié)》、《Android開發(fā)入門與進階教程》、《Android調(diào)試技巧與常見問題解決方法匯總》、《Android基本組件用法總結(jié)》、《Android視圖View技巧總結(jié)》、《Android布局layout技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android中一種巧妙的drawable.xml替代方案分享
- Android RippleDrawable 水波紋/漣漪效果的實現(xiàn)
- Android自定義Drawable之在Drawable中部指定透明區(qū)域方法示例
- 淺談Android中Drawable使用知識總結(jié)
- Android自定義Drawable實現(xiàn)圓角效果
- Android Bitmap和Drawable的對比
- Android Drawable和Bitmap的轉(zhuǎn)換實例詳解
- Android DrawableTextView圖片文字居中顯示實例
- Android Drawable必備知識小結(jié)
- Android drawable微技巧,你不知道的drawable細節(jié)
相關(guān)文章
Android實現(xiàn)檢測手機搖晃的監(jiān)聽器
本文給大家分享一段代碼實現(xiàn)檢測手機搖晃的監(jiān)聽器,代碼簡單易懂,非常不錯,感興趣的朋友參考下吧2016-12-12Android編程基于Contacts讀取聯(lián)系人的方法(附demo源碼)
這篇文章主要介紹了Android編程基于Contacts讀取聯(lián)系人的方法,實例分析了Contacts讀取的實現(xiàn)方法及權(quán)限設(shè)置方法,并附帶了完整實例供讀者下載參考,需要的朋友可以參考下2015-12-12Android中用onSaveInstanceState保存Fragment狀態(tài)的方法
這篇文章主要介紹了Android中用onSaveInstanceState保存Fragment狀態(tài)的方法,onSaveInstanceState可以將數(shù)據(jù)保存在Fragment或Activity中,需要的朋友可以參考下2016-04-04基于SceneForm實現(xiàn)子彈射擊(繪制子彈運行軌跡)
這篇文章主要為大家詳細介紹了基于SceneForm實現(xiàn)子彈射擊,繪制子彈運行軌跡,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-11-11Android Retrofit和Rxjava的網(wǎng)絡(luò)請求
這篇文章主要介紹了Android Retrofit和Rxjava的網(wǎng)絡(luò)請求的相關(guān)資料,需要的朋友可以參考下2017-03-03