android 如何把正方形图片显示圆形
作者&投稿:支制 (若有异议请与网页底部的电邮联系)
android中的imageview只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义imageview了,其原理就是首先获取到图片的bitmap,然后进行裁剪圆形的bitmap,然后在ondraw()进行绘制圆形图片输出。
在res/drawable/中设置一下矩形的圆角
<corners
android:bottomLeftRadius="@dimen/dimen_40_dip"
android:bottomRightRadius="@dimen/dimen_40_dip"
android:topLeftRadius="@dimen/dimen_40_dip"
android:topRightRadius="@dimen/dimen_40_dip" />
Android应用开发中,很多头像都要求显示成圆形的,这就可以使用android的canvas、paint这些类来进行设置圆形,先设置paint的样式为圆形,然后把你要设置成圆形的图片重新赋值给paint这个类:canvas.drawBitmap(tempBmp, rect, rect, paint);
核心代码如下(引用这位前辈:http://blog.sina.com.cn/s/blog_7607703f0101dhlj.html,我增加一些注释,原来是没有注释):
package com.liang.round;
import android.annotation.SuppressLint;
import android.content.Context;
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.Rect;
import android.view.View;
public class MyView extends View {
private Bitmap bmp = null;
private Paint paint = null;
public MyView(Context context) {
super(context);
// TODO Auto-generated constructor stub
paint = new Paint();//实例化画笔类
BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
BitmapFactory.decodeResource(context.getResources(), R.drawable.test ,options);//获得你存放在drawable下的正方形图片
options.inJustDecodeBounds = false;
Bitmap tempBmp = BitmapFactory.decodeResource(context.getResources(), R.drawable.test ,options);//实例化一个bitmap图片类
int width = options.outWidth;
int height = options.outHeight;
int size = width>height?height:width;//边框
int pos = (int)(size/2);
double radius = pos * Math.sin(45 * 180 / Math.PI);//半径
size = (int)(radius * 2);
pos = (int)(size/2);
bmp = Bitmap.createBitmap(size, size, Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);
Rect rect = new Rect(0, 0, size, size);
paint.setAntiAlias(true);
canvas.drawCircle(pos, pos, (float)radius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(tempBmp, rect, rect, paint);
tempBmp.recycle();
}
@SuppressLint("DrawAllocation")
@Override
protected void onDraw(Canvas canvas) {
// TODO Auto-generated method stub
super.onDraw(canvas);
if(bmp != null){
if(!bmp.isRecycled()){
canvas.drawBitmap(bmp, 100, 100, paint);
}
}
}
}
1. 从ImageView派生一个新的内
2. 重载ImageView方法
3. 代码如下:
/**
* 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框。
*
* @author Alan
*/
public class RoundImageView extends ImageView {
private int mBorderThickness = 0;
private Context mContext;
private int defaultColor = 0xFFFFFFFF;
// 如果只有其中一个有值,则只画一个圆形边框
private int mBorderOutsideColor = 0;
private int mBorderInsideColor = 0;
// 控件默认长、宽
private int defaultWidth = 0;
private int defaultHeight = 0;
public RoundImageView(Context context) {
super(context);
mContext = context;
}
public RoundImageView(Context context, AttributeSet attrs) {
super(context, attrs);
mContext = context;
setCustomAttributes(attrs);
}
public RoundImageView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
mContext = context;
setCustomAttributes(attrs);
}
private void setCustomAttributes(AttributeSet attrs) {
TypedArray a = mContext.obtainStyledAttributes(attrs,
R.styleable.roundedimageview);
mBorderThickness = a.getDimensionPixelSize(
R.styleable.roundedimageview_border_thickness, 0);
mBorderOutsideColor = a
.getColor(R.styleable.roundedimageview_border_outside_color,
defaultColor);
mBorderInsideColor = a.getColor(
R.styleable.roundedimageview_border_inside_color, defaultColor);
}
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (drawable == null) {
return;
}
if (getWidth() == 0 || getHeight() == 0) {
return;
}
this.measure(0, 0);
if (drawable.getClass() == NinePatchDrawable.class)
return;
Bitmap b = ((BitmapDrawable) drawable).getBitmap();
Bitmap bitmap = b.copy(Bitmap.Config.ARGB_8888, true);
if (defaultWidth == 0) {
defaultWidth = getWidth();
}
if (defaultHeight == 0) {
defaultHeight = getHeight();
}
// 保证重新读取图片后不会因为图片大小而改变控件宽、高的大小(针对宽、高为wrap_content布局的imageview,但会导致margin无效)
// if (defaultWidth != 0 && defaultHeight != 0) {
// LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
// defaultWidth, defaultHeight);
// setLayoutParams(params);
// }
int radius = 0;
if (mBorderInsideColor != defaultColor
&& mBorderOutsideColor != defaultColor) {// 定义画两个边框,分别为外圆边框和内圆边框
radius = (defaultWidth < defaultHeight ? defaultWidth
: defaultHeight) / 2 - 2 * mBorderThickness;
// 画内圆
drawCircleBorder(canvas, radius + mBorderThickness / 2,
mBorderInsideColor);
// 画外圆
drawCircleBorder(canvas, radius + mBorderThickness
+ mBorderThickness / 2, mBorderOutsideColor);
} else if (mBorderInsideColor != defaultColor
&& mBorderOutsideColor == defaultColor) {// 定义画一个边框
radius = (defaultWidth < defaultHeight ? defaultWidth
: defaultHeight) / 2 - mBorderThickness;
drawCircleBorder(canvas, radius + mBorderThickness / 2,
mBorderInsideColor);
} else if (mBorderInsideColor == defaultColor
&& mBorderOutsideColor != defaultColor) {// 定义画一个边框
radius = (defaultWidth < defaultHeight ? defaultWidth
: defaultHeight) / 2 - mBorderThickness;
drawCircleBorder(canvas, radius + mBorderThickness / 2,
mBorderOutsideColor);
} else {// 没有边框
radius = (defaultWidth < defaultHeight ? defaultWidth
: defaultHeight) / 2;
}
Bitmap roundBitmap = getCroppedRoundBitmap(bitmap, radius);
canvas.drawBitmap(roundBitmap, defaultWidth / 2 - radius, defaultHeight
/ 2 - radius, null);
}
/**
* 获取裁剪后的圆形图片
*
* @param radius
* 半径
*/
public Bitmap getCroppedRoundBitmap(Bitmap bmp, int radius) {
Bitmap scaledSrcBmp;
int diameter = radius * 2;
// 为了防止宽高不相等,造成圆形图片变形,因此截取长方形中处于中间位置最大的正方形图片
int bmpWidth = bmp.getWidth();
int bmpHeight = bmp.getHeight();
int squareWidth = 0, squareHeight = 0;
int x = 0, y = 0;
Bitmap squareBitmap;
if (bmpHeight > bmpWidth) {// 高大于宽
squareWidth = squareHeight = bmpWidth;
x = 0;
y = (bmpHeight - bmpWidth) / 2;
// 截取正方形图片
squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,
squareHeight);
} else if (bmpHeight < bmpWidth) {// 宽大于高
squareWidth = squareHeight = bmpHeight;
x = (bmpWidth - bmpHeight) / 2;
y = 0;
squareBitmap = Bitmap.createBitmap(bmp, x, y, squareWidth,
squareHeight);
} else {
squareBitmap = bmp;
}
if (squareBitmap.getWidth() != diameter
|| squareBitmap.getHeight() != diameter) {
scaledSrcBmp = Bitmap.createScaledBitmap(squareBitmap, diameter,
diameter, true);
} else {
scaledSrcBmp = squareBitmap;
}
Bitmap output = Bitmap.createBitmap(scaledSrcBmp.getWidth(),
scaledSrcBmp.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
Paint paint = new Paint();
Rect rect = new Rect(0, 0, scaledSrcBmp.getWidth(),
scaledSrcBmp.getHeight());
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
canvas.drawARGB(0, 0, 0, 0);
canvas.drawCircle(scaledSrcBmp.getWidth() / 2,
scaledSrcBmp.getHeight() / 2, scaledSrcBmp.getWidth() / 2,
paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(scaledSrcBmp, rect, rect, paint);
// bitmap回收(recycle导致在布局文件XML看不到效果)
// bmp.recycle();
// squareBitmap.recycle();
// scaledSrcBmp.recycle();
bmp = null;
squareBitmap = null;
scaledSrcBmp = null;
return output;
}
/**
* 边缘画圆
*/
private void drawCircleBorder(Canvas canvas, int radius, int color) {
Paint paint = new Paint();
/* 去锯齿 */
paint.setAntiAlias(true);
paint.setFilterBitmap(true);
paint.setDither(true);
paint.setColor(color);
/* 设置paint的 style 为STROKE:空心 */
paint.setStyle(Paint.Style.STROKE);
/* 设置paint的外框宽度 */
paint.setStrokeWidth(mBorderThickness);
canvas.drawCircle(defaultWidth / 2, defaultHeight / 2, radius, paint);
}
}
图片上边加一层 这一层要是个圆形
师使澜琪: Android应用开发中,很多头像都要求显示成圆形的,这就可以使用e69da5e887aa62616964757a686964616f31333337396238android的canvas、paint这些类来进行设置圆形,先设置paint的样式为圆形,然后把你要设置成圆形的图片重新赋值...
沙依巴克区13996063472: android中 怎么显示一直图片为圆形图片 - ?
师使澜琪: 将图片变为圆形图片,可以将系统ImageView替换成如下自定义 的view RoundImageView :/*** 圆形ImageView,可设置最多两个宽度不同且颜色不同的圆形边框.** @author Alan*/public class RoundImageView extends ImageView {...
沙依巴克区13996063472: 安卓系统什么软件可以照片加边框把长方形照片加两个白条变成正方形照片? - ?
师使澜琪: 这个很多都能加啊,比如那天我就是用应用宝找东西的时候看见一个叫魔图的就能加,你要是想用的话就是自己用应用宝找下啊,就用数据线连好手机和电脑,然后打开手机的USB调试,在应用宝里就能直接搜索安装了呢,也是挺简单的,然后各种的软件也都是有的
沙依巴克区13996063472: Android - android camera把预览做成正方形,请问如何实现的 - ?
师使澜琪: if (build.version.sdk_int// your code using camera api here - is between 1-20 } else if(build.version.sdk_int >= build.version_codes.lollipop) { // your code using camera2 api here - is api 21 or higher }
沙依巴克区13996063472: android中怎么显示图片??
师使澜琪: 方法很多,最简单的是用控件 ImageView, 设置下 src
沙依巴克区13996063472: 怎么用Android画一个正方形 - ?
师使澜琪: 先来介绍一下画几何图形要用到的,画布(Canvas)、画笔(Paint).1. 画一个圆使用的是drawCircle:canvas.drawCircle(cx, cy, radius, paint);x、y代表坐标、radius是半径、paint是画笔,就是画图的颜色;2. 在画图的时候还要有注意,你所画...
沙依巴克区13996063472: android 中如何原比例的显示图片,无缩放显示 - ?
师使澜琪: 这里面的参数你都试一下,应该有一个可以. ImageView的ScaleType属性 ImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType)属性如下:CENTER /center 按图片的原来size居中显示,当图片长/宽超过...
沙依巴克区13996063472: android中加载大图片时如何让其在屏幕上显示完全 我是用canvas.drawBitmap来画上去的 求教!!!?
师使澜琪: 你把图片绘制到矩形块里面就可以啦!像这样:RectF rect = new RectF(0,0,view.getWidth(),120);canvas.drawBitmap(bitmap, null, rect, paint);
沙依巴克区13996063472: android中怎么让一个图片或者说一个控件在页面上显示十秒之后隐藏掉.. - ?
师使澜琪: 思路:定时+隐藏按钮 定时的方案有三种:1、Handler+Thread2、Handler类自带的postDelyed3、Handler+Timer+TimerTask 这里推荐使用第二种方式比较实用简单1234567891011121314151617 handler.postDelayed(runnable, 10000); //10秒后...
沙依巴克区13996063472: 我想在Android的一个网格视图中显示图片,并对这些图片添加一个圆角矩形边框,我该怎么做? - ?
师使澜琪: 移动工具 【V】直接选取工具、组选取工具 【A】钢笔、添加锚点、删除锚点、改变路径角度 【P】添加锚点工具 【+】删除锚点工具 【-】文字、区域文字、路径文字、竖向文字、竖向区域文字、竖向路径文字 【T】椭圆、多边形...