編輯:關於Android編程
private void init(){
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
roundRect = new RectF(0, 0, getWidth() , getHeight());
radius = 40;
mPorterDuffXfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN) ;
}
繼承ImageView,在構造方法中調用,初始化Paint和Xfermode。
protected void onDraw(Canvas canvas) {
int sc = canvas.saveLayer(0, 0, getWidth() , getHeight(), null,
Canvas.MATRIX_SAVE_FLAG |
Canvas.CLIP_SAVE_FLAG |
Canvas.HAS_ALPHA_LAYER_SAVE_FLAG |
Canvas.FULL_COLOR_LAYER_SAVE_FLAG |
Canvas.CLIP_TO_LAYER_SAVE_FLAG);
roundRect.set(0, 0, getWidth(), getHeight());
canvas.drawRoundRect(roundRect, radius, radius, paint);
reflectSetXfermod();
super.onDraw(canvas);
canvas.restoreToCount(sc);
}
重寫ImageView的onDraw方法,通過xfermode實現圓角
private void reflectSetXfermod(){
Drawable drawable = getDrawable();
if(drawable == null){
return;
}
Class bsClass = null;
Class[] innerClasses = BitmapDrawable.class.getDeclaredClasses();
for(Class innerClass :innerClasses)
{
String name = innerClass.getName();
System.out.println("-----innerClass---"+name);
if(name.equals("android.graphics.drawable.BitmapDrawable$BitmapState"))
{
bsClass = innerClass;
}
}
if(bsClass!= null){
try {
Field mPaintField = bsClass.getDeclaredField("mPaint");
mPaintField.setAccessible(true);
ConstantState constantState = ((BitmapDrawable)drawable).getConstantState();
Paint paint = (Paint)mPaintField.get(constantState);
paint.setXfermode(mPorterDuffXfermode);
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchFieldException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
通過反射的方法將xfermode設置到BitmapDrawable 裡面的內部類BitmapState裡的對象mPaint,用來繪制圖片。
android開源庫發布到jcenter圖文詳解與填坑
相信很多人都用過開源項目,特別是android studio普及以後,使用開源庫更方便簡單。而如何上傳開源庫到jcenter供大家方便使用,雖然網上也有教程,但還是遇坑
Android ORM數據庫之GreenDao使用教程及源碼分析
一、簡介1.Android ORM介紹?在平時的開發過程中,大家一定會或多或少地接觸到 SQLite。然而在使用它時,我們往往需要做許多額外的工作,像編寫 SQL 語句與
Android init源代碼分析(2)init.rc解析
本文描述init.rc腳本解析以及執行過程,讀完本章後,讀者應能 (1) 了解init.rc解析過程 (2) 定制init.rc ini
Android Animation實戰之屏幕底部彈出PopupWindow
Android動畫的一個實戰內容,從屏幕底部滑動彈出PopupWindow。 相信這種效果大家在很多APP上都遇到過,比如需要拍照或者從SD卡選擇圖片,再比如需要分享某些