圆形头型真是越来越多了呢

不废话上代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:padding="@dimen/base_padding"
android:background="@color/light">

<com.example.radiodemo.CircleImageView
android:layout_width="160dp"
android:layout_height="160dp"
android:layout_centerInParent="true"
android:src="@drawable/demo"
app:border_width="2dp"
app:border_color="@color/dark" />

</RelativeLayout>

</LinearLayout>

=============

package com.example.radiodemo;

import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapShader;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.graphics.Paint.Align;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.Shader;
import android.graphics.SweepGradient;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.util.FloatMath;
import android.widget.ImageView;

public class CircleImageView extends ImageView {

private static final ScaleType SCALE_TYPE = ScaleType.CENTER_CROP;

private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888;
private static final int COLORDRAWABLE_DIMENSION = 2;

// 圆形边框的厚度默认值。
// 如果是0,则没有天蓝色渐变的边框。
private static final int DEFAULT_BORDER_WIDTH = 20;

private static final int DEFAULT_BORDER_COLOR = Color.BLACK;

private final RectF mDrawableRect = new RectF();
private final RectF mBorderRect = new RectF();

private final Matrix mShaderMatrix = new Matrix();
private final Paint mBitmapPaint = new Paint();
private final Paint mBorderPaint = new Paint();

private int mBorderColor = DEFAULT_BORDER_COLOR;
private int mBorderWidth = DEFAULT_BORDER_WIDTH;

private Bitmap mBitmap;
private BitmapShader mBitmapShader;
private int mBitmapWidth;
private int mBitmapHeight;

private float mDrawableRadius;
private float mBorderRadius;

private boolean mReady;
private boolean mSetupPending;
private final Paint mFlagBackgroundPaint = new Paint();
private final TextPaint mFlagTextPaint = new TextPaint();
private String mFlagText;
private boolean mShowFlag = false;
private Rect mFlagTextBounds = new Rect();

Shader mSweepGradient = null;

public CircleImageView(Context context) {
super(context);

init();
}

public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}

public CircleImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);

TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView, defStyle, 0);

mBorderWidth = a.getDimensionPixelSize(R.styleable.CircleImageView_border_width, DEFAULT_BORDER_WIDTH);
mBorderColor = a.getColor(R.styleable.CircleImageView_border_color, DEFAULT_BORDER_COLOR);

a.recycle();

mReady = true;

init();
}

private void init() {
super.setScaleType(SCALE_TYPE);
mReady = true;

if (mSetupPending) {
setup();
mSetupPending = false;
}
}

@Override
public ScaleType getScaleType() {
return SCALE_TYPE;
}

@Override
public void setScaleType(ScaleType scaleType) {
if (scaleType != SCALE_TYPE) {
throw new IllegalArgumentException(String.format(
"ScaleType %s not supported.", scaleType));
}
}

@Override
public void setAdjustViewBounds(boolean adjustViewBounds) {
if (adjustViewBounds) {
throw new IllegalArgumentException(
"adjustViewBounds not supported.");
}
}

@Override
protected void onDraw(Canvas canvas) {
if (getDrawable() == null) {
return;
}

canvas.drawCircle(getWidth() / 2, getHeight() / 2, mDrawableRadius,
mBitmapPaint);
if (mBorderWidth != 0) {
canvas.save();
canvas.rotate(20, getWidth() / 2, getHeight() / 2);
canvas.drawCircle(getWidth() / 2, getHeight() / 2, mBorderRadius,
mBorderPaint);
canvas.restore();
}

if (mShowFlag && mFlagText != null) {
canvas.drawArc(mBorderRect, 40, 100, false, mFlagBackgroundPaint);
mFlagTextPaint.getTextBounds(mFlagText, 0, mFlagText.length(),
mFlagTextBounds);
canvas.drawText(mFlagText, getWidth() / 2,
(3 + FloatMath.cos((float) (Math.PI * 5 / 18)))
* getHeight() / 4 + mFlagTextBounds.height() / 3,
mFlagTextPaint);
}

}

@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
setup();
}

public int getBorderColor() {
return mBorderColor;
}

public void setBorderColor(int borderColor) {
if (borderColor == mBorderColor) {
return;
}

mBorderColor = borderColor;
mBorderPaint.setColor(mBorderColor);
invalidate();
}

public int getBorderWidth() {
return mBorderWidth;
}

/**
* @param borderWidth
* 圆形的边框厚度。
*/
public void setBorderWidth(int borderWidth) {
if (borderWidth == mBorderWidth) {
return;
}

mBorderWidth = borderWidth;
setup();
}

@Override
public void setImageBitmap(Bitmap bm) {
super.setImageBitmap(bm);
mBitmap = bm;
setup();
}

@Override
public void setImageDrawable(Drawable drawable) {
super.setImageDrawable(drawable);
mBitmap = getBitmapFromDrawable(drawable);
setup();
}

