ImageView圆角
2015-06-10 14:33
239 查看
ImageView圆角
activity_main.xml
[html] view
plaincopy
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:CustomImageView="http://schemas.android.com/apk/res/com.example.customview05imageview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.example.customview05imageview.RoundImageView
android:layout_width="wrap_content"
android:layout_margin="5dp"
android:layout_height="wrap_content"
android:src="@drawable/icon" />
<ImageView
android:id="@+id/imageview"
android:layout_margin="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="circle" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:borderRadius="10dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="round" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:borderRadius="20dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="round" />
</LinearLayout>
</ScrollView>
MainActivity
[java] view
plaincopy
package com.example.customview05imageview;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity
{
private ImageView imageview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageview = (ImageView) findViewById(R.id.imageview);
Drawable drawable = getResources().getDrawable(R.drawable.icon);
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap roundCorner = toRoundCorner(bitmap, 30);
imageview.setImageBitmap(roundCorner);
}
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
//创建bitmap对象
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
//创建画笔、画布
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final int color = 0xff424242;
//创建矩形-位置
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
//圆角
final float roundPx = pixels;
paint.setAntiAlias(true);
//透明
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
CustomImageView
[java] view
plaincopy
package com.example.customview05imageview.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import com.example.customview05imageview.R;
public class CustomImageView extends View {
private int type;
private static final int TYPE_CIRCLE = 0;
private static final int TYPE_ROUND = 1;
private Bitmap mSrc;
private int mRadius;
private int mWidth;
private int mHeight;
/**
* 初始化一些自定义的参数
*/
public CustomImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomImageView(Context context) {
this(context, null);
}
public CustomImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.CustomImageView, defStyle, 0);
int n = a.getIndexCount();
// 遍历属性
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.CustomImageView_src:
mSrc = BitmapFactory.decodeResource(getResources(),
a.getResourceId(attr, 0));
break;
case R.styleable.CustomImageView_type:
// 默认为Circle--0
type = a.getInt(attr, 0);
break;
case R.styleable.CustomImageView_borderRadius:
// 转变为标准尺寸的一个函数-- 默认为10DIP
mRadius = a.getDimensionPixelSize(attr, (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
getResources().getDisplayMetrics()));
break;
}
}
a.recycle();
}
/**
* 计算控件的高度和宽度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 参数:它们指明控件可获得的空间以及关于这个空间描述的元数据 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
/**
* MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip"
* 或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
*/
if (specMode == MeasureSpec.EXACTLY)// match_parent
{
mWidth = specSize;
} else {
// 由图片决定的宽
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
/**
* 此时控件尺寸只要不超过父控件允许的最大尺寸即可
*/
mWidth = Math.min(desireByImg, specSize);
} else
mWidth = desireByImg;
}
/***
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else {
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}
setMeasuredDimension(mWidth, mHeight);
}
/**
* 绘制
*/
@Override
protected void onDraw(Canvas canvas) {
switch (type) {
case TYPE_CIRCLE:
int min = Math.min(mWidth, mHeight);
// Bitmap 创建 一个新的,缩放后的 Bitmap
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);
//在某个位置画圆
canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
break;
case TYPE_ROUND:
canvas.drawBitmap(createRoundConerImage(mSrc), 0, 0, null);
break;
}
}
/**
* 根据原图和变长绘制圆形图片
*/
private Bitmap createCircleImage(Bitmap source, int min) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
//该函数创建一个带有特定宽度、高度和颜色格式的位图
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
//产生一个同样大小的画布
Canvas canvas = new Canvas(target);
//首先绘制圆形-原心xy坐标以及半径
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
//取两层绘制交集。显示上层
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//绘制图片
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* 根据原图添加圆角
*/
private Bitmap createRoundConerImage(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
}
RoundImageView
[java] view
plaincopy
package com.example.customview05imageview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;
public class RoundImageView extends ImageView {
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundImageView(Context context) {
super(context);
init();
}
private void init() {
maskPaint.setAntiAlias(true);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//
zonePaint.setAntiAlias(true);
zonePaint.setColor(Color.RED);
//
float density = getResources().getDisplayMetrics().density;
rect_adius = rect_adius * density;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
int w = getWidth();
int h = getHeight();
roundRect.set(0, 0, w, h);
}
private final RectF roundRect = new RectF();
private float rect_adius = 20;
private final Paint maskPaint = new Paint();
private final Paint zonePaint = new Paint();
@Override
public void draw(Canvas canvas) {
canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_S***E_FLAG);
//产生一个红色的圆角矩形
canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint);
//
canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_S***E_FLAG);
super.draw(canvas);
canvas.restore();
}
}
activity_main.xml
[html] view
plaincopy
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:CustomImageView="http://schemas.android.com/apk/res/com.example.customview05imageview"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<com.example.customview05imageview.RoundImageView
android:layout_width="wrap_content"
android:layout_margin="5dp"
android:layout_height="wrap_content"
android:src="@drawable/icon" />
<ImageView
android:id="@+id/imageview"
android:layout_margin="5dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/icon" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="circle" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:borderRadius="10dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="round" />
<com.example.customview05imageview.view.CustomImageView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="10dp"
CustomImageView:borderRadius="20dp"
CustomImageView:src="@drawable/icon"
CustomImageView:type="round" />
</LinearLayout>
</ScrollView>
MainActivity
[java] view
plaincopy
package com.example.customview05imageview;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff.Mode;
import android.graphics.PorterDuffXfermode;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.widget.ImageView;
public class MainActivity extends Activity
{
private ImageView imageview;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageview = (ImageView) findViewById(R.id.imageview);
Drawable drawable = getResources().getDrawable(R.drawable.icon);
BitmapDrawable bitmapDrawable = (BitmapDrawable) drawable;
Bitmap bitmap = bitmapDrawable.getBitmap();
Bitmap roundCorner = toRoundCorner(bitmap, 30);
imageview.setImageBitmap(roundCorner);
}
public static Bitmap toRoundCorner(Bitmap bitmap, int pixels) {
//创建bitmap对象
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
//创建画笔、画布
Canvas canvas = new Canvas(output);
final Paint paint = new Paint();
final int color = 0xff424242;
//创建矩形-位置
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
final RectF rectF = new RectF(rect);
//圆角
final float roundPx = pixels;
paint.setAntiAlias(true);
//透明
canvas.drawARGB(0, 0, 0, 0);
paint.setColor(color);
canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
}
CustomImageView
[java] view
plaincopy
package com.example.customview05imageview.view;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.util.TypedValue;
import android.view.View;
import com.example.customview05imageview.R;
public class CustomImageView extends View {
private int type;
private static final int TYPE_CIRCLE = 0;
private static final int TYPE_ROUND = 1;
private Bitmap mSrc;
private int mRadius;
private int mWidth;
private int mHeight;
/**
* 初始化一些自定义的参数
*/
public CustomImageView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomImageView(Context context) {
this(context, null);
}
public CustomImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
TypedArray a = context.obtainStyledAttributes(attrs,
R.styleable.CustomImageView, defStyle, 0);
int n = a.getIndexCount();
// 遍历属性
for (int i = 0; i < n; i++) {
int attr = a.getIndex(i);
switch (attr) {
case R.styleable.CustomImageView_src:
mSrc = BitmapFactory.decodeResource(getResources(),
a.getResourceId(attr, 0));
break;
case R.styleable.CustomImageView_type:
// 默认为Circle--0
type = a.getInt(attr, 0);
break;
case R.styleable.CustomImageView_borderRadius:
// 转变为标准尺寸的一个函数-- 默认为10DIP
mRadius = a.getDimensionPixelSize(attr, (int) TypedValue
.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
getResources().getDisplayMetrics()));
break;
}
}
a.recycle();
}
/**
* 计算控件的高度和宽度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
/**
* 参数:它们指明控件可获得的空间以及关于这个空间描述的元数据 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);
/**
* MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip"
* 或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
*/
if (specMode == MeasureSpec.EXACTLY)// match_parent
{
mWidth = specSize;
} else {
// 由图片决定的宽
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
/**
* 此时控件尺寸只要不超过父控件允许的最大尺寸即可
*/
mWidth = Math.min(desireByImg, specSize);
} else
mWidth = desireByImg;
}
/***
* 设置高度
*/
specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else {
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}
setMeasuredDimension(mWidth, mHeight);
}
/**
* 绘制
*/
@Override
protected void onDraw(Canvas canvas) {
switch (type) {
case TYPE_CIRCLE:
int min = Math.min(mWidth, mHeight);
// Bitmap 创建 一个新的,缩放后的 Bitmap
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);
//在某个位置画圆
canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
break;
case TYPE_ROUND:
canvas.drawBitmap(createRoundConerImage(mSrc), 0, 0, null);
break;
}
}
/**
* 根据原图和变长绘制圆形图片
*/
private Bitmap createCircleImage(Bitmap source, int min) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
//该函数创建一个带有特定宽度、高度和颜色格式的位图
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
//产生一个同样大小的画布
Canvas canvas = new Canvas(target);
//首先绘制圆形-原心xy坐标以及半径
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
//取两层绘制交集。显示上层
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//绘制图片
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
/**
* 根据原图添加圆角
*/
private Bitmap createRoundConerImage(Bitmap source) {
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}
}
RoundImageView
[java] view
plaincopy
package com.example.customview05imageview;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.PorterDuff;
import android.graphics.PorterDuffXfermode;
import android.graphics.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;
public class RoundImageView extends ImageView {
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public RoundImageView(Context context) {
super(context);
init();
}
private void init() {
maskPaint.setAntiAlias(true);
maskPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
//
zonePaint.setAntiAlias(true);
zonePaint.setColor(Color.RED);
//
float density = getResources().getDisplayMetrics().density;
rect_adius = rect_adius * density;
}
@Override
protected void onLayout(boolean changed, int left, int top, int right,
int bottom) {
super.onLayout(changed, left, top, right, bottom);
int w = getWidth();
int h = getHeight();
roundRect.set(0, 0, w, h);
}
private final RectF roundRect = new RectF();
private float rect_adius = 20;
private final Paint maskPaint = new Paint();
private final Paint zonePaint = new Paint();
@Override
public void draw(Canvas canvas) {
canvas.saveLayer(roundRect, zonePaint, Canvas.ALL_S***E_FLAG);
//产生一个红色的圆角矩形
canvas.drawRoundRect(roundRect, rect_adius, rect_adius, zonePaint);
//
canvas.saveLayer(roundRect, maskPaint, Canvas.ALL_S***E_FLAG);
super.draw(canvas);
canvas.restore();
}
}
相关文章推荐
- Cocoapod安装使用
- MapReduce的Map side join
- 使用Python批量下载ftp服务器中的内容
- Xcode非ARC项目中设置部分文件ARC支持
- IOS 使用XIB 自定义View
- C# static
- Android手机平板两不误,使用Fragment实现兼容手机和平板的程序
- 存在hinnt属性的控件。重新hinnt的值(图片+文字)
- 在Eclipse中创建Maven多模块工程的例子
- 在Servlet(或者Filter,或者Listener)中使用spring的IOC容器
- 精心挑选的12款优秀 jQuery Ajax 分页插件和教程
- 我为什么喜欢Go语言
- 关于reset.css的那些事
- 欢迎使用CSDN-markdown编辑器
- python时间戳于时间格式字符串相互转换的方法
- weka J48决策树学习
- android Error:Execution failed for task ':app:compileDebugAidl'. > aidl is missing
- Spring学习笔记(转+改)
- xcode 编译出错 原因
- iOS下使用rsa算法与php进行加解密通讯