Android自定義View之圓形頭像

2021-07-02 14:04:04 字數 3394 閱讀 3355

圓形頭像是我們在開發中經常用到的控制項,下面我們就來自定義這樣乙個控制項:

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布局檔案中需要...