@Override
public void setImageResource(int resId) {
super.setImageResource(resId);
mBitmap = getBitmapFromDrawable(getDrawable());
setup();
}

@Override
public void setImageURI(Uri uri) {
super.setImageURI(uri);
mBitmap = getBitmapFromDrawable(getDrawable());
setup();
}

private Bitmap getBitmapFromDrawable(Drawable drawable) {
if (drawable == null) {
return null;
}

if (drawable instanceof BitmapDrawable) {
return ((BitmapDrawable) drawable).getBitmap();
}

try {
Bitmap bitmap;

if (drawable instanceof ColorDrawable) {
bitmap = Bitmap.createBitmap(COLORDRAWABLE_DIMENSION,
COLORDRAWABLE_DIMENSION, BITMAP_CONFIG);
} else {
bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight(), BITMAP_CONFIG);
}

Canvas canvas = new Canvas(bitmap);
drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight());
drawable.draw(canvas);
return bitmap;
} catch (OutOfMemoryError e) {
return null;
}
}

private void setup() {
if (!mReady) {
mSetupPending = true;
return;
}

if (mBitmap == null) {
return;
}

mBitmapShader = new BitmapShader(mBitmap, Shader.TileMode.CLAMP,
Shader.TileMode.CLAMP);

mBitmapPaint.setAntiAlias(true);
mBitmapPaint.setShader(mBitmapShader);

mBorderPaint.setStyle(Paint.Style.STROKE);
mBorderPaint.setAntiAlias(true);
mBorderPaint.setColor(mBorderColor);
mBorderPaint.setStrokeWidth(mBorderWidth);

mBitmapHeight = mBitmap.getHeight();
mBitmapWidth = mBitmap.getWidth();

mBorderRect.set(0, 0, getWidth(), getHeight());
mBorderRadius = Math.min((mBorderRect.height() - mBorderWidth) / 2,
(mBorderRect.width() - mBorderWidth) / 2);

mDrawableRect.set(mBorderWidth, mBorderWidth, mBorderRect.width()
- mBorderWidth, mBorderRect.height() - mBorderWidth);
mDrawableRadius = Math.min(mDrawableRect.height() / 2,
mDrawableRect.width() / 2);

mFlagBackgroundPaint.setColor(Color.BLACK & 0x66FFFFFF);
mFlagBackgroundPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);

mFlagTextPaint.setFlags(TextPaint.ANTI_ALIAS_FLAG);
mFlagTextPaint.setTextAlign(Align.CENTER);
mFlagTextPaint.setColor(Color.WHITE);
mFlagTextPaint
.setTextSize(getResources().getDisplayMetrics().density * 18);

mSweepGradient = new SweepGradient(getWidth() / 2, getHeight() / 2,
new int[] { Color.rgb(255, 255, 255), Color.rgb(1, 209, 255) },
null);

mBorderPaint.setShader(mSweepGradient);

updateShaderMatrix();
invalidate();
}

private void updateShaderMatrix() {
float scale;
float dx = 0;
float dy = 0;

mShaderMatrix.set(null);

if (mBitmapWidth * mDrawableRect.height() > mDrawableRect.width()
* mBitmapHeight) {
scale = mDrawableRect.height() / (float) mBitmapHeight;
dx = (mDrawableRect.width() - mBitmapWidth * scale) * 0.5f;
} else {
scale = mDrawableRect.width() / (float) mBitmapWidth;
dy = (mDrawableRect.height() - mBitmapHeight * scale) * 0.5f;
}

mShaderMatrix.setScale(scale, scale);
mShaderMatrix.postTranslate((int) (dx + 0.5f) + mBorderWidth,
(int) (dy + 0.5f) + mBorderWidth);

mBitmapShader.setLocalMatrix(mShaderMatrix);
}

public void setShowFlag(boolean show) {
mShowFlag = show;
invalidate();
}

public void setFlagText(String text) {
mFlagText = text;
invalidate();
}
}

ok挺尸,有点流鼻血啊。。

时间: 2024-10-19 06:37:45

圆形头型真是越来越多了呢的相关文章

DUILIB圆形头象

#ifndef __UIHEADICON_H__#define __UIHEADICON_H__ /* 名称:圆形头像控件(派生CButtonUI类)*/ class CHeadUI: public CButtonUI{public: CHeadUI(); LPCTSTR GetClass() const; LPVOID GetInterface(LPCTSTR pstrName); void SetAttribute(LPCTSTR pstrName, LPCTSTR pstrValue);

建筑基坑工程设计计算与施工(一)

