安卓实现圆形图片
2016-06-07 19:26
190 查看
继承与View
package com.example.k.myqq;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by k on 2016/6/7.
*/
public class MyView extends View {
int mHeight = 0,mWidth = 0;
Bitmap bitmap = null;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
//获得src元素的地址
int attr = a.getIndex(0);
//获得元素src的值
bitmap = BitmapFactory.decodeResource(getResources(),
a.getResourceId(attr, 0));
a.recycle();
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int f = measuredWidth(widthMeasureSpec);
int g = measuredHeight(heightMeasureSpec);
setMeasuredDimension(f, g);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
bitmap = Bitmap.createScaledBitmap(bitmap, min, min, false);
canvas.drawBitmap(createCircleImage(bitmap, min), 0, 0, null);
}
//************************************************************************************************
private int measuredWidth(int widthMeasureSpec) {
int Mode = MeasureSpec.getMode(widthMeasureSpec);
int Size = MeasureSpec.getSize(widthMeasureSpec);
if (Mode == MeasureSpec.EXACTLY) {
mWidth = Size;
} else {
//由图片决定大小
int value = getPaddingLeft()+getPaddingRight()+bitmap.getWidth();
if (Mode == MeasureSpec.AT_MOST) {
//由图片和Padding决定宽度,但是不能超过View的宽
mWidth = Math.min(value,Size);
}
}
return mWidth;
}
//**********************************************************************************************
private int measuredHeight(int heightMeasureSpec) {
int Mode = MeasureSpec.getMode(heightMeasureSpec);
int Size = MeasureSpec.getSize(heightMeasureSpec);
if (Mode == MeasureSpec.EXACTLY) {
mHeight = Size;
} else {
//由图片决定高度
int intvalur1 = getPaddingTop()+getPaddingBottom()+bitmap.getHeight();
if (Mode == MeasureSpec.AT_MOST) {
//由图片和Padding决定大小,但是不能超过View的高
mHeight = Math.min(intvalur1,Size);
}
}
return mHeight;
}
private Bitmap createCircleImage(Bitmap source, int min)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN模式显示后画图的交集处
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
}
values文件夹下的attr.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="src" format="fraction"/>
</declare-styleable>
</resources>布局文件:
<com.example.k.myqq.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:src="@drawable/test"
/>
实现圆形图片就是这么简单。
package com.example.k.myqq;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
/**
* Created by k on 2016/6/7.
*/
public class MyView extends View {
int mHeight = 0,mWidth = 0;
Bitmap bitmap = null;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyView);
//获得src元素的地址
int attr = a.getIndex(0);
//获得元素src的值
bitmap = BitmapFactory.decodeResource(getResources(),
a.getResourceId(attr, 0));
a.recycle();
}
public MyView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
int f = measuredWidth(widthMeasureSpec);
int g = measuredHeight(heightMeasureSpec);
setMeasuredDimension(f, g);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
bitmap = Bitmap.createScaledBitmap(bitmap, min, min, false);
canvas.drawBitmap(createCircleImage(bitmap, min), 0, 0, null);
}
//************************************************************************************************
private int measuredWidth(int widthMeasureSpec) {
int Mode = MeasureSpec.getMode(widthMeasureSpec);
int Size = MeasureSpec.getSize(widthMeasureSpec);
if (Mode == MeasureSpec.EXACTLY) {
mWidth = Size;
} else {
//由图片决定大小
int value = getPaddingLeft()+getPaddingRight()+bitmap.getWidth();
if (Mode == MeasureSpec.AT_MOST) {
//由图片和Padding决定宽度,但是不能超过View的宽
mWidth = Math.min(value,Size);
}
}
return mWidth;
}
//**********************************************************************************************
private int measuredHeight(int heightMeasureSpec) {
int Mode = MeasureSpec.getMode(heightMeasureSpec);
int Size = MeasureSpec.getSize(heightMeasureSpec);
if (Mode == MeasureSpec.EXACTLY) {
mHeight = Size;
} else {
//由图片决定高度
int intvalur1 = getPaddingTop()+getPaddingBottom()+bitmap.getHeight();
if (Mode == MeasureSpec.AT_MOST) {
//由图片和Padding决定大小,但是不能超过View的高
mHeight = Math.min(intvalur1,Size);
}
}
return mHeight;
}
private Bitmap createCircleImage(Bitmap source, int min)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Bitmap.Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN模式显示后画图的交集处
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
}
values文件夹下的attr.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<declare-styleable name="MyView">
<attr name="src" format="fraction"/>
</declare-styleable>
</resources>布局文件:
<com.example.k.myqq.MyView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:src="@drawable/test"
/>
实现圆形图片就是这么简单。
相关文章推荐
- 51nod 1182 完美字符串
- android Webview打开、上传本地图片的解决方案 支持到5.0
- 74.VS2013和opencv3.1.0安装教程
- 函数模板与类模板
- iOS开发---常用公用方法
- 以前的老题:给小学生出十道题,并判断对了几道
- 乐学成语——显示学习列表
- [技术随笔(一)] 文件分割的两种方法
- 去掉网页中错误页面提示
- qt中的委托-简单的应用
- Linux进程管理之task_struct
- Vitamio的使用
- 在Java中如何遍历Map对象
- PROFTPD
- TopCoder SRM 637 Div2 C
- websocket 403
- 用Mockplus教你使用属性面板的设置交互状态
- Hibernate学习
- OKHttp详解
- 第15周阅读程序(6)