您的位置:首页 > 其它

安卓实现圆形图片

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"
/>

实现圆形图片就是这么简单。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: