圓形頭像是我們在開發中經常用到的控制項,下面我們就來自定義這樣乙個控制項:
1.自定義circleimageview類繼承imageview
package com.example.qw.circleimageview;
/** * created by quwei on 2015/5/13 0013.
*/import android.content.context;
import android.graphics.bitmap;
import android.graphics.canvas;
import android.graphics.color;
import android.graphics.paint;
import android.graphics.porterduff;
import android.graphics.porterduffxfermode;
import android.graphics.rect;
import android.graphics.rectf;
import android.graphics.drawable.drawable;
import android.util.attributeset;
import android.util.log;
import android.widget.imageview;
public
class
circleimageview
extends
imageview
public
circleimageview(context paramcontext, attributeset paramattributeset)
public
circleimageview(context context, attributeset paramattributeset, int paramint)
private
boolean usedefaultstyle = false;
public
void
setusedefaultstyle(boolean usedefaultstyle)
@override
protected
void
ondraw(canvas canvas)
drawable drawable = getdrawable();
if (drawable == null)
/*** 第一種方法,使用圖層進行混合
*/drawable localdrawable = editdrawable(drawable);
drawcircleimage(canvas, localdrawable);
/*** 第二種方法,建立新的畫布,並在該畫布上進行混合,生成混合後的bitmap,
* 再將該bitmap畫回到該view的原畫布上
*/// bitmap src = ((bitmapdrawable) drawable).getbitmap();
// bitmap bitmap = createcircleimage(src);
// canvas.drawbitmap(bitmap, 0, 0, null);
// 對圓形影象進行描邊
drawborder(canvas, getwidth(), getheight());
}private
void
drawcircleimage(canvas canvas, drawable localdrawable)
canvas.drawbitmap(mask, 0, 0, paint);
canvas.restore();
}private
void
drawborder(canvas canvas, final
int width, final
int height)
if (mborderpaint == null)
rectf rectf = new rectf(0 + mborderwidth, 0 + mborderwidth,
width - mborderwidth, height - mborderwidth);
canvas.drawoval(rectf, mborderpaint);
}private drawable editdrawable(drawable localdrawable) else
return localdrawable;
}/**
* 建立圓形畫布
**@param width
*@param height
*@return
*/public bitmap createovalbitmap(final
int width, final
int height)
private bitmap createcircleimage(bitmap source) else
log.i(tag, "dwidth:" + dwidth + ",dheight:" + dheight);
return target;}}
**沒什麼好說,有難度的地方都注釋了
2.我們使用描邊的時候自定義了屬性,在value/atrr.xml檔案中加上
name="circularimage">
name="border_width"
format="dimension" />
name="border_color"
format="color" />
declare-styleable>
3.在布局檔案中使用自定義view
.example
.qw.circleimageview
.circleimageview
xmlns:def=""
android:layout_width="150dp"
android:layout_height="150dp"
android:scaletype="centercrop"
android:src="@drawable/head"
def:border_color="#f6170f"
def:border_width="2dp" />
對混合模式有疑惑的請參考大神愛哥的部落格:自定義控制項其實很簡單1/ Android自定義控制項之自定義View 二
效果如下圖 1 自定義ringview繼承view新增其構造方法並建立畫筆 public class ringview extends view protected boolean isrunning false public ringview context context public ring...
Android自定義View 自定義元件
自繪控制項也分兩種,自定義元件和自定義容器,自定義元件是繼承view類,自定義容器時繼承viewgrounp 今天主要分析下自定義元件 還是舉個例子來的實際些,假如我們要畫乙個最簡單的textview,首先想到的就是canvas.drawtext 方法,怎麼畫了?還是得一步一步來 1 寫乙個myte...
Android自定義View實現
android自定義view實現很簡單 繼承view或者其子類,重寫建構函式 ondraw,onmeasure 等函式,根據繼承的類的不同可能有所不同。如果自定義的view需要有自定義的屬性,需要在values下建立attrs.xml。在其中定義你的屬性。在使用到自定義view的xml布局檔案中需要...