Android實(shí)現(xiàn)自定義ImageView的圓角矩形圖片效果
android中的ImageView只能顯示矩形的圖片,這樣一來不能滿足我們其他的需求,比如要顯示圓角矩形的圖片,這個時候,我們就需要自定義ImageView了,其原理就是首先獲取到圖片的Bitmap,然后進(jìn)行裁剪對應(yīng)的圓角矩形的bitmap,然后在onDraw()進(jìn)行繪制圓角矩形圖片輸出。
效果圖如下:

自定義的圓形的ImageView類的實(shí)現(xiàn)代碼如下:
package com.xc.xcskin.view;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.widget.ImageView;
/**
* 自定義的圓角矩形ImageView,可以直接當(dāng)組件在布局中使用。
* @author caizhiming
*
*/
public class XCRoundRectImageView extends ImageView{
private Paint paint;
public XCRoundRectImageView(Context context) {
this(context,null);
}
public XCRoundRectImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public XCRoundRectImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
paint = new Paint();
}
/**
* 繪制圓角矩形圖片
* @author caizhiming
*/
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (null != drawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap b = getRoundBitmap(bitmap, 20);
final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
paint.reset();
canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {
super.onDraw(canvas);
}
}
/**
* 獲取圓角矩形圖片方法
* @param bitmap
* @param roundPx,一般設(shè)置成14
* @return Bitmap
* @author caizhiming
*/
private Bitmap getRoundBitmap(Bitmap bitmap, int roundPx) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
int x = bitmap.getWidth();
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
完成這個自定義類后,就可以使用這個類了,就是把這個當(dāng)組件在布局中使用即可,比如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" > <com.xc.xcskin.view.XCRoundRectImageView android:id="@+id/roundRectImageView" android:layout_centerInParent="true" android:layout_width="200dp" android:layout_height="200dp" android:src="@drawable/roundimageview" /> </RelativeLayout>
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Android開發(fā)實(shí)現(xiàn)文件關(guān)聯(lián)方法介紹
這篇文章主要介紹了Android開發(fā)實(shí)現(xiàn)文件關(guān)聯(lián)方法介紹,具有一定參考價值,需要的朋友樂意了解下。2017-10-10
Android ListView數(shù)據(jù)的分批顯示功能
本文通過實(shí)例代碼給大家分享了Android ListView數(shù)據(jù)的分批顯示功能,非常不錯具有參考借鑒價值,需要的朋友參考下吧2017-04-04
避免 Android中Context引起的內(nèi)存泄露
本文主要介紹Android中Context引起的內(nèi)存泄露的問題,這里對Context的知識做了詳細(xì)講解,說明如何避免內(nèi)存泄漏的問題,有興趣的小伙伴可以參考下2016-08-08
Android為TextView添加字體庫和設(shè)置描邊的方法
本篇文章主要介紹了Android為TextView添加字體庫和設(shè)置描邊的方法,具有一定的參考價值,有興趣的可以了解一下2017-09-09
Android開發(fā)技巧之永不關(guān)閉的Toast信息框(長時間顯示而非系統(tǒng)關(guān)閉)
Toast信息提示框之所以在顯示一定時間后會自動關(guān)閉,是因?yàn)樵谙到y(tǒng)中有一個Toast隊列;那么有些時候需要這個Toast信息提示框長時間顯示,直到需要關(guān)閉它時通過代碼來控制,而不是讓系統(tǒng)自動來關(guān)閉Toast信息提示框2013-01-01

