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