前 言 随着经济建设的迅猛发展,城市的高层建筑大量涌现.由于城市地价愈益昂贵,向高空发展和地下空间开发利用的趋势愈加强烈.建筑物高度越来越高,地下室层数越来越多,从而导致基坑开挖深度越来越深.这种趋势对建筑基坑的设计计算理论和施工技术提出了严峻的考验,同时也推动了我国深基坑工程设计理论和施工技术的不断发展.目前,已发展了多种符合我国国情的.实用的基坑支护方法,设计计算理论不断改进,施工工艺不断完善.与地基工程相比,深基坑工程还很不成熟,大多依靠传统的土压力理论及地区性经验进行设计与施工,结果不是

糗事百科笑话

<div class="content"> 看到吃的一瞬间,眼睛都在发光…… </div><div class="content"> 办公室一大龄剩女,经常说让别人给她介绍男朋友,刚一逗比男同事说“我去哪里给你找,你自己去网上找找吧”<br/>大龄剩女说“真爱网吗?”<br/>“不,淘宝网” </div><div class="content"> 当你们还在寻找停

OSChina 周四乱弹 —— 禅师,有些东西我放不下

周四,小小编最近都犯迷糊了,周二以为是周四,现在周四以为是周三,偶滴天啊,还是吃个早餐压压惊好了 @blindcat  :汪星人的正确使用方式 这点分量肯定是不够小小编吃的,再来个韭菜盒子? @似年  : 人分三六九等,肉有五花三层 .没有那些鱼鳖虾蟹,哪有这些花花世界.我捧你时你是个玻璃杯子,我松手时你就是个玻璃茬子.不要把自己想的多么多么牛X,再厉害的香水也干不过韭菜盒子. 反正小小编也是不用香水的,我不怕不怕啦 @测试小松鼠  :好吧,我承认我快成这样纸滴了,表示亚历山大,oh my!!!

黑板报粉笔画绘画详细教程

1.粉笔画绘画技法 (1)直接画法 直接画法是指在黑板上用粉笔直接描绘出画面的画法.此种画法是笔笔定位,环环相扣,不做重复,作画速度快,画面痛快淋漓,一气呵成,能充分发挥出粉笔线描.色点和色块塑造形象的特点.所绘制的画面层次较少,简练概括,笔触生动清晰,极具装饰性.运用直接画法,首先应对描绘物象的结构.比例.位置布局做到心中有数,其次要从整体到局部逐步进行完善,下笔时,要准确果断,依手腕弹性.力度大小和用笔角度来控制点.线.面的变化.使画面达到具有韵律的美感.直接画法运用点.线.面塑造画面形象,

面向对象设计与面向对象编程

我发现,面向对象设计,被忽视的太严重了.使用OOP语言,却不是面向对象来设计.无非就是用类写C程序而已,而且这种情况还很常见.另一种情况是过度重视类,而忽视了对象,但是对象才是根本.不过本文会以类型为主,来介绍面向对象设计. 前言 面向对象是一个完全不同于传统软件设计方式的理念,传统软件设计是以功能为主体,以功能为模块,以功能为目标.而面向对象不同,是以软件运行中的组件为主体,实现某个功能,只是恰好这些组件的交互可以间接做到.这些组件,就是对象.用面向对象来设计软件,实际上就是设计一系列的对象,

Philipp Wagner

本文大部分来自OpenCV官网上的Face Reconition with OpenCV这节内容(http://docs.opencv.org/modules/contrib/doc/facerec/facerec_tutorial.html),我尝试翻译一些重要内容.这部分内容是Philipp Wagner写的,他的github:https://github.com/bytefish,他的网站http://www.bytefish.de/,应该是个德国人.下面应该是他的照片. 友情提示,要看懂

难忘的理发经历

近日天气越来越炎热,每天早起看到耷拉在脖子周围的头发,又有了修剪的冲动.想想这么多年的理发历程,中学的一次经历最让我难忘.思绪不禁飘回青涩的中学时代-- 常言道,身体发肤,受之父母.头乃是"人之元",故头发便是"元之元".所以从前我的头发大多数时候都长长的.其实呢说长也没有多长,无奈我天性慵懒,又不喜梳头,所以我的头发让人一看到便会联想到鸡蛋的出处.在班主任多次的苦口婆心后,我大义凛然地决定改头换面去.我选了一个貌似正规的理发店.进去后,却发现店里面冷冷清清的,只有

写给十岁的清为

十年真的很快,回想你的出生情景,还是记忆犹新.由于医生说你缺氧,所以你提前了2周出生了,后来想想应该再找一个有经验的医生确诊下,如果能晚出生几天对你的身体应该会有好处.想想你刚出生时的样子,十分好笑,全身红红的,皮肤皱成一道道沟,特别是你的头型很奇怪,后脑勺尖尖的,像自行车的头盔.医生说,这是你的胎位不正,头一直没有转下来,也没有受到挤压引起的.由于胎位不正,你也没有机会享受顺产的待遇,你妈妈挨了一刀,把你剖出来的. 为什么给你起名"顾清为"?我们虽然水平有限,但是还是很用心的.你